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)
55extern bit32 gSMDebugLevel;
56#endif
57
58osGLOBAL void
59smReportRemovalDirect(
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
100osGLOBAL void
101smReportRemoval(
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}
132osGLOBAL void
133smHandleDirect(
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*/
275osGLOBAL void
276tdsmIDCompletedCB(
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
680FORCEINLINE void
681tdsmIOCompletedCB(
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
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
869tdsmEventCB(
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
1000FORCEINLINE void
1001tdsmSingleThreadedEnter(
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
1041FORCEINLINE void
1042tdsmSingleThreadedLeave(
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
1081osGLOBAL FORCEINLINE bit8
1082tdsmBitScanForward(
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
1093osGLOBAL FORCEINLINE sbit32
1094tdsmInterlockedIncrement(
1095                   smRoot_t         *smRoot,
1096                   sbit32 volatile  *Addend
1097                   )
1098{
1099   return ostiAtomicIncrement(agNULL, Addend);
1100}
1101
1102osGLOBAL FORCEINLINE sbit32
1103tdsmInterlockedDecrement(
1104                   smRoot_t         *smRoot,
1105                   sbit32 volatile  *Addend
1106                   )
1107{
1108   return ostiAtomicDecrement(agNULL, Addend);
1109}
1110
1111
1112
1113osGLOBAL FORCEINLINE sbit32
1114tdsmAtomicBitClear(
1115               smRoot_t         *smRoot,
1116               sbit32 volatile  *Destination,
1117               sbit32            Value
1118               )
1119{
1120   return ostiAtomicBitClear(agNULL, Destination, Value);
1121}
1122
1123osGLOBAL FORCEINLINE sbit32
1124tdsmAtomicBitSet(
1125               smRoot_t         *smRoot,
1126               sbit32 volatile  *Destination,
1127               sbit32            Value
1128               )
1129{
1130   return ostiAtomicBitSet(agNULL, Destination, Value);
1131}
1132
1133osGLOBAL FORCEINLINE sbit32
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
1145osGLOBAL FORCEINLINE sbit32
1146tdsmInterlockedIncrement(
1147                   smRoot_t         *smRoot,
1148                   sbit32 volatile  *Addend
1149                   )
1150{
1151   return ostiInterlockedIncrement(agNULL, Addend);
1152}
1153
1154osGLOBAL FORCEINLINE sbit32
1155tdsmInterlockedDecrement(
1156                   smRoot_t        *smRoot,
1157                   sbit32 volatile *Addend
1158                   )
1159{
1160   return ostiInterlockedDecrement(agNULL, Addend);
1161}
1162
1163
1164
1165osGLOBAL FORCEINLINE sbit32
1166tdsmInterlockedAnd(
1167               smRoot_t        *smRoot,
1168               sbit32 volatile  *Destination,
1169               sbit32            Value
1170               )
1171{
1172
1173   return ostiInterlockedAnd(agNULL, Destination, Value);
1174}
1175
1176osGLOBAL FORCEINLINE sbit32
1177tdsmInterlockedOr(
1178               smRoot_t        *smRoot,
1179               sbit32 volatile  *Destination,
1180               sbit32            Value
1181               )
1182{
1183   return ostiInterlockedOr(agNULL, Destination, Value);
1184}
1185
1186osGLOBAL FORCEINLINE sbit32
1187tdsmInterlockedExchange(
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
1198osGLOBAL bit32
1199tdsmAllocMemory(
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
1258osGLOBAL bit32
1259tdsmFreeMemory(
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
1307FORCEINLINE bit32
1308tdsmRotateQnumber(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
1339osGLOBAL bit32
1340tdsmSetDeviceQueueDepth(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
1378osGLOBAL 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
1411