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
26 #include <dev/pms/freebsd/driver/common/osenv.h>
27 #include <dev/pms/freebsd/driver/common/ostypes.h>
28 #include <dev/pms/freebsd/driver/common/osdebug.h>
29
30 #include <dev/pms/RefTisa/tisa/api/titypes.h>
31 #include <dev/pms/RefTisa/tisa/api/ostiapi.h>
32 #include <dev/pms/RefTisa/tisa/api/tiapi.h>
33 /* for TIDEBUG_MSG */
34 #include <dev/pms/RefTisa/tisa/api/tiglobal.h>
35
36 #ifdef FDS_SM
37
38 #include <dev/pms/RefTisa/sat/api/sm.h>
39 #include <dev/pms/RefTisa/sat/api/smapi.h>
40 #include <dev/pms/RefTisa/sat/api/tdsmapi.h>
41
42 #ifdef FDS_DM
43 #include <dev/pms/RefTisa/discovery/api/dm.h>
44 #endif
45
46 #ifdef INITIATOR_DRIVER
47 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
48 #endif
49
50 #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
51 #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
52 #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
53
54 #if defined(SM_DEBUG)
55 extern bit32 gSMDebugLevel;
56 #endif
57
58 osGLOBAL void
59 smReportRemovalDirect(
60 tiRoot_t *tiRoot,
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 */
82 ostiPortEvent (
83 tiRoot,
84 tiPortLinkUp,
85 tiSuccess,
86 (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
87 );
88 #ifdef INITIATOR_DRIVER
89 /* triggers discovery */
90 ostiPortEvent(
91 tiRoot,
92 tiPortDiscoveryReady,
93 tiSuccess,
94 (void *) tdsaAllShared->Ports[PhyID].tiPortalContext
95 );
96 #endif
97 return;
98 }
99
100 osGLOBAL void
101 smReportRemoval(
102 tiRoot_t *tiRoot,
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;
120 ostiInitiatorEvent(
121 tiRoot,
122 onePortContext->tiPortalContext,
123 agNULL,
124 tiIntrEventTypeDeviceChange,
125 tiDeviceRemoval,
126 agNULL
127 );
128 }
129
130 return;
131 }
132 osGLOBAL void
133 smHandleDirect(
134 tiRoot_t *tiRoot,
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 &&
171 (osti_memcmp (tmpOneDeviceData->satDevData.satIdentifyData.serialNumber,
172 pSATAIdData->serialNumber,
173 20) == 0) &&
174 (osti_memcmp (tmpOneDeviceData->satDevData.satIdentifyData.firmwareVersion,
175 pSATAIdData->firmwareVersion,
176 8) == 0) &&
177 (osti_memcmp (tmpOneDeviceData->satDevData.satIdentifyData.modelNumber,
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 */
230 ostiPortEvent (
231 tiRoot,
232 tiPortLinkUp,
233 tiSuccess,
234 (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
235 );
236
237
238 #ifdef INITIATOR_DRIVER
239 /* triggers discovery */
240 ostiPortEvent(
241 tiRoot,
242 tiPortDiscoveryReady,
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 */
253 ostiPortEvent (
254 tiRoot,
255 tiPortLinkUp,
256 tiSuccess,
257 (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
258 );
259 #ifdef INITIATOR_DRIVER
260 /* triggers discovery */
261 ostiPortEvent(
262 tiRoot,
263 tiPortDiscoveryReady,
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 */
275 osGLOBAL void
276 tdsmIDCompletedCB(
277 smRoot_t *smRoot,
278 smIORequest_t *smIORequest,
279 smDeviceHandle_t *smDeviceHandle,
280 bit32 status,
281 void *IDdata
282 )
283 {
284 tdsaRoot_t *tdsaRoot;
285 tdsaContext_t *tdsaAllShared;
286 tiRoot_t *tiRoot;
287 agsaRoot_t *agRoot;
288 tdIORequestBody_t *tdIORequestBody;
289 tdsaDeviceData_t *oneDeviceData;
290 tdsaPortContext_t *onePortContext;
291 tiPortalContext_t *tiPortalContext;
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"));
306 ostiFreeMemory(
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
325 tdsaSingleThreadedEnter(tiRoot, TD_TIMER_LOCK);
326
327 if (oneDeviceData->tdIDTimer.timerRunning == agTRUE)
328 {
329 tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
330 tdsaKillTimer(
331 tiRoot,
332 &oneDeviceData->tdIDTimer
333 );
334 }
335 else
336 {
337 tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
338 }
339
340 if (onePortContext == agNULL)
341 {
342 TI_DBG1(("tdsmIDCompletedCB: onePortContext is NULL!!!\n"));
343 ostiFreeMemory(
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 }
363 ostiFreeMemory(
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 }
384 ostiFreeMemory(
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"));
395 ostiFreeMemory(
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 */
427 ostiInitiatorEvent(
428 tiRoot,
429 tiPortalContext,
430 agNULL,
431 tiIntrEventTypeDeviceChange,
432 tiDeviceArrival,
433 agNULL
434 );
435 }
436 }
437 TI_DBG2(("tdsmIDCompletedCB: tdIORequestBody %p tdIORequestBody->osMemHandle %p\n", tdIORequestBody, tdIORequestBody->osMemHandle));
438 ostiFreeMemory(
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;
456 ostiFreeMemory(
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;
487 ostiFreeMemory(
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;
510 ostiFreeMemory(
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"));
524 ostiFreeMemory(
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,
538 SMP_PHY_CONTROL_HARD_RESET,
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;
567 ostiFreeMemory(
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;
597 ostiFreeMemory(
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;
628 ostiFreeMemory(
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,
647 SMP_PHY_CONTROL_HARD_RESET,
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
680 FORCEINLINE void
681 tdsmIOCompletedCB(
682 smRoot_t *smRoot,
683 smIORequest_t *smIORequest,
684 bit32 status,
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;
697 tiDeviceHandle_t *tiDeviceHandle;
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 {
709 ostiInitiatorIOCompleted( tiRoot,
710 tiIORequest,
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;
731 ostiInitiatorIOCompleted( tiRoot,
732 tiIORequest,
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;
770 ostiInitiatorIOCompleted( tiRoot,
771 tiIORequest,
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;
793 ostiInitiatorIOCompleted( tiRoot,
794 tiIORequest,
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,
818 SMP_PHY_CONTROL_HARD_RESET,
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 }
829 ostiInitiatorIOCompleted( tiRoot,
830 tiIORequest,
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 }
845 ostiInitiatorIOCompleted( tiRoot,
846 tiIORequest,
847 status,
848 statusDetail,
849 (tiSenseData_t *)senseData,
850 interruptContext);
851 }
852
853 return;
854 }
855
856 /* completion of taskmanagement
857 osGLOBAL 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
868 osGLOBAL void
869 tdsmEventCB(
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;
879 tiRoot_t *tiRoot;
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;
887 tiDeviceHandle_t *tiDeviceHandle;
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;
915 ostiInitiatorEvent( tiRoot,
916 agNULL,
917 tiDeviceHandle,
918 tiIntrEventTypeLocalAbort,
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 */
962 ostiFreeMemory(
963 tiRoot,
964 osMemHandle,
965 sizeof(tdIORequestBody_t)
966 );
967
968
969 TI_DBG2(("tdsmEventCB: calling ostiInitiatorEvent\n"));
970 ostiInitiatorEvent(
971 tiRoot,
972 tiportalContext,
973 tiDeviceHandle,
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
1000 FORCEINLINE void
1001 tdsmSingleThreadedEnter(
1002 smRoot_t *smRoot,
1003 bit32 syncLockId
1004 )
1005 {
1006 tdsaRoot_t *tdsaRoot;
1007 tdsaContext_t *tdsaAllShared;
1008 tiRoot_t *tiRoot;
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
1041 FORCEINLINE void
1042 tdsmSingleThreadedLeave(
1043 smRoot_t *smRoot,
1044 bit32 syncLockId
1045 )
1046 {
1047 tdsaRoot_t *tdsaRoot;
1048 tdsaContext_t *tdsaAllShared;
1049 tiRoot_t *tiRoot;
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
1081 osGLOBAL FORCEINLINE bit8
1082 tdsmBitScanForward(
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
1093 osGLOBAL FORCEINLINE sbit32
1094 tdsmInterlockedIncrement(
1095 smRoot_t *smRoot,
1096 sbit32 volatile *Addend
1097 )
1098 {
1099 return ostiAtomicIncrement(agNULL, Addend);
1100 }
1101
1102 osGLOBAL FORCEINLINE sbit32
1103 tdsmInterlockedDecrement(
1104 smRoot_t *smRoot,
1105 sbit32 volatile *Addend
1106 )
1107 {
1108 return ostiAtomicDecrement(agNULL, Addend);
1109 }
1110
1111
1112
1113 osGLOBAL FORCEINLINE sbit32
1114 tdsmAtomicBitClear(
1115 smRoot_t *smRoot,
1116 sbit32 volatile *Destination,
1117 sbit32 Value
1118 )
1119 {
1120 return ostiAtomicBitClear(agNULL, Destination, Value);
1121 }
1122
1123 osGLOBAL FORCEINLINE sbit32
1124 tdsmAtomicBitSet(
1125 smRoot_t *smRoot,
1126 sbit32 volatile *Destination,
1127 sbit32 Value
1128 )
1129 {
1130 return ostiAtomicBitSet(agNULL, Destination, Value);
1131 }
1132
1133 osGLOBAL FORCEINLINE sbit32
1134 tdsmAtomicExchange(
1135 smRoot_t *smRoot,
1136 sbit32 volatile *Target,
1137 sbit32 Value
1138 )
1139 {
1140 return ostiAtomicExchange(agNULL, Target, Value);
1141 }
1142
1143 #else
1144
1145 osGLOBAL FORCEINLINE sbit32
1146 tdsmInterlockedIncrement(
1147 smRoot_t *smRoot,
1148 sbit32 volatile *Addend
1149 )
1150 {
1151 return ostiInterlockedIncrement(agNULL, Addend);
1152 }
1153
1154 osGLOBAL FORCEINLINE sbit32
1155 tdsmInterlockedDecrement(
1156 smRoot_t *smRoot,
1157 sbit32 volatile *Addend
1158 )
1159 {
1160 return ostiInterlockedDecrement(agNULL, Addend);
1161 }
1162
1163
1164
1165 osGLOBAL FORCEINLINE sbit32
1166 tdsmInterlockedAnd(
1167 smRoot_t *smRoot,
1168 sbit32 volatile *Destination,
1169 sbit32 Value
1170 )
1171 {
1172
1173 return ostiInterlockedAnd(agNULL, Destination, Value);
1174 }
1175
1176 osGLOBAL FORCEINLINE sbit32
1177 tdsmInterlockedOr(
1178 smRoot_t *smRoot,
1179 sbit32 volatile *Destination,
1180 sbit32 Value
1181 )
1182 {
1183 return ostiInterlockedOr(agNULL, Destination, Value);
1184 }
1185
1186 osGLOBAL FORCEINLINE sbit32
1187 tdsmInterlockedExchange(
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
1198 osGLOBAL bit32
1199 tdsmAllocMemory(
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;
1212 tiRoot_t *tiRoot;
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
1238 status = ostiAllocMemory(tiRoot,
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
1258 osGLOBAL bit32
1259 tdsmFreeMemory(
1260 smRoot_t *smRoot,
1261 void *osDMAHandle,
1262 bit32 allocLength
1263 )
1264 {
1265 tdsaRoot_t *tdsaRoot;
1266 tdsaContext_t *tdsaAllShared;
1267 tiRoot_t *tiRoot;
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
1293 status = ostiFreeMemory(tiRoot,
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
1307 FORCEINLINE bit32
1308 tdsmRotateQnumber(smRoot_t *smRoot,
1309 smDeviceHandle_t *smDeviceHandle
1310 )
1311 {
1312 tdsaRoot_t *tdsaRoot;
1313 tdsaContext_t *tdsaAllShared;
1314 tiRoot_t *tiRoot;
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
1339 osGLOBAL bit32
1340 tdsmSetDeviceQueueDepth(smRoot_t *smRoot,
1341 smIORequest_t *smIORequest,
1342 bit32 QueueDepth
1343 )
1344 {
1345 tdsaRoot_t *tdsaRoot = agNULL;
1346 tdsaContext_t *tdsaAllShared = agNULL;
1347 tiRoot_t *tiRoot = 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
1378 osGLOBAL bit32 tdsmGetTransportParam(
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"));
1395 ret = ostiGetTransportParam(agNULL,
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
Cache object: a292cfc1afd70e63910f54e998945e72
|