FreeBSD kernel pms device code
tdsmcmnapi.c
Go to the documentation of this file.
1/*******************************************************************************
2*Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
3*
4*Redistribution and use in source and binary forms, with or without modification, are permitted provided
5*that the following conditions are met:
6*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7*following disclaimer.
8*2. Redistributions in binary form must reproduce the above copyright notice,
9*this list of conditions and the following disclaimer in the documentation and/or other materials provided
10*with the distribution.
11*
12*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20
21********************************************************************************/
22#include <sys/cdefs.h>
23__FBSDID("$FreeBSD$");
24#include <dev/pms/config.h>
25
29
33/* for TIDEBUG_MSG */
35
36#ifdef FDS_SM
37
41
42#ifdef FDS_DM
44#endif
45
46#ifdef INITIATOR_DRIVER
48#endif
49
53
54#if defined(SM_DEBUG)
55extern bit32 gSMDebugLevel;
56#endif
57
58osGLOBAL void
59smReportRemovalDirect(
61 agsaRoot_t *agRoot,
62 tdsaDeviceData_t *oneDeviceData
63 )
64{
65 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
66 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
67 bit8 PhyID;
68
69 TI_DBG2(("smReportRemovalDirect: start\n"));
70
71 PhyID = oneDeviceData->phyID;
72
73 tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
74 oneDeviceData->valid = agFALSE;
75 oneDeviceData->valid2 = agFALSE;
76 /* put onedevicedata back to free list */
77 osti_memset(&(oneDeviceData->satDevData.satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t));
78 TDLIST_DEQUEUE_THIS(&(oneDeviceData->MainLink));
79 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
80
81 /* notifying link up */
83 tiRoot,
86 (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
87 );
88#ifdef INITIATOR_DRIVER
89 /* triggers discovery */
91 tiRoot,
94 (void *) tdsaAllShared->Ports[PhyID].tiPortalContext
95 );
96#endif
97 return;
98}
99
100osGLOBAL void
101smReportRemoval(
103 agsaRoot_t *agRoot,
104 tdsaDeviceData_t *oneDeviceData,
105 tdsaPortContext_t *onePortContext
106 )
107{
108 TI_DBG2(("smReportRemoval: start\n"));
109
110 if (oneDeviceData->registered == agTRUE)
111 {
112 /*
113 1. remove this device
114 2. device removal event
115 */
116 tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
117 oneDeviceData->valid = agFALSE;
118 oneDeviceData->valid2 = agFALSE;
119 oneDeviceData->registered = agFALSE;
121 tiRoot,
122 onePortContext->tiPortalContext,
123 agNULL,
126 agNULL
127 );
128 }
129
130 return;
131}
132osGLOBAL void
133smHandleDirect(
135 agsaRoot_t *agRoot,
136 tdsaDeviceData_t *oneDeviceData,
137 void *IDdata
138 )
139{
140 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
141 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
142 agsaSATAIdentifyData_t *pSATAIdData;
143 tdList_t *DeviceListList;
144 tdsaDeviceData_t *tmpOneDeviceData = agNULL;
145 int new_device = agTRUE;
146 bit8 PhyID;
147
148 TI_DBG2(("smHandleDirect: start\n"));
149 PhyID = oneDeviceData->phyID;
150
151 pSATAIdData = (agsaSATAIdentifyData_t *)IDdata;
152 //tdhexdump("satAddSATAIDDevCB after", (bit8 *)pSATAIdData, sizeof(agsaSATAIdentifyData_t));
153
154 /* compare idenitfy device data to the exiting list */
155 DeviceListList = tdsaAllShared->MainDeviceList.flink;
156 while (DeviceListList != &(tdsaAllShared->MainDeviceList))
157 {
158 tmpOneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
159 if (tmpOneDeviceData == agNULL)
160 {
161 TI_DBG1(("smHandleDirect: tmpOneDeviceData is NULL!!!\n"));
162 return;
163 }
164 TI_DBG1(("smHandleDirect: LOOP tmpOneDeviceData %p did %d\n", tmpOneDeviceData, tmpOneDeviceData->id));
165 //tdhexdump("smHandleDirect LOOP", (bit8 *)&tmpOneDeviceData->satDevData.satIdentifyData, sizeof(agsaSATAIdentifyData_t));
166
167 /* what is unique ID for sata device -> response of identify devicedata; not really
168 Let's compare serial number, firmware version, model number
169 */
170 if ( tmpOneDeviceData->DeviceType == TD_SATA_DEVICE &&
172 pSATAIdData->serialNumber,
173 20) == 0) &&
175 pSATAIdData->firmwareVersion,
176 8) == 0) &&
178 pSATAIdData->modelNumber,
179 40) == 0)
180 )
181 {
182 TI_DBG2(("smHandleDirect: did %d\n", tmpOneDeviceData->id));
183 new_device = agFALSE;
184 break;
185 }
186 DeviceListList = DeviceListList->flink;
187 }
188
189
190 if (new_device == agFALSE)
191 {
192 TI_DBG2(("smHandleDirect: old device data\n"));
193 tmpOneDeviceData->valid = agTRUE;
194 tmpOneDeviceData->valid2 = agTRUE;
195 /* save data field from new device data */
196 tmpOneDeviceData->agRoot = agRoot;
197 tmpOneDeviceData->agDevHandle = oneDeviceData->agDevHandle;
198 tmpOneDeviceData->agDevHandle->osData = tmpOneDeviceData; /* TD layer */
199 tmpOneDeviceData->tdPortContext = oneDeviceData->tdPortContext;
200 tmpOneDeviceData->phyID = oneDeviceData->phyID;
201
202 /*
203 one SATA directly attached device per phy;
204 Therefore, deregister then register
205 */
206 saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
207
208 if (tmpOneDeviceData->registered == agFALSE)
209 {
210 TI_DBG2(("smHandleDirect: re-registering old device data\n"));
211 /* already has old information; just register it again */
212 saRegisterNewDevice( /* smHandleDirect */
213 agRoot,
214 &tmpOneDeviceData->agContext,
215 0,/*tdsaRotateQnumber(tiRoot, tmpOneDeviceData),*/
216 &tmpOneDeviceData->agDeviceInfo,
217 tmpOneDeviceData->tdPortContext->agPortContext,
218 0
219 );
220 }
221
222// tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
223 /* put tmpOneDeviceData back to free list */
224 osti_memset(&(oneDeviceData->satDevData.satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t));
225 TDLIST_DEQUEUE_THIS(&(oneDeviceData->MainLink));
226 TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
227
228 TI_DBG2(("smHandleDirect: pid %d\n", tdsaAllShared->Ports[PhyID].portContext->id));
229 /* notifying link up */
231 tiRoot,
233 tiSuccess,
234 (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
235 );
236
237
238#ifdef INITIATOR_DRIVER
239 /* triggers discovery */
241 tiRoot,
243 tiSuccess,
244 (void *) tdsaAllShared->Ports[PhyID].tiPortalContext
245 );
246#endif
247 return;
248 }
249
250 TI_DBG2(("smHandleDirect: new device data\n"));
251 oneDeviceData->satDevData.satIdentifyData = *pSATAIdData;
252 /* notifying link up */
254 tiRoot,
256 tiSuccess,
257 (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
258 );
259#ifdef INITIATOR_DRIVER
260 /* triggers discovery */
262 tiRoot,
264 tiSuccess,
265 (void *) tdsaAllShared->Ports[PhyID].tiPortalContext
266 );
267#endif
268
269 return;
270}
271
272/*
273 combine satAddSATAIDDevCB(expander) and satAddSATAIDDevCB(directly attached)
274*/
275osGLOBAL void
277 smRoot_t *smRoot,
278 smIORequest_t *smIORequest,
279 smDeviceHandle_t *smDeviceHandle,
281 void *IDdata
282 )
283{
284 tdsaRoot_t *tdsaRoot;
285 tdsaContext_t *tdsaAllShared;
287 agsaRoot_t *agRoot;
288 tdIORequestBody_t *tdIORequestBody;
289 tdsaDeviceData_t *oneDeviceData;
290 tdsaPortContext_t *onePortContext;
292 bit32 pid = 0xff;
293 bit32 IDstatus;
294 agsaSATAIdentifyData_t *pSATAIdData;
295
296 TI_DBG2(("tdsmIDCompletedCB: start\n"));
297
298 tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
299 tdsaAllShared = &(tdsaRoot->tdsaAllShared);
300 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
301 tdIORequestBody = (tdIORequestBody_t *)smIORequest->tdData;
302
303 if (smDeviceHandle == agNULL)
304 {
305 TI_DBG1(("tdsmIDCompletedCB: smDeviceHandle is NULL !!!!\n"));
307 tiRoot,
308 tdIORequestBody->osMemHandle,
309 sizeof(tdIORequestBody_t)
310 );
311 return;
312 }
313
314 oneDeviceData = (tdsaDeviceData_t *)smDeviceHandle->tdData;
315 onePortContext = oneDeviceData->tdPortContext;
316 agRoot = oneDeviceData->agRoot;
317 pid = tdIORequestBody->pid;
318
319
320// oneDeviceData->satDevData.IDDeviceValid = agFALSE;
321 oneDeviceData->satDevData.IDPending = agFALSE;
322
323 TI_DBG2(("tdsmIDCompletedCB: tdIORequestBody %p tdIORequestBody->osMemHandle %p\n", tdIORequestBody, tdIORequestBody->osMemHandle));
324
326
327 if (oneDeviceData->tdIDTimer.timerRunning == agTRUE)
328 {
331 tiRoot,
332 &oneDeviceData->tdIDTimer
333 );
334 }
335 else
336 {
338 }
339
340 if (onePortContext == agNULL)
341 {
342 TI_DBG1(("tdsmIDCompletedCB: onePortContext is NULL!!!\n"));
344 tiRoot,
345 tdIORequestBody->osMemHandle,
346 sizeof(tdIORequestBody_t)
347 );
348 return;
349 }
350
351 /* check port id */
352 if (pid != onePortContext->id)
353 {
354 TI_DBG1(("tdsmIDCompletedCB: not matching pid; pid %d onePortContext->id %d!!!\n", pid, onePortContext->id));
355 if (oneDeviceData->directlyAttached == agTRUE)
356 {
357 smReportRemovalDirect(tiRoot, agRoot, oneDeviceData);
358 }
359 else
360 {
361 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
362 }
364 tiRoot,
365 tdIORequestBody->osMemHandle,
366 sizeof(tdIORequestBody_t)
367 );
368 return;
369 }
370
371 tiPortalContext= onePortContext->tiPortalContext;
372
373 if (tiPortalContext == agNULL)
374 {
375 TI_DBG1(("tdsmIDCompletedCB: tiPortalContext is NULL!!!\n"));
376 if (oneDeviceData->directlyAttached == agTRUE)
377 {
378 smReportRemovalDirect(tiRoot, agRoot, oneDeviceData);
379 }
380 else
381 {
382 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
383 }
385 tiRoot,
386 tdIORequestBody->osMemHandle,
387 sizeof(tdIORequestBody_t)
388 );
389 return;
390 }
391
392 if (agRoot == agNULL)
393 {
394 TI_DBG1(("tdsmIDCompletedCB: agRoot is NULL!!!\n"));
396 tiRoot,
397 tdIORequestBody->osMemHandle,
398 sizeof(tdIORequestBody_t)
399 );
400 return;
401 }
402
403 if (status == smIOSuccess)
404 {
405 TI_DBG2(("tdsmIDCompletedCB: smIOSuccess\n"));
406
407 oneDeviceData->satDevData.IDDeviceValid = agTRUE;
408 if (oneDeviceData->directlyAttached == agTRUE)
409 {
410 TI_DBG2(("tdsmIDCompletedCB: directlyAttached\n"));
411 pSATAIdData = (agsaSATAIdentifyData_t *)IDdata;
412 smHandleDirect(tiRoot, agRoot, oneDeviceData, IDdata);
413 /* filling in */
414 osti_memcpy(onePortContext->remoteName, pSATAIdData->serialNumber, 20);
415 osti_memcpy(&(onePortContext->remoteName[20]), pSATAIdData->firmwareVersion, 8);
416 osti_memcpy(&(onePortContext->remoteName[28]), pSATAIdData->modelNumber, 40);
417 }
418 else /* expander attached */
419 {
420
421 TI_DBG2(("tdsmIDCompletedCB: expander attached\n"));
422
423 if (onePortContext->DiscoveryState == ITD_DSTATE_COMPLETED)
424 {
425 TI_DBG1(("tdsmIDCompletedCB: ID completed after discovery is done; tiDeviceArrival\n"));
426 /* ID data completed after discovery is completed */
428 tiRoot,
430 agNULL,
433 agNULL
434 );
435 }
436 }
437 TI_DBG2(("tdsmIDCompletedCB: tdIORequestBody %p tdIORequestBody->osMemHandle %p\n", tdIORequestBody, tdIORequestBody->osMemHandle));
439 tiRoot,
440 tdIORequestBody->osMemHandle,
441 sizeof(tdIORequestBody_t)
442 );
443
444 }
445 else if ( status == smIORetry)
446 {
447 TI_DBG1(("tdsmIDCompletedCB: smIORetry!!!\n"));
448 if ( !(oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
449 oneDeviceData->tdPortContext != agNULL)
450 )
451 {
452 TI_DBG1(("tdsmIDCompletedCB: smIORetry but device is not valid!!!\n"));
453 tdIORequestBody->reTries = 0;
454 tdIORequestBody->ioCompleted = agTRUE;
455 tdIORequestBody->ioStarted = agFALSE;
457 tiRoot,
458 tdIORequestBody->osMemHandle,
459 sizeof(tdIORequestBody_t)
460 );
461 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
462 return;
463 }
464
465 if (tdIORequestBody->reTries <= SM_RETRIES)
466 {
467 tdIORequestBody->tiIORequest = agNULL; /* not in use */
468 tdIORequestBody->pid = onePortContext->id;
469 smIORequest->tdData = tdIORequestBody;
470 smIORequest->smData = &tdIORequestBody->smIORequestBody;
471
472 smDeviceHandle->tdData = oneDeviceData;
473
474 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
475
476 IDstatus = smIDStart(smRoot,
477 smIORequest,
478 smDeviceHandle
479 );
480 if (IDstatus != SM_RC_SUCCESS)
481 {
482 /* identify device data is not valid */
483 TI_DBG1(("tdsmIDCompletedCB: smIDStart fail or busy %d!!!\n", IDstatus));
484 tdIORequestBody->reTries = 0;
485 tdIORequestBody->ioCompleted = agTRUE;
486 tdIORequestBody->ioStarted = agFALSE;
488 tiRoot,
489 tdIORequestBody->osMemHandle,
490 sizeof(tdIORequestBody_t)
491 );
492 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
493 return;
494 }
495 tdIORequestBody->reTries++;
496 tdIORequestBody->ioCompleted = agFALSE;
497 tdIORequestBody->ioStarted = agTRUE;
498 oneDeviceData->satDevData.IDPending = agTRUE;
499 /* start a timer */
500 tdIDStartTimer(tiRoot, smIORequest, oneDeviceData);
501 TI_DBG1(("tdsmIDCompletedCB: being retried!!!\n"));
502 }
503 else
504 {
505 /* give up */
506 TI_DBG1(("tdsmIDCompletedCB: retries are over!!!\n"));
507 tdIORequestBody->reTries = 0;
508 tdIORequestBody->ioCompleted = agTRUE;
509 tdIORequestBody->ioStarted = agFALSE;
511 tiRoot,
512 tdIORequestBody->osMemHandle,
513 sizeof(tdIORequestBody_t)
514 );
515 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
516 /* SATA device is not usable; remove it */
517 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
518 }
519 }
520 else if ( status == smIOSTPResourceBusy)
521 {
522 /* decides to send smp hard reset or not */
523 TI_DBG1(("tdsmIDCompletedCB: smIOSTPResourceBusy\n"));
525 tiRoot,
526 tdIORequestBody->osMemHandle,
527 sizeof(tdIORequestBody_t)
528 );
529 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
530 if (tdsaAllShared->FCA)
531 {
532 if (oneDeviceData->SMNumOfFCA <= 0) /* does SMP HARD RESET only upto one time */
533 {
534 TI_DBG1(("tdsmIDCompletedCB: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n"));
535 oneDeviceData->SMNumOfFCA++;
536 tdsaPhyControlSend(tiRoot,
537 oneDeviceData,
539 agNULL,
540 tdsaRotateQnumber(tiRoot, oneDeviceData)
541 );
542 }
543 else
544 {
545 /* given up after one time of SMP HARD RESET; */
546 TI_DBG1(("tdsmIDCompletedCB: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; but giving up sending HARD_RESET!!!\n"));
547 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
548 }
549 }
550 else
551 {
552 /* do nothing */
553 }
554 }
555 else
556 {
557 TI_DBG1(("tdsmIDCompletedCB: smIDStart fail, status 0x%x!!!\n", status));
558 TI_DBG1(("tdsmIDCompletedCB: did %d!!!\n", oneDeviceData->id));
559 if ( !(oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
560 oneDeviceData->tdPortContext != agNULL)
561 )
562 {
563 TI_DBG1(("tdsmIDCompletedCB: fail but device is not valid!!!\n"));
564 tdIORequestBody->reTries = 0;
565 tdIORequestBody->ioCompleted = agTRUE;
566 tdIORequestBody->ioStarted = agFALSE;
568 tiRoot,
569 tdIORequestBody->osMemHandle,
570 sizeof(tdIORequestBody_t)
571 );
572 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
573 return;
574 }
575 tdsaAllShared->IDRetry = agTRUE;
576 if (tdsaAllShared->IDRetry)
577 {
578 if (tdIORequestBody->reTries <= SM_RETRIES)
579 {
580 tdIORequestBody->tiIORequest = agNULL; /* not in use */
581 tdIORequestBody->pid = onePortContext->id;
582 smIORequest->tdData = tdIORequestBody;
583 smIORequest->smData = &tdIORequestBody->smIORequestBody;
584
585 smDeviceHandle->tdData = oneDeviceData;
586 IDstatus = smIDStart(smRoot,
587 smIORequest,
588 smDeviceHandle
589 );
590 if (IDstatus != SM_RC_SUCCESS)
591 {
592 /* identify device data is not valid */
593 TI_DBG1(("tdsmIDCompletedCB: smIDStart fail or busy %d!!!\n", IDstatus));
594 tdIORequestBody->reTries = 0;
595 tdIORequestBody->ioCompleted = agTRUE;
596 tdIORequestBody->ioStarted = agFALSE;
598 tiRoot,
599 tdIORequestBody->osMemHandle,
600 sizeof(tdIORequestBody_t)
601 );
602 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
603 if (oneDeviceData->directlyAttached == agTRUE)
604 {
605 smReportRemovalDirect(tiRoot, agRoot, oneDeviceData);
606 }
607 else
608 {
609 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
610 }
611 return;
612 }
613 tdIORequestBody->reTries++;
614 tdIORequestBody->ioCompleted = agFALSE;
615 tdIORequestBody->ioStarted = agTRUE;
616 oneDeviceData->satDevData.IDPending = agTRUE;
617 /* start a timer */
618 tdIDStartTimer(tiRoot, smIORequest, oneDeviceData);
619 TI_DBG1(("tdsmIDCompletedCB: being retried!!!\n"));
620 }
621 else
622 {
623 /* give up */
624 TI_DBG1(("tdsmIDCompletedCB: retries are over; sending hard reset!!!\n"));
625 tdIORequestBody->reTries = 0;
626 tdIORequestBody->ioCompleted = agTRUE;
627 tdIORequestBody->ioStarted = agFALSE;
629 tiRoot,
630 tdIORequestBody->osMemHandle,
631 sizeof(tdIORequestBody_t)
632 );
633 oneDeviceData->satDevData.IDDeviceValid = agFALSE;
634
635 if (oneDeviceData->SMNumOfID <= 0) /* does SMP HARD RESET only upto one time */
636 {
637 TI_DBG1(("tdsmIDCompletedCB: fail; sending HARD_RESET\n"));
638 oneDeviceData->SMNumOfID++;
639 if (oneDeviceData->directlyAttached == agTRUE)
640 {
641 saLocalPhyControl(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), oneDeviceData->phyID, AGSA_PHY_HARD_RESET, agNULL);
642 }
643 else
644 {
645 tdsaPhyControlSend(tiRoot,
646 oneDeviceData,
648 agNULL,
649 tdsaRotateQnumber(tiRoot, oneDeviceData)
650 );
651 }
652 }
653 else
654 {
655 /* given up after one time of SMP HARD RESET; */
656 TI_DBG1(("tdsmIDCompletedCB: fail; but giving up sending HARD_RESET!!!\n"));
657 if (oneDeviceData->directlyAttached == agTRUE)
658 {
659 smReportRemovalDirect(tiRoot, agRoot, oneDeviceData);
660 }
661 else
662 {
663 smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
664 }
665 }
666 }
667 }
668 else
669 {
670 /* do nothing */
671 }
672
673
674 }
675
676
677 return;
678}
679
680FORCEINLINE void
682 smRoot_t *smRoot,
683 smIORequest_t *smIORequest,
685 bit32 statusDetail,
686 smSenseData_t *senseData,
687 bit32 interruptContext
688 )
689{
690 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
691 tdsaContext_t *tdsaAllShared = &(tdsaRoot->tdsaAllShared);
692 tiRoot_t *tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
693 tdIORequestBody_t *tdIORequestBody = (tdIORequestBody_t *)smIORequest->tdData;
694 tiIORequest_t *tiIORequest = tdIORequestBody->tiIORequest;
695
696 tdsaDeviceData_t *oneDeviceData;
698 smDeviceHandle_t *smDeviceHandle;
699 smScsiInitiatorRequest_t *smSCSIRequest;
700 smSuperScsiInitiatorRequest_t *smSuperSCSIRequest;
701
702 bit32 SMStatus = SM_RC_FAILURE;
703
704
705 TI_DBG5(("tdsmIOCompletedCB: start\n"));
706
707 if (status == smIOSuccess)
708 {
711 status,
712 statusDetail,
713 (tiSenseData_t *)senseData,
714 interruptContext);
715 }
716 else if (status == smIORetry)
717 {
718 TI_DBG1(("tdsmIOCompletedCB: smIORetry!!!\n"));
719 smIORequest = (smIORequest_t *)&(tdIORequestBody->smIORequest);
720 tiDeviceHandle = tdIORequestBody->tiDevHandle;
721 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
722
723 if (! (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
724 oneDeviceData->tdPortContext != agNULL)
725 )
726 {
727 TI_DBG1(("tdsmIOCompletedCB: smIORetry but device is not valid!!!\n"));
728 tdIORequestBody->reTries = 0;
729 tdIORequestBody->ioCompleted = agTRUE;
730 tdIORequestBody->ioStarted = agFALSE;
733 status,
734 statusDetail,
735 (tiSenseData_t *)senseData,
736 interruptContext);
737 return;
738 }
739 if (tdIORequestBody->reTries <= SM_RETRIES)
740 {
741 smDeviceHandle = (smDeviceHandle_t *)&(oneDeviceData->smDeviceHandle);
742 if (tdIORequestBody->superIOFlag == agTRUE)
743 {
744 smSuperSCSIRequest = (smSuperScsiInitiatorRequest_t *)&(tdIORequestBody->SM.smSuperSCSIRequest);
745 SMStatus = smSuperIOStart(smRoot,
746 smIORequest,
747 smDeviceHandle,
748 smSuperSCSIRequest,
749 oneDeviceData->SASAddressID.sasAddressHi,
750 oneDeviceData->SASAddressID.sasAddressLo,
751 interruptContext);
752 }
753 else
754 {
755 smSCSIRequest = (smScsiInitiatorRequest_t *)&(tdIORequestBody->SM.smSCSIRequest);
756 SMStatus = smIOStart(smRoot,
757 smIORequest,
758 smDeviceHandle,
759 smSCSIRequest,
760 interruptContext);
761 }
762
763
764 if (SMStatus != SM_RC_SUCCESS)
765 {
766 TI_DBG1(("tdsmIOCompletedCB: smIDStart fail or busy %d!!!\n", SMStatus));
767 tdIORequestBody->reTries = 0;
768 tdIORequestBody->ioCompleted = agTRUE;
769 tdIORequestBody->ioStarted = agFALSE;
772 status,
773 statusDetail,
774 (tiSenseData_t *)senseData,
775 interruptContext);
776 return;
777 }
778 else
779 {
780 TI_DBG1(("tdsmIOCompletedCB: being retried!!!\n"));
781 tdIORequestBody->reTries++;
782 tdIORequestBody->ioCompleted = agFALSE;
783 tdIORequestBody->ioStarted = agTRUE;
784 }
785 }
786 else
787 {
788 /* give up; complete IO */
789 TI_DBG1(("tdsmIOCompletedCB: retries are over!!!\n"));
790 tdIORequestBody->reTries = 0;
791 tdIORequestBody->ioCompleted = agTRUE;
792 tdIORequestBody->ioStarted = agFALSE;
795 status,
796 statusDetail,
797 (tiSenseData_t *)senseData,
798 interruptContext);
799 return;
800 }
801
802 }
803 else if ( status == smIOSTPResourceBusy)
804 {
805 /* decides to send smp hard reset or not */
806 TI_DBG1(("tdsmIOCompletedCB: smIOSTPResourceBusy\n"));
807 if (tdsaAllShared->FCA)
808 {
809 smIORequest = (smIORequest_t *)&(tdIORequestBody->smIORequest);
810 tiDeviceHandle = tdIORequestBody->tiDevHandle;
811 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
812 if (oneDeviceData->SMNumOfFCA <= 0) /* does SMP HARD RESET only upto one time */
813 {
814 TI_DBG1(("tdsmIOCompletedCB: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n"));
815 oneDeviceData->SMNumOfFCA++;
816 tdsaPhyControlSend(tiRoot,
817 oneDeviceData,
819 agNULL,
820 tdsaRotateQnumber(tiRoot, oneDeviceData)
821 );
822 }
823 else
824 {
825 /* given up after one time of SMP HARD RESET; */
826 TI_DBG1(("tdsmIOCompletedCB: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; but giving up sending HARD_RESET!!!\n"));
827 }
828 }
831 status,
832 statusDetail,
833 (tiSenseData_t *)senseData,
834 interruptContext);
835 return;
836 }
837 else
838 {
839 if (statusDetail == smDetailAborted)
840 {
841 tiDeviceHandle = tdIORequestBody->tiDevHandle;
842 oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
843 TI_DBG1(("tdsmIOCompletedCB: agIOStatus = OSSA_IO_ABORTED did %d\n", oneDeviceData->id));
844 }
847 status,
848 statusDetail,
849 (tiSenseData_t *)senseData,
850 interruptContext);
851 }
852
853 return;
854}
855
856/* completion of taskmanagement
857osGLOBAL void ostiInitiatorEvent (
858 tiRoot_t *tiRoot,
859 tiPortalContext_t *portalContext,
860 tiDeviceHandle_t *tiDeviceHandle,
861 tiIntrEventType_t eventType,
862 bit32 eventStatus,
863 void *parm
864 );
865
866*/
867//qqq1
868osGLOBAL void
870 smRoot_t *smRoot,
871 smDeviceHandle_t *smDeviceHandle,
872 smIntrEventType_t eventType,
873 bit32 eventStatus,
874 void *parm
875 )
876{
877 tdsaRoot_t *tdsaRoot;
878 tdsaContext_t *tdsaAllShared;
880 tdIORequestBody_t *tdIORequestBody;
881 smIORequest_t *SMcurrentTaskTag;
882 tiIORequest_t *currentTaskTag;
883 tdsaDeviceData_t *oneDeviceData;
884 void *osMemHandle;
885 tdsaPortContext_t *onePortContext;
886 tiPortalContext_t *tiportalContext;
888
889 /* be sure to free using tdIORequestBody->->IOType.InitiatorTMIO.osMemHandle but how???
890 parm = pSatDevData->satTmTaskTag (currentTaskTag in tiINITaskManagement)
891 In this case, parm is smIORequest_t
892 */
893
894 TI_DBG2(("tdsmEventCB: start\n"));
895
896 tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
897 tdsaAllShared = &(tdsaRoot->tdsaAllShared);
898 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
899
900
901 if (eventType == smIntrEventTypeLocalAbort)
902 {
903 oneDeviceData = (tdsaDeviceData_t *)smDeviceHandle->tdData;
904 if (oneDeviceData == agNULL)
905 {
906 TI_DBG1(("tdsmEventCB: oneDeviceData is NULL\n"));
907 return;
908 }
909 else
910 {
911 tiDeviceHandle = &(oneDeviceData->tiDeviceHandle);
912 if (oneDeviceData->OSAbortAll == agTRUE)
913 {
914 oneDeviceData->OSAbortAll = agFALSE;
916 agNULL,
919 tiAbortOK,
920 agNULL);
921 }
922 }
923 }
924 else
925 {
926
927 SMcurrentTaskTag = (smIORequest_t *)parm;
928 if (SMcurrentTaskTag == agNULL)
929 {
930 TI_DBG1(("tdsmEventCB: SMcurrentTaskTag is NULL!!!\n"));
931 return;
932 }
933
934 tdIORequestBody = (tdIORequestBody_t *)SMcurrentTaskTag->tdData;
935 if (tdIORequestBody == agNULL)
936 {
937 TI_DBG1(("tdsmEventCB: tdIORequestBody is NULL!!!\n"));
938 return;
939 }
940
941 osMemHandle = tdIORequestBody->IOType.InitiatorTMIO.osMemHandle;
942 currentTaskTag = tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag;
943
944
945 oneDeviceData = (tdsaDeviceData_t *)smDeviceHandle->tdData;
946 if (oneDeviceData == agNULL)
947 {
948 TI_DBG1(("tdsmEventCB: oneDeviceData is NULL!!!\n"));
949 return;
950 }
951
952 tiDeviceHandle = &(oneDeviceData->tiDeviceHandle);
953 onePortContext = oneDeviceData->tdPortContext;
954 if (onePortContext == agNULL)
955 {
956 TI_DBG1(("tdsmEventCB: onePortContext is NULL!!!\n"));
957 return;
958 }
959 tiportalContext = onePortContext->tiPortalContext;
960
961 /* free tdIORequestBody */
963 tiRoot,
964 osMemHandle,
965 sizeof(tdIORequestBody_t)
966 );
967
968
969 TI_DBG2(("tdsmEventCB: calling ostiInitiatorEvent\n"));
971 tiRoot,
972 tiportalContext,
974 eventType,
975 eventStatus,
976 (void *)currentTaskTag
977 );
978
979
980 /* completion of taskmanagement
981 osGLOBAL void ostiInitiatorEvent (
982 tiRoot_t *tiRoot,
983 tiPortalContext_t *portalContext,
984 tiDeviceHandle_t *tiDeviceHandle,
985 tiIntrEventType_t eventType,
986 bit32 eventStatus,
987 void *parm
988 );
989
990
991 ostiFreeAlloc()
992 */
993
994 }
995
996 return;
997}
998
999
1000FORCEINLINE void
1002 smRoot_t *smRoot,
1003 bit32 syncLockId
1004 )
1005{
1006 tdsaRoot_t *tdsaRoot;
1007 tdsaContext_t *tdsaAllShared;
1009 bit32 offset = 0;
1010
1011 TI_DBG7(("tdsmSingleThreadedEnter: start\n"));
1012
1013 tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
1014 if (tdsaRoot == agNULL)
1015 {
1016 TI_DBG1(("tdsmSingleThreadedEnter: tdsaRoot is NULL\n"));
1017 return;
1018 }
1019
1020 tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1021 if (tdsaAllShared == agNULL)
1022 {
1023 TI_DBG1(("tdsmSingleThreadedEnter: tdsaAllShared is NULL\n"));
1024 return;
1025 }
1026
1027 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1028 if (tiRoot == agNULL)
1029 {
1030 TI_DBG1(("tdsmSingleThreadedEnter: tiRoot is NULL\n"));
1031 return;
1032 }
1033
1034 offset = tdsaAllShared->MaxNumLLLocks + tdsaAllShared->MaxNumOSLocks + TD_MAX_LOCKS + tdsaAllShared->MaxNumDMLocks;
1035
1036 ostiSingleThreadedEnter(tiRoot, syncLockId + offset);
1037
1038 return;
1039}
1040
1041FORCEINLINE void
1043 smRoot_t *smRoot,
1044 bit32 syncLockId
1045 )
1046{
1047 tdsaRoot_t *tdsaRoot;
1048 tdsaContext_t *tdsaAllShared;
1050 bit32 offset = 0;
1051
1052 TI_DBG7(("tdsmSingleThreadedLeave: start\n"));
1053
1054 tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
1055 if (tdsaRoot == agNULL)
1056 {
1057 TI_DBG1(("tdsmSingleThreadedLeave: tdsaRoot is NULL\n"));
1058 return;
1059 }
1060
1061 tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1062 if (tdsaAllShared == agNULL)
1063 {
1064 TI_DBG1(("tdsmSingleThreadedLeave: tdsaAllShared is NULL\n"));
1065 return;
1066 }
1067
1068 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1069 if (tiRoot == agNULL)
1070 {
1071 TI_DBG1(("tdsmSingleThreadedLeave: tiRoot is NULL\n"));
1072 return;
1073 }
1074 offset = tdsaAllShared->MaxNumLLLocks + tdsaAllShared->MaxNumOSLocks + TD_MAX_LOCKS + tdsaAllShared->MaxNumDMLocks;
1075
1076 ostiSingleThreadedLeave(tiRoot, syncLockId + offset);
1077
1078 return;
1079}
1080
1083 smRoot_t *smRoot,
1084 bit32 *Index,
1085 bit32 Mask
1086 )
1087{
1088 return ostiBitScanForward(agNULL, Index, Mask);
1089}
1090
1091#ifdef LINUX_VERSION_CODE
1092
1095 smRoot_t *smRoot,
1096 sbit32 volatile *Addend
1097 )
1098{
1099 return ostiAtomicIncrement(agNULL, Addend);
1100}
1101
1104 smRoot_t *smRoot,
1105 sbit32 volatile *Addend
1106 )
1107{
1108 return ostiAtomicDecrement(agNULL, Addend);
1109}
1110
1111
1112
1114tdsmAtomicBitClear(
1115 smRoot_t *smRoot,
1116 sbit32 volatile *Destination,
1117 sbit32 Value
1118 )
1119{
1120 return ostiAtomicBitClear(agNULL, Destination, Value);
1121}
1122
1124tdsmAtomicBitSet(
1125 smRoot_t *smRoot,
1126 sbit32 volatile *Destination,
1127 sbit32 Value
1128 )
1129{
1130 return ostiAtomicBitSet(agNULL, Destination, Value);
1131}
1132
1134tdsmAtomicExchange(
1135 smRoot_t *smRoot,
1136 sbit32 volatile *Target,
1137 sbit32 Value
1138 )
1139{
1140 return ostiAtomicExchange(agNULL, Target, Value);
1141}
1142
1143#else
1144
1147 smRoot_t *smRoot,
1148 sbit32 volatile *Addend
1149 )
1150{
1151 return ostiInterlockedIncrement(agNULL, Addend);
1152}
1153
1156 smRoot_t *smRoot,
1157 sbit32 volatile *Addend
1158 )
1159{
1160 return ostiInterlockedDecrement(agNULL, Addend);
1161}
1162
1163
1164
1167 smRoot_t *smRoot,
1168 sbit32 volatile *Destination,
1169 sbit32 Value
1170 )
1171{
1172
1173 return ostiInterlockedAnd(agNULL, Destination, Value);
1174}
1175
1178 smRoot_t *smRoot,
1179 sbit32 volatile *Destination,
1180 sbit32 Value
1181 )
1182{
1183 return ostiInterlockedOr(agNULL, Destination, Value);
1184}
1185
1188 smRoot_t *smRoot,
1189 sbit32 volatile *Target,
1190 sbit32 Value
1191 )
1192{
1193 return ostiInterlockedExchange(agNULL, Target, Value);
1194}
1195
1196#endif /*LINUX_VERSION_CODE*/
1197
1200 smRoot_t *smRoot,
1201 void **osMemHandle,
1202 void ** virtPtr,
1203 bit32 * physAddrUpper,
1204 bit32 * physAddrLower,
1205 bit32 alignment,
1206 bit32 allocLength,
1207 smBOOLEAN isCacheable
1208 )
1209{
1210 tdsaRoot_t *tdsaRoot;
1211 tdsaContext_t *tdsaAllShared;
1213 bit32 status;
1214
1215 TI_DBG5(("tdsmAllocMemory: start\n"));
1216
1217 tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
1218 if (tdsaRoot == agNULL)
1219 {
1220 TI_DBG1(("tdsmAllocMemory: tdsaRoot is NULL\n"));
1221 return SM_RC_FAILURE;
1222 }
1223
1224 tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1225 if (tdsaAllShared == agNULL)
1226 {
1227 TI_DBG1(("tdsmAllocMemory: tdsaAllShared is NULL\n"));
1228 return SM_RC_FAILURE;
1229 }
1230
1231 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1232 if (tiRoot == agNULL)
1233 {
1234 TI_DBG1(("tdsmAllocMemory: tiRoot is NULL\n"));
1235 return SM_RC_FAILURE;
1236 }
1237
1239 osMemHandle,
1240 virtPtr,
1241 physAddrUpper,
1242 physAddrLower,
1243 alignment,
1244 allocLength,
1245 isCacheable);
1246
1247 if (status == tiSuccess)
1248 {
1249 return SM_RC_SUCCESS;
1250 }
1251 else
1252 {
1253 return SM_RC_FAILURE;
1254 }
1255
1256}
1257
1260 smRoot_t *smRoot,
1261 void *osDMAHandle,
1262 bit32 allocLength
1263 )
1264{
1265 tdsaRoot_t *tdsaRoot;
1266 tdsaContext_t *tdsaAllShared;
1268 bit32 status;
1269
1270 TI_DBG5(("tdsmFreeMemory: start\n"));
1271
1272 tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
1273 if (tdsaRoot == agNULL)
1274 {
1275 TI_DBG1(("tdsmFreeMemory: tdsaRoot is NULL\n"));
1276 return SM_RC_FAILURE;
1277 }
1278
1279 tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1280 if (tdsaAllShared == agNULL)
1281 {
1282 TI_DBG1(("tdsmFreeMemory: tdsaAllShared is NULL\n"));
1283 return SM_RC_FAILURE;
1284 }
1285
1286 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1287 if (tiRoot == agNULL)
1288 {
1289 TI_DBG1(("tdsmFreeMemory: tiRoot is NULL\n"));
1290 return SM_RC_FAILURE;
1291 }
1292
1294 osDMAHandle,
1295 allocLength);
1296
1297 if (status == tiSuccess)
1298 {
1299 return SM_RC_SUCCESS;
1300 }
1301 else
1302 {
1303 return SM_RC_FAILURE;
1304 }
1305}
1306
1309 smDeviceHandle_t *smDeviceHandle
1310 )
1311{
1312 tdsaRoot_t *tdsaRoot;
1313 tdsaContext_t *tdsaAllShared;
1315 tdsaDeviceData_t *oneDeviceData;
1316 bit32 ret = 0;
1317
1318 tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
1319 tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1320 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1321
1322
1323 TI_DBG6(("tdsmRotateQnumber: start\n"));
1324
1325 if (smDeviceHandle == agNULL)
1326 {
1327 TI_DBG1(("tdsmRotateQnumber: smDeviceHandle is NULL !!!!\n"));
1328 return ret;
1329 }
1330 oneDeviceData = (tdsaDeviceData_t *)smDeviceHandle->tdData;
1331 if (oneDeviceData == agNULL)
1332 {
1333 TI_DBG1(("tdsmRotateQnumber: oneDeviceData is NULL !!!!\n"));
1334 return ret;
1335 }
1336 return tdsaRotateQnumber(tiRoot, oneDeviceData);
1337}
1338
1341 smIORequest_t *smIORequest,
1342 bit32 QueueDepth
1343 )
1344{
1345 tdsaRoot_t *tdsaRoot = agNULL;
1346 tdsaContext_t *tdsaAllShared = agNULL;
1348 tdIORequestBody_t *tdIORequestBody = (tdIORequestBody_t *)smIORequest->tdData;
1349 tiIORequest_t *tiIORequest = tdIORequestBody->tiIORequest;
1350
1351
1352 TI_DBG5(("tdsmSetDeviceQueueDepth: start\n"));
1353
1354 tdsaRoot = (tdsaRoot_t *)smRoot->tdData;
1355 if (tdsaRoot == agNULL)
1356 {
1357 TI_DBG1(("tdsmSetDeviceQueueDepth: tdsaRoot is NULL\n"));
1358 return SM_RC_FAILURE;
1359 }
1360
1361 tdsaAllShared = &(tdsaRoot->tdsaAllShared);
1362 if (tdsaAllShared == agNULL)
1363 {
1364 TI_DBG1(("tdsmSetDeviceQueueDepth: tdsaAllShared is NULL\n"));
1365 return SM_RC_FAILURE;
1366 }
1367
1368 tiRoot = tdsaAllShared->agRootOsDataForInt.tiRoot;
1369 if (tiRoot == agNULL)
1370 {
1371 TI_DBG1(("tdsmFreeMemory: tiRoot is NULL\n"));
1372 return SM_RC_FAILURE;
1373 }
1374
1375 return ostiSetDeviceQueueDepth(tiRoot, tiIORequest, QueueDepth);
1376}
1377
1379 smRoot_t *smRoot,
1380 char *key,
1381 char *subkey1,
1382 char *subkey2,
1383 char *subkey3,
1384 char *subkey4,
1385 char *subkey5,
1386 char *valueName,
1387 char *buffer,
1388 bit32 bufferLen,
1389 bit32 *lenReceived
1390 )
1391{
1392 bit32 ret = tiError;
1393
1394 TI_DBG7(("tdsmGetTransportParam: start\n"));
1396 key,
1397 subkey1,
1398 subkey2,
1399 subkey3,
1400 subkey4,
1401 subkey5,
1402 valueName,
1403 buffer,
1404 bufferLen,
1405 lenReceived
1406 );
1407 return ret;
1408}
1409#endif /* FDS_SM */
1410
#define SMP_PHY_CONTROL_HARD_RESET
Definition: dmdefs.h:199
bit32 status
Definition: encrypt_ioctl.h:12
#define ITD_DSTATE_COMPLETED
Definition: itddefs.h:39
osGLOBAL U32 ostiFreeMemory(tiRoot_t *ptiRoot, void *osMemHandle, U32 allocLength)
Definition: lxosapi.c:320
osGLOBAL U32 ostiAllocMemory(tiRoot_t *ptiRoot, void **osMemHandle, void **agVirtAddr, U32 *agPhysUpper32, U32 *agPhysLower32, U32 alignment, U32 allocLength, agBOOLEAN isCacheable)
Definition: lxosapi.c:51
U32 ostiGetTransportParam(tiRoot_t *ptiRoot, S08 *key, S08 *subkey1, S08 *subkey2, S08 *subkey3, S08 *subkey4, S08 *subkey5, S08 *valueName, S08 *buffer, U32 bufferLen, U32 *lenReceived)
Definition: lxosapi.c:464
void ostiPortEvent(tiRoot_t *ptiRoot, tiPortEvent_t eventType, U32 status, void *pParm)
Definition: lxosapi.c:591
void ostiSingleThreadedLeave(tiRoot_t *ptiRoot, U32 queueId)
Definition: osapi.c:534
void ostiInitiatorEvent(tiRoot_t *ptiRoot, tiPortalContext_t *ptiPortalContext, tiDeviceHandle_t *ptiDevHandle, tiIntrEventType_t eventType, U32 eventStatus, void *parm)
Definition: osapi.c:49
osGLOBAL bit32 ostiSetDeviceQueueDepth(tiRoot_t *tiRoot, tiIORequest_t *tiIORequest, bit32 QueueDepth)
Definition: osapi.c:761
osGLOBAL FORCEINLINE sbit32 ostiInterlockedAnd(tiRoot_t *root, sbit32 volatile *Destination, sbit32 Value)
Definition: osapi.c:738
osGLOBAL FORCEINLINE sbit32 ostiInterlockedDecrement(tiRoot_t *root, sbit32 volatile *Addend)
Definition: osapi.c:729
osGLOBAL FORCEINLINE sbit32 ostiInterlockedOr(tiRoot_t *root, sbit32 volatile *Destination, sbit32 Value)
Definition: osapi.c:748
osGLOBAL FORCEINLINE sbit32 ostiInterlockedExchange(tiRoot_t *root, sbit32 volatile *Target, sbit32 Value)
Definition: osapi.c:710
void ostiInitiatorIOCompleted(tiRoot_t *ptiRoot, tiIORequest_t *ptiIORequest, tiIOStatus_t IOStatus, U32 statusDetail, tiSenseData_t *pSenseData, U32 context)
Definition: osapi.c:270
osGLOBAL FORCEINLINE bit8 ostiBitScanForward(tiRoot_t *root, bit32 *Index, bit32 Mask)
Definition: osapi.c:638
void ostiSingleThreadedEnter(tiRoot_t *ptiRoot, U32 queueId)
Definition: osapi.c:514
osGLOBAL FORCEINLINE sbit32 ostiInterlockedIncrement(tiRoot_t *root, sbit32 volatile *Addend)
Definition: osapi.c:720
#define osti_memset(s, c, n)
Definition: osstring.h:65
#define osti_memcpy(des, src, n)
Definition: osstring.h:64
#define osti_memcmp(s1, s2, n)
Definition: osstring.h:63
#define osGLOBAL
Definition: ostypes.h:147
#define agNULL
Definition: ostypes.h:151
int sbit32
Definition: ostypes.h:102
unsigned int bit32
Definition: ostypes.h:99
#define agFALSE
Definition: ostypes.h:150
#define FORCEINLINE
Definition: ostypes.h:86
#define agTRUE
Definition: ostypes.h:149
unsigned char bit8
Definition: ostypes.h:97
#define AGSA_PHY_HARD_RESET
Definition: sa.h:835
GLOBAL bit32 saLocalPhyControl(agsaRoot_t *agRoot, agsaContext_t *agContext, bit32 queueNum, bit32 phyId, bit32 phyOperation, ossaLocalPhyControlCB_t agCB)
Initiate a Local PHY control command.
Definition: saphy.c:420
GLOBAL bit32 saDeregisterDeviceHandle(agsaRoot_t *agRoot, agsaContext_t *agContext, agsaDevHandle_t *agDevHandle, bit32 queueNum)
Function for target to remove stale initiator device handle.
Definition: sadisc.c:83
GLOBAL bit32 saRegisterNewDevice(agsaRoot_t *agRoot, agsaContext_t *agContext, bit32 queueNum, agsaDeviceInfo_t *agDeviceInfo, agsaPortContext_t *agPortContext, bit16 hostAssignedDeviceId)
Register New Device from a specific local port.
Definition: sadisc.c:302
#define smBOOLEAN
Definition: sm.h:280
smIntrEventType_t
Definition: sm.h:108
@ smIntrEventTypeLocalAbort
Definition: sm.h:115
@ smDetailAborted
Definition: sm.h:81
@ SM_RC_SUCCESS
Definition: sm.h:48
@ SM_RC_FAILURE
Definition: sm.h:49
@ smIOSTPResourceBusy
Definition: sm.h:71
@ smIORetry
Definition: sm.h:70
@ smIOSuccess
Definition: sm.h:64
osGLOBAL bit32 smSuperIOStart(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smSuperScsiInitiatorRequest_t *smSCSIRequest, bit32 AddrHi, bit32 AddrLo, bit32 interruptContext)
Definition: smsat.c:351
osGLOBAL bit32 smIDStart(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle)
Definition: smsat.c:3143
osGLOBAL FORCEINLINE bit32 smIOStart(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, smScsiInitiatorRequest_t *smSCSIRequest, bit32 interruptContext)
Definition: smsat.c:466
bit32 sasAddressHi
Definition: tdtypes.h:229
bit32 sasAddressLo
Definition: tdtypes.h:228
data structure stores OS specific and LL specific context
Definition: sa.h:1658
void * osData
Definition: sa.h:1659
data structure provides the identify data of the SATA device
Definition: sa_spec.h:530
bit8 modelNumber[40]
Definition: sa_spec.h:540
bit8 firmwareVersion[8]
Definition: sa_spec.h:539
bit8 serialNumber[20]
Definition: sa_spec.h:537
agsaSATAIdentifyData_t satIdentifyData
Definition: tdtypes.h:273
bit32 IDPending
Definition: tdtypes.h:313
bit32 IDDeviceValid
Definition: tdtypes.h:305
void * tdData
Definition: sm.h:138
void * smData
Definition: sm.h:139
data structure for SAS SSP IO reuqest body This structure contains IO related fields....
Definition: tdtypes.h:587
tiDeviceHandle_t * tiDevHandle
Definition: tdtypes.h:589
bit32 ioCompleted
Definition: tdtypes.h:620
void * osMemHandle
Definition: tdtypes.h:633
tiIORequest_t * CurrentTaskTag
Definition: tdtypes.h:634
struct tdIORequestBody_s::@16::@20 InitiatorTMIO
union tdIORequestBody_s::@16 IOType
tiIORequest_t * tiIORequest
Definition: tdtypes.h:590
tdList_t * flink
Definition: tdlist.h:38
data structure for SAS/SATA context at TD layer
Definition: tdsatypes.h:199
struct tdsaRootOsData_s agRootOsDataForInt
Definition: tdsatypes.h:203
bit32 IDRetry
Definition: tdsatypes.h:304
bit32 MaxNumLLLocks
Definition: tdsatypes.h:310
bit32 MaxNumOSLocks
Definition: tdsatypes.h:309
data structure for SAS device list This structure maintains the device as a list and information abou...
Definition: tdtypes.h:322
tiDeviceHandle_t tiDeviceHandle
Definition: tdtypes.h:325
agsaRoot_t * agRoot
Definition: tdtypes.h:335
tdList_t MainLink
Definition: tdtypes.h:328
agsaDevHandle_t * agDevHandle
Definition: tdtypes.h:336
bit8 directlyAttached
Definition: tdtypes.h:367
struct tdsaPortContext_s * tdPortContext
Definition: tdtypes.h:349
tdList_t FreeLink
Definition: tdtypes.h:327
TDSASAddressID_t SASAddressID
Definition: tdtypes.h:341
satDeviceData_t satDevData
Definition: tdtypes.h:346
bit32 OSAbortAll
Definition: tdtypes.h:376
agsaDeviceInfo_t agDeviceInfo
Definition: tdtypes.h:357
agsaContext_t agContext
Definition: tdtypes.h:358
data structure for TD port context This structure maintains information about the port such as ID add...
Definition: tdtypes.h:412
bit32 DiscoveryState
Definition: tdtypes.h:416
agsaPortContext_t * agPortContext
Definition: tdtypes.h:446
tiPortalContext_t * tiPortalContext
Definition: tdtypes.h:443
bit8 remoteName[68]
Definition: tdtypes.h:462
tiRoot_t * tiRoot
Definition: tdtypes.h:152
the root data structure for TD layer
Definition: tdsatypes.h:362
tdsaContext_t tdsaAllShared
Definition: tdsatypes.h:364
void * tdData
Definition: titypes.h:57
Definition: titypes.h:61
void * tdData
Definition: titypes.h:63
@ TD_TIMER_LOCK
Definition: tddefs.h:1159
@ TD_MAX_LOCKS
Definition: tddefs.h:1187
#define TDLIST_OBJECT_BASE(baseType, fieldName, fieldPtr)
Definition: tdlist.h:161
#define TDLIST_ENQUEUE_AT_TAIL(toAddHdr, listHdr)
Definition: tdlist.h:65
#define TDLIST_DEQUEUE_THIS(hdr)
Definition: tdlist.h:79
void tdsaSingleThreadedEnter(tiRoot_t *ptiRoot, bit32 queueId)
Definition: tdmisc.c:2862
void tdsaSingleThreadedLeave(tiRoot_t *ptiRoot, bit32 queueId)
Definition: tdmisc.c:2875
osGLOBAL bit32 tdsaAbortAll(tiRoot_t *tiRoot, agsaRoot_t *agRoot, tdsaDeviceData_t *oneDeviceData)
Definition: tdmisc.c:354
FORCEINLINE bit32 tdsaRotateQnumber(tiRoot_t *tiRoot, tdsaDeviceData_t *oneDeviceData)
Definition: tdport.c:7956
osGLOBAL void tdsaKillTimer(tiRoot_t *tiRoot, tdsaTimerRequest_t *timerRequest)
Definition: tdtimers.c:228
#define TD_SATA_DEVICE
Definition: tdsatypes.h:42
osGLOBAL FORCEINLINE bit32 tdsmRotateQnumber(smRoot_t *smRoot, smDeviceHandle_t *smDeviceHandle)
osGLOBAL bit32 tdsmFreeMemory(smRoot_t *smRoot, void *osDMAHandle, bit32 allocLength)
osGLOBAL FORCEINLINE sbit32 tdsmInterlockedIncrement(smRoot_t *smRoot, sbit32 volatile *Addend)
osGLOBAL FORCEINLINE bit8 tdsmBitScanForward(smRoot_t *smRoot, bit32 *Index, bit32 Mask)
osGLOBAL bit32 tdsmGetTransportParam(smRoot_t *smRoot, char *key, char *subkey1, char *subkey2, char *subkey3, char *subkey4, char *subkey5, char *valueName, char *buffer, bit32 bufferLen, bit32 *lenReceived)
osGLOBAL FORCEINLINE sbit32 tdsmInterlockedExchange(smRoot_t *smRoot, sbit32 volatile *Target, sbit32 Value)
osGLOBAL void tdsmEventCB(smRoot_t *smRoot, smDeviceHandle_t *smDeviceHandle, smIntrEventType_t eventType, bit32 eventStatus, void *parm)
osGLOBAL void tdsmIDCompletedCB(smRoot_t *smRoot, smIORequest_t *smIORequest, smDeviceHandle_t *smDeviceHandle, bit32 status, void *IDdata)
osGLOBAL FORCEINLINE sbit32 tdsmInterlockedDecrement(smRoot_t *smRoot, sbit32 volatile *Addend)
osGLOBAL FORCEINLINE sbit32 tdsmInterlockedAnd(smRoot_t *smRoot, sbit32 volatile *Destination, sbit32 Value)
osGLOBAL bit32 tdsmSetDeviceQueueDepth(smRoot_t *smRoot, smIORequest_t *smIORequest, bit32 QueueDepth)
osGLOBAL FORCEINLINE void tdsmSingleThreadedEnter(smRoot_t *smRoot, bit32 syncLockId)
osGLOBAL FORCEINLINE void tdsmIOCompletedCB(smRoot_t *smRoot, smIORequest_t *smIORequest, bit32 status, bit32 statusDetail, smSenseData_t *senseData, bit32 interruptContext)
osGLOBAL FORCEINLINE void tdsmSingleThreadedLeave(smRoot_t *smRoot, bit32 syncLockId)
osGLOBAL FORCEINLINE sbit32 tdsmInterlockedOr(smRoot_t *smRoot, sbit32 volatile *Destination, sbit32 Value)
osGLOBAL bit32 tdsmAllocMemory(smRoot_t *smRoot, void **osMemHandle, void **virtPtr, bit32 *physAddrUpper, bit32 *physAddrLower, bit32 alignment, bit32 allocLength, smBOOLEAN isCacheable)
__FBSDID("$FreeBSD$")
@ tiAbortOK
Definition: tidefs.h:511
@ tiPortDiscoveryReady
Definition: tidefs.h:137
@ tiPortLinkUp
Definition: tidefs.h:133
@ tiSuccess
Definition: tidefs.h:67
@ tiError
Definition: tidefs.h:68
@ tiDeviceArrival
Definition: tidefs.h:505
@ tiDeviceRemoval
Definition: tidefs.h:504
@ tiIntrEventTypeLocalAbort
Definition: tidefs.h:463
@ tiIntrEventTypeDeviceChange
Definition: tidefs.h:461
#define TI_DBG6(a)
Definition: tiglobal.h:53
#define TI_DBG1(a)
Definition: tiglobal.h:48
#define TI_DBG5(a)
Definition: tiglobal.h:52
#define TI_DBG7(a)
Definition: tiglobal.h:54
#define TI_DBG2(a)
Definition: tiglobal.h:49