1/*******************************************************************************
2*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3*
4*Redistribution and use in source and binary forms, with or without modification, are permitted provided
5*that the following conditions are met:
6*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7*following disclaimer.
8*2. Redistributions in binary form must reproduce the above copyright notice,
9*this list of conditions and the following disclaimer in the documentation and/or other materials provided
10*with the distribution.
11*
12*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20
21********************************************************************************/
22/*******************************************************************************/
23/** \file
24 *
25 *
26 *
27 * This file contains CB functions used by lower layer in SAS/SATA TD layer
28 *
29 */
30#include <sys/cdefs.h>
31__FBSDID("$FreeBSD$");
32#include <dev/pms/config.h>
33
34#include <dev/pms/freebsd/driver/common/osenv.h>
35#include <dev/pms/freebsd/driver/common/ostypes.h>
36#include <dev/pms/freebsd/driver/common/osdebug.h>
37
38#include <dev/pms/RefTisa/sallsdk/api/sa.h>
39#include <dev/pms/RefTisa/sallsdk/api/saapi.h>
40#include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
41
42#include <dev/pms/RefTisa/tisa/api/titypes.h>
43#include <dev/pms/RefTisa/tisa/api/ostiapi.h>
44#include <dev/pms/RefTisa/tisa/api/tiapi.h>
45#include <dev/pms/RefTisa/tisa/api/tiglobal.h>
46
47#ifdef FDS_SM
48#include <dev/pms/RefTisa/sat/api/sm.h>
49#include <dev/pms/RefTisa/sat/api/smapi.h>
50#include <dev/pms/RefTisa/sat/api/tdsmapi.h>
51#endif
52
53#ifdef FDS_DM
54#include <dev/pms/RefTisa/discovery/api/dm.h>
55#include <dev/pms/RefTisa/discovery/api/dmapi.h>
56#include <dev/pms/RefTisa/discovery/api/tddmapi.h>
57#endif
58
59#include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
60#include <dev/pms/freebsd/driver/common/osstring.h>
61#include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
62
63#ifdef INITIATOR_DRIVER
64#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
65#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
66#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
67#endif
68
69#ifdef TARGET_DRIVER
70#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
71#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
72#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
73#endif
74
75#include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
76#include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
77
78#ifdef ECHO_TESTING
79/* temporary to test saEchoCommand() */
80extern bit8 gEcho;
81#endif
82
83#if defined(SALLSDK_DEBUG)
84extern bit32 gLLDebugLevel;
85#endif
86
87
88#include <dev/pms/RefTisa/sallsdk/spc/mpidebug.h>
89
90#ifdef SA_ENABLE_TRACE_FUNCTIONS
91
92#ifdef siTraceFileID
93#undef siTraceFileID
94#endif
95#define siTraceFileID 'R'
96#endif
97/*
98  functions that are common to SAS and SATA
99*/
100
101FORCEINLINE
102void ossaCacheInvalidate(
103                         agsaRoot_t  *agRoot,
104                         void        *osMemHandle,
105                         void        *virtPtr,
106                         bit32       length
107                         )
108{
109  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
110  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
111
112  TI_DBG6(("ossaCacheInvalidate: start\n"));
113  ostiCacheInvalidate(tiRoot, osMemHandle, virtPtr, length);
114  return;
115}
116
117FORCEINLINE
118void ossaCacheFlush(
119               agsaRoot_t  *agRoot,
120               void        *osMemHandle,
121               void        *virtPtr,
122               bit32       length
123               )
124{
125  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
126  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
127
128  TI_DBG6(("ossaCacheFlush: start\n"));
129  ostiCacheFlush(tiRoot, osMemHandle, virtPtr, length);
130  return;
131}
132
133FORCEINLINE
134void ossaCachePreFlush(
135                  agsaRoot_t  *agRoot,
136                  void        *osMemHandle,
137                  void        *virtPtr,
138                  bit32       length
139                   )
140
141{
142  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
143  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
144
145  TI_DBG6(("ossaCachePreFlush: start\n"));
146  ostiCachePreFlush(tiRoot, osMemHandle, virtPtr, length);
147  return;
148}
149
150/*****************************************************************************
151*! \brief ossaDeviceHandleAccept
152*
153*  Purpose:  This function is called by lower layer to inform TD layer of
154*            a new SAS device arrival. Used only at the target
155*
156*
157*  \param   agRoot         Pointer to chip/driver Instance.
158*  \param   agDevHandle    Pointer to the device handle of the device
159*  \param   agDevInfo      Pointer to the device info structure
160*  \param   agPortContext  Pointer to a port context
161*
162*  \return:
163*          OSSA_RC_REJECT  A device is accpeted
164*          OSSA_RC_ACCEPT  A device is rejected
165*
166*  \note -  For details, refer to SAS/SATA Low-Level API Specification
167*
168*****************************************************************************/
169osGLOBAL bit32 ossaDeviceHandleAccept(
170                       agsaRoot_t          *agRoot,
171                       agsaDevHandle_t     *agDevHandle,
172                       agsaSASDeviceInfo_t *agDevInfo,
173                       agsaPortContext_t   *agPortContext,
174                       bit32               *hostAssignedDeviceId
175                       )
176{
177#ifdef TARGET_DRIVER
178  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
179  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
180  tdsaRoot_t           *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
181  tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
182
183  tdsaPortContext_t    *onePortContext = agNULL;
184  tiPortalContext_t    *tiPortalContext = agNULL;
185  tdsaDeviceData_t     *oneDeviceData = agNULL;
186  tiDeviceHandle_t     *tiDeviceHandle = agNULL;
187  tdsaSASSubID_t       agSASSubID;
188  bit32                option;
189  bit32                param;
190  /*
191    at target only
192    by default TD layer accpets all devices
193  */
194  /*
195    at this point,
196    by LINK_UP event tdsaPortContext should have been created
197  */
198  smTraceFuncEnter(hpDBG_VERY_LOUD, "Y0");
199  TI_DBG1(("ossaDeviceHandleAccept: start hostAssignedDeviceId 0x%X\n",*hostAssignedDeviceId));
200
201
202  if (agPortContext == agNULL)
203  {
204    TI_DBG1(("ossaDeviceHandleAccept: NULL agsaPortContext; wrong\n"));
205    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y0");
206    return OSSA_RC_REJECT;
207  }
208
209
210  onePortContext = (tdsaPortContext_t *)agPortContext->osData;
211
212  if (onePortContext == agNULL)
213  {
214    TI_DBG1(("ossaDeviceHandleAccept: NULL oneportcontext; wrong\n"));
215    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y0");
216    return OSSA_RC_REJECT;
217  }
218
219  tiPortalContext = (tiPortalContext_t *)onePortContext->tiPortalContext;
220
221  if (tiPortalContext == agNULL)
222  {
223    TI_DBG1(("ossaDeviceHandleAccept: NULL tiPortalContext; wrong\n"));
224    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Y0");
225    return OSSA_RC_REJECT;
226  }
227
228  /*
229    add the device to device list
230    cf) OSSA_DISCOVER_FOUND_DEVICE
231  */
232  TI_DBG4(("ossaDeviceHandleAccept: sasAddressHi 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSHI(&agDevInfo->commonDevInfo)));
233  TI_DBG4(("ossaDeviceHandleAccept: sasAddressLo 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSLO(&agDevInfo->commonDevInfo)));
234  TI_DBG4(("ossaDeviceHandleAccept: device type  0x%x\n", DEVINFO_GET_DEVICETTYPE(&agDevInfo->commonDevInfo)));
235  TI_DBG4(("ossaDeviceHandleAccept: phys %d\n", agDevInfo->numOfPhys));
236  TI_DBG4(("ossaDeviceHandleAccept: pid %d\n", onePortContext->id));
237
238  if (DEVINFO_GET_DEVICETTYPE(&agDevInfo->commonDevInfo) == SAS_END_DEVICE)
239  {
240    TI_DBG4(("ossaDeviceHandleAccept: SAS_END_DEVICE\n"));
241  }
242  else if (DEVINFO_GET_DEVICETTYPE(&agDevInfo->commonDevInfo) == SAS_EDGE_EXPANDER_DEVICE)
243  {
244    TI_DBG4(("ossaDeviceHandleAccept: SAS_EDGE_EXPANDER_DEVICE\n"));
245  }
246  else /* SAS_FANOUT_EXPANDER_DEVICE */
247  {
248    TI_DBG4(("ossaDeviceHandleAccept: SAS_FANOUT_EXPANDER_DEVICE\n"));
249  }
250  agSASSubID.sasAddressHi = SA_DEVINFO_GET_SAS_ADDRESSHI(&agDevInfo->commonDevInfo);
251  agSASSubID.sasAddressLo = SA_DEVINFO_GET_SAS_ADDRESSLO(&agDevInfo->commonDevInfo);
252  agSASSubID.initiator_ssp_stp_smp = agDevInfo->initiator_ssp_stp_smp;
253  agSASSubID.target_ssp_stp_smp = agDevInfo->target_ssp_stp_smp;
254
255
256  tdssAddSASToSharedcontext(
257                            onePortContext,
258                            agRoot,
259                            agDevHandle,
260                            &agSASSubID,
261                            agTRUE,
262                            0xFF,
263                            TD_OPERATION_TARGET
264                            );
265
266  /* at this point devicedata for new device exists */
267  oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
268
269  if (oneDeviceData == agNULL)
270  {
271    TI_DBG1(("ossaDeviceHandleAccept: NULL oneDeviceData; wrong\n"));
272    return OSSA_RC_REJECT;
273  }
274
275  oneDeviceData->registered = agTRUE;
276
277  tiDeviceHandle = &(oneDeviceData->tiDeviceHandle);
278
279  if (tiDeviceHandle == agNULL)
280  {
281    TI_DBG1(("ossaDeviceHandleAccept: NULL tiDeviceHandle; wrong\n"));
282    smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "Y0");
283    return OSSA_RC_REJECT;
284  }
285
286  /* setting MCN in agsaDeviceInfo_t*/
287  agDevInfo->commonDevInfo.flag = agDevInfo->commonDevInfo.flag | (tdsaAllShared->MCN << 16);
288  /* increment RegisteredDevNums */
289  onePortContext->RegisteredDevNums++;
290
291  *hostAssignedDeviceId |= 0xBEEF0000;
292
293  TI_DBG1(("ossaDeviceHandleAccept: Now hostAssignedDeviceId 0x%X\n", *hostAssignedDeviceId));
294
295
296  /* no login in SAS */
297  /*
298    osGLOBAL bit32 ostiTargetEvent (
299                        tiRoot_t          *tiRoot,
300                        tiPortalContext_t *portalContext,
301                        tiDeviceHandle_t  *tiDeviceHandle,
302                        tiTgtEventType_t  eventType,
303                        bit32             eventStatus,
304                        void              *parm
305                        );
306  */
307
308  ostiTargetEvent(
309                  tiRoot,
310                  tiPortalContext,
311                  tiDeviceHandle,
312                  tiTgtEventTypeDeviceChange,
313                  tiDeviceArrival,
314                  agNULL
315                  );
316  /* set MCN and initiator role bit using saSetDeviceInfo */
317  option = 24; /* setting MCN and initiator role 1 1000b*/
318  param = (1 << 18) | (tdsaAllShared->MCN << 24);
319  TI_DBG1(("ossaDeviceHandleAccept: option 0x%x param 0x%x MCN 0x%x\n", option, param, tdsaAllShared->MCN));
320  saSetDeviceInfo(agRoot, agNULL, 0, agDevHandle, option, param, ossaSetDeviceInfoCB);
321  smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "Y0");
322  return OSSA_RC_ACCEPT;
323#endif
324
325#ifdef INITIATOR_DRIVER
326  /* this function is not used in case of Initiator */
327  return OSSA_RC_ACCEPT;
328#endif
329}
330
331#ifdef INITIATOR_DRIVER
332/*****************************************************************************
333*! \brief ossaDiscoverSasCB
334*
335*  Purpose:  This function is called by lower layer to inform TD layer of
336*            SAS discovery results
337*
338*
339*  \param   agRoot         Pointer to chip/driver Instance.
340*  \param   agPortContext  Pointer to the port context of TD and Lower layer
341*  \param   event          event type
342*  \param   pParm1         Pointer to data associated with event
343*  \param   pParm2         Pointer to data associated with event
344*
345*  \return: none
346*
347*  \note -  For details, refer to SAS/SATA Low-Level API Specification
348*
349*****************************************************************************/
350osGLOBAL void ossaDiscoverSasCB(agsaRoot_t        *agRoot,
351                  agsaPortContext_t *agPortContext,
352                  bit32             event,
353                  void              *pParm1,
354                  void              *pParm2
355                  )
356{
357  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
358  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
359  tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)osData->tdsaAllShared;
360
361  tdsaPortContext_t    *onePortContext = agNULL;
362  tdsaDeviceData_t     *oneDeviceData = agNULL;
363
364  agsaDevHandle_t      *agDevHandle = agNULL;
365  agsaSASDeviceInfo_t  *agDeviceInfo = agNULL;
366  tiPortalContext_t    *tiPortalContext = agNULL;
367  tdList_t             *DeviceListList;
368  tdsaSASSubID_t       agSASSubID;
369
370  smTraceFuncEnter(hpDBG_VERY_LOUD,"Y1");
371  TI_DBG2(("ossaDiscoverSasCB: start\n"));
372
373  if (agPortContext == agNULL)
374  {
375    TI_DBG1(("ossaDiscoverSasCB: NULL agsaPortContext; wrong\n"));
376    return;
377  }
378
379  onePortContext = (tdsaPortContext_t *)agPortContext->osData;
380  tiPortalContext = (tiPortalContext_t *)onePortContext->tiPortalContext;
381
382  switch ( event )
383  {
384  case OSSA_DISCOVER_STARTED:
385  {
386    TI_DBG3(("ossaDiscoverSasCB: STARTED pid %d\n", onePortContext->id));
387    /*
388      invalidate all devices in current device list
389    */
390    DeviceListList = tdsaAllShared->MainDeviceList.flink;
391    while (DeviceListList != &(tdsaAllShared->MainDeviceList))
392    {
393      oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
394      TI_DBG3(("ossaDiscoverSasCB: loop did %d\n", oneDeviceData->id));
395      TI_DBG3(("ossaDiscoverSasCB: loop sasAddressHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
396      TI_DBG6(("ossaDiscoverSasCB: loop sasAddressLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
397      if (oneDeviceData->tdPortContext == onePortContext)
398      {
399        TI_DBG3(("ossaDiscoverSasCB: did %d is invalidated \n", oneDeviceData->id));
400        /* temporary solution: only for sata direct attached */
401      }
402      DeviceListList = DeviceListList->flink;
403    }
404    onePortContext->DiscoveryState = ITD_DSTATE_STARTED;
405    break;
406  }
407
408  case OSSA_DISCOVER_FOUND_DEVICE:
409  {
410    TI_DBG4(("ossaDiscoverSasCB: $$$$$ FOUND_DEVICE pid %d\n", onePortContext->id));
411    agDevHandle = (agsaDevHandle_t *)pParm1;
412    agDeviceInfo = (agsaSASDeviceInfo_t *)pParm2;
413    TI_DBG5(("ossaDiscoverSasCB: sasAddressHi 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSHI(&agDeviceInfo->commonDevInfo)));
414    TI_DBG5(("ossaDiscoverSasCB: sasAddressLo 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSLO(&agDeviceInfo->commonDevInfo)));
415    TI_DBG5(("ossaDiscoverSasCB: device type  0x%x\n", DEVINFO_GET_DEVICETTYPE(&agDeviceInfo->commonDevInfo)));
416
417    TI_DBG6(("ossaDiscoverSasCB: phys %d\n", agDeviceInfo->numOfPhys));
418    TI_DBG4(("ossaDiscoverSasCB: pid %d\n", onePortContext->id));
419
420
421    /* Add only target devices; do not add expander device */
422    if (DEVINFO_GET_DEVICETTYPE(&agDeviceInfo->commonDevInfo) == SAS_END_DEVICE)
423    {
424      agSASSubID.sasAddressHi = SA_DEVINFO_GET_SAS_ADDRESSHI(&agDeviceInfo->commonDevInfo);
425      agSASSubID.sasAddressLo = SA_DEVINFO_GET_SAS_ADDRESSLO(&agDeviceInfo->commonDevInfo);
426      agSASSubID.initiator_ssp_stp_smp = agDeviceInfo->initiator_ssp_stp_smp;
427      agSASSubID.target_ssp_stp_smp = agDeviceInfo->target_ssp_stp_smp;
428
429      TI_DBG2(("ossaDiscoverSasCB: adding ....\n"));
430
431      tdssAddSASToSharedcontext(
432                                onePortContext,
433                                agRoot,
434                                agDevHandle,
435                                &agSASSubID,
436                                agTRUE,
437                                agDeviceInfo->phyIdentifier,
438                                TD_OPERATION_INITIATOR
439                                );
440      ostiInitiatorEvent(
441                         tiRoot,
442                         tiPortalContext,
443                         agNULL,
444                         tiIntrEventTypeDeviceChange,
445                         tiDeviceArrival,
446                         agNULL
447                         );
448    }
449    else
450    {
451      TI_DBG5(("ossaDiscoverSasCB: $$$$$ not end device. not adding....\n"));
452    }
453
454
455    break;
456  }
457
458  case OSSA_DISCOVER_REMOVED_DEVICE:
459  {
460    TI_DBG3(("ossaDiscoverSasCB: REMOVED_DEVICE\n"));
461    agDevHandle = (agsaDevHandle_t *)pParm1;
462    agDeviceInfo = (agsaSASDeviceInfo_t *)pParm2;
463    oneDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
464
465    TI_DBG6(("ossaDiscoverSasCB: sasAddressHi 0x%08x\n",
466             SA_DEVINFO_GET_SAS_ADDRESSHI(&agDeviceInfo->commonDevInfo)));
467    TI_DBG6(("ossaDiscoverSasCB: sasAddressLo 0x%08x\n",
468             SA_DEVINFO_GET_SAS_ADDRESSLO(&agDeviceInfo->commonDevInfo)));
469    TI_DBG6(("ossaDiscoverSasCB: phys %d\n", agDeviceInfo->numOfPhys));
470    TI_DBG6(("ossaDiscoverSasCB: onePortContext->id %d\n", onePortContext->id));
471
472    if (oneDeviceData == agNULL)
473    {
474      TI_DBG1(("ossaDiscoverSasCB: Wrong. DevHandle->osData is NULL but is being removed\n"));
475    }
476    else
477    {
478      tdssRemoveSASFromSharedcontext(onePortContext,
479                                     oneDeviceData,
480                                     agRoot);
481      agDevHandle->osData = agNULL;
482      ostiInitiatorEvent(
483                         tiRoot,
484                         tiPortalContext,
485                         agNULL,
486                         tiIntrEventTypeDeviceChange,
487                         tiDeviceRemoval,
488                         agNULL
489                         );
490    }
491
492    break;
493  }
494  case OSSA_DISCOVER_COMPLETE:
495  {
496    TI_DBG2(("ossaDiscoverSasCB: SAS COMPLETE pid %d\n", onePortContext->id));
497    /*
498      note:
499      SAS discovery must be called before SATA discovery
500      "onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED" is
501      in ossaDiscoverSataCB not in ossaDiscoverSasCB when SATA_ENABLE
502    */
503#ifndef SATA_ENABLE
504    onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED;
505    TI_DBG6(("ossaDiscoverSasCB: COMPLETE pid %d\n", onePortContext->id));
506#endif
507
508#ifdef SATA_ENABLE
509    TI_DBG2(("ossaDiscoverSasCB: calling SATA discovery\n"));
510
511    /* Continue with SATA discovery */
512    saDiscover(agRoot, agPortContext, AG_SA_DISCOVERY_TYPE_SATA,
513               onePortContext->discoveryOptions);
514
515#else /* SATA not enable */
516
517#ifdef TD_INTERNAL_DEBUG /* for debugging */
518    /* dump device list */
519    DeviceListList = tdsaAllShared->MainPortContextList.flink;
520
521    while (DeviceListList != &(tdsaAllShared->MainPortContextList))
522    {
523      oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
524      TI_DBG2(("ossaDiscoverSasCB: did %d valid %d\n", oneDeviceData->id, oneDeviceData->valid));
525      TI_DBG2(("ossaDiscoverSasCB: device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
526      TI_DBG2(("ossaDiscoverSasCB: device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
527      DeviceListList = DeviceListList->flink;
528    }
529#endif
530
531    /* letting OS layer know discovery has been successfully complete */
532    ostiInitiatorEvent(
533                       tiRoot,
534                       tiPortalContext,
535                       agNULL,
536                       tiIntrEventTypeDiscovery,
537                       tiDiscOK,
538                       agNULL
539                       );
540#endif  /* SATA_ENABLE */
541
542    break;
543  }
544  case OSSA_DISCOVER_ABORT:
545  {
546    TI_DBG3(("ossaDiscoverSasCB: ABORT\n"));
547    /* letting OS layer know discovery has not been successfully complete */
548    ostiInitiatorEvent(
549                       tiRoot,
550                       tiPortalContext,
551                       agNULL,
552                       tiIntrEventTypeDiscovery,
553                       tiDiscFailed,
554                       agNULL
555                       );
556    break;
557  }
558  case OSSA_DISCOVER_ABORT_ERROR_1:
559  {
560    TI_DBG3(("ossaDiscoverSasCB: ERROR 1\n"));
561    /* letting OS layer know discovery has not been successfully complete */
562    ostiInitiatorEvent(
563                       tiRoot,
564                       tiPortalContext,
565                       agNULL,
566                       tiIntrEventTypeDiscovery,
567                       tiDiscFailed,
568                       agNULL
569                       );
570    break;
571  }
572
573  case OSSA_DISCOVER_ABORT_ERROR_2:
574  {
575    TI_DBG3(("ossaDiscoverSasCB: ERROR 2\n"));
576    /* letting OS layer know discovery has not been successfully complete */
577    ostiInitiatorEvent(
578                       tiRoot,
579                       tiPortalContext,
580                       agNULL,
581                       tiIntrEventTypeDiscovery,
582                       tiDiscFailed,
583                       agNULL
584                       );
585    break;
586  }
587
588  case OSSA_DISCOVER_ABORT_ERROR_3:
589  {
590    TI_DBG3(("ossaDiscoverSasCB: ERROR 3\n"));
591    /* letting OS layer know discovery has not been successfully complete */
592    ostiInitiatorEvent(
593                       tiRoot,
594                       tiPortalContext,
595                       agNULL,
596                       tiIntrEventTypeDiscovery,
597                       tiDiscFailed,
598                       agNULL
599                       );
600    break;
601  }
602  case OSSA_DISCOVER_ABORT_ERROR_4:
603  {
604    TI_DBG3(("ossaDiscoverSasCB: ERROR 4\n"));
605    /* letting OS layer know discovery has not been successfully complete */
606    ostiInitiatorEvent(
607                       tiRoot,
608                       tiPortalContext,
609                       agNULL,
610                       tiIntrEventTypeDiscovery,
611                       tiDiscFailed,
612                       agNULL
613                       );
614        break;
615  }
616  case OSSA_DISCOVER_ABORT_ERROR_5:
617  {
618    TI_DBG3(("ossaDiscoverSasCB: ERROR 5\n"));
619    /* letting OS layer know discovery has not been successfully complete */
620    ostiInitiatorEvent(
621                       tiRoot,
622                       tiPortalContext,
623                       agNULL,
624                       tiIntrEventTypeDiscovery,
625                       tiDiscFailed,
626                       agNULL
627                       );
628    break;
629  }
630  case OSSA_DISCOVER_ABORT_ERROR_6:
631  {
632    TI_DBG3(("ossaDiscoverSasCB: ERROR 6\n"));
633    /* letting OS layer know discovery has not been successfully complete */
634    ostiInitiatorEvent(
635                       tiRoot,
636                       tiPortalContext,
637                       agNULL,
638                       tiIntrEventTypeDiscovery,
639                       tiDiscFailed,
640                       agNULL
641                       );
642    break;
643  }
644  case OSSA_DISCOVER_ABORT_ERROR_7:
645  {
646    TI_DBG3(("ossaDiscoverSasCB: ERROR 7\n"));
647    /* letting OS layer know discovery has not been successfully complete */
648    ostiInitiatorEvent(
649                       tiRoot,
650                       tiPortalContext,
651                       agNULL,
652                       tiIntrEventTypeDiscovery,
653                       tiDiscFailed,
654                       agNULL
655                       );
656    break;
657  }
658  case OSSA_DISCOVER_ABORT_ERROR_8:
659  {
660    TI_DBG3(("ossaDiscoverSasCB: ERROR 8\n"));
661    /* letting OS layer know discovery has not been successfully complete */
662    ostiInitiatorEvent(
663                       tiRoot,
664                       tiPortalContext,
665                       agNULL,
666                       tiIntrEventTypeDiscovery,
667                       tiDiscFailed,
668                       agNULL
669                       );
670    break;
671  }
672  case OSSA_DISCOVER_ABORT_ERROR_9:
673  {
674    TI_DBG3(("ossaDiscoverSasCB: ERROR 9\n"));
675    /* letting OS layer know discovery has not been successfully complete */
676    ostiInitiatorEvent(
677                       tiRoot,
678                       tiPortalContext,
679                       agNULL,
680                       tiIntrEventTypeDiscovery,
681                       tiDiscFailed,
682                       agNULL
683                       );
684    break;
685  }
686  default:
687    TI_DBG3(("ossaDiscoverSasCB: ERROR default event 0x%x\n", event));
688    /* letting OS layer know discovery has not been successfully complete */
689    ostiInitiatorEvent(
690                       tiRoot,
691                       tiPortalContext,
692                       agNULL,
693                       tiIntrEventTypeDiscovery,
694                       tiDiscFailed,
695                       agNULL
696                       );
697    break;
698  } /* end of switch */
699  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y1");
700  return;
701}
702#endif // #ifdef INITIATOR_DRIVER
703
704osGLOBAL void ossaLogTrace0(
705               agsaRoot_t           *agRoot,
706               bit32               traceCode
707               )
708{
709  return;
710}
711
712osGLOBAL void ossaLogTrace1(
713               agsaRoot_t           *agRoot,
714               bit32               traceCode,
715               bit32               value1
716               )
717{
718  return;
719}
720
721osGLOBAL void ossaLogTrace2(
722               agsaRoot_t           *agRoot,
723               bit32               traceCode,
724               bit32               value1,
725               bit32               value2
726               )
727{
728  return;
729}
730
731osGLOBAL void ossaLogTrace3(
732               agsaRoot_t           *agRoot,
733               bit32               traceCode,
734               bit32               value1,
735               bit32               value2,
736               bit32               value3
737               )
738{
739  return;
740}
741
742
743osGLOBAL void
744ossaLogTrace4(
745               agsaRoot_t           *agRoot,
746               bit32               traceCode,
747               bit32               value1,
748               bit32               value2,
749               bit32               value3,
750               bit32               value4
751               )
752{
753  return;
754}
755
756
757/*****************************************************************************
758*! \brief ossaHwCB
759*
760*  Purpose:  This function is called by lower layer to inform TD layer of
761*            HW related results
762*
763*  \param   agRoot         Pointer to chip/driver Instance.
764*  \param   agPortContext  Pointer to the port context of TD and Lower layer
765*  \param   event          event type
766*  \param   eventParm1     event-specific parameter
767*  \param   eventParm2     event-specific parameter
768*  \param   eventParm3     event-specific parameter of pointer type
769*
770*  \return: none
771*
772*  \note -  For details, refer to SAS/SATA Low-Level API Specification
773*
774*****************************************************************************/
775osGLOBAL void ossaHwCB(
776         agsaRoot_t        *agRoot,
777         agsaPortContext_t *agPortContext,
778         bit32             event,
779         bit32             eventParm1,
780         void              *eventParm2,
781         void              *eventParm3
782         )
783{
784  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
785  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
786  tdsaContext_t       *tdsaAllShared = (tdsaContext_t *)osData->tdsaAllShared;
787  tdList_t            *PortContextList = agNULL;
788  tdsaPortContext_t   *onePortContext = agNULL;
789  agsaDevHandle_t     *agDevHandle = agNULL;
790  agsaSASIdentify_t   *IDframe = agNULL;
791  int                 i = 0;
792#ifdef INITIATOR_DRIVER
793  tdsaSASSubID_t      agSASSubID;
794#endif
795  bit32               PhyID;
796  bit32               PhyStatus;
797  bit32               LinkRate;
798  bit32               PortState;
799  bit32               HwAckSatus = AGSA_RC_SUCCESS;
800
801// #ifdef INITIATOR_DRIVER
802#ifdef INITIATOR_DRIVER
803  agsaFisRegDeviceToHost_t *RegD2H = agNULL;
804  tdsaDeviceData_t         *oneDeviceData = agNULL;
805  tdList_t                 *DeviceListList;
806#endif
807#ifdef REMOVED
808  bit32                    found = agFALSE;
809#endif
810  agsaHWEventEncrypt_t     *pEncryptCBData;
811  agsaEncryptInfo_t        *pEncryptInfo;
812  agsaHWEventMode_t        *pModeEvent;
813  tiEncryptPort_t          encryptEventData;
814  tiEncryptInfo_t          encryptInfo;
815  bit32                    *pModePage;
816  bit32                    securityMode;
817  bit32                    cipherMode;
818  bit32                    encryptStatus;
819  bit32                    securitySetModeStatus;
820  bit32                    securityModeStatus;
821
822// #endif /* INITIATOR_DRIVER */
823  agsaPhyErrCountersPage_t *agPhyErrCountersPage;
824  agsaEventSource_t        eventSource;
825
826#ifdef FDS_DM
827  dmRoot_t                 *dmRoot = &(tdsaAllShared->dmRoot);
828  dmPortContext_t          *dmPortContext = agNULL;
829  bit32                    status = DM_RC_FAILURE;
830  dmPortInfo_t             dmPortInfo;
831//  bit32                    discStatus = dmDiscInProgress;
832#endif
833
834  smTraceFuncEnter(hpDBG_VERY_LOUD,"Y2");
835
836  TI_DBG2(("ossaHwCB: agPortContext %p event 0x%x eventParm1 0x%x eventParm2 %p eventParm3 %p\n",
837                      agPortContext,event,eventParm1,eventParm2,eventParm3 ));
838
839  switch ( event )
840  {
841  case OSSA_HW_EVENT_SAS_PHY_UP:
842  {
843    PhyID = TD_GET_PHY_ID(eventParm1);
844    LinkRate = TD_GET_LINK_RATE(eventParm1);
845    PortState = TD_GET_PORT_STATE(eventParm1);
846    agDevHandle = agNULL;
847    IDframe = (agsaSASIdentify_t *)eventParm3;
848
849
850    TI_DBG2(("ossaHwCB: Phy%d SAS link Up\n", PhyID));
851
852    if (agPortContext == agNULL)
853    {
854      TI_DBG1(("ossaHwCB: agPortContext null, wrong\n"));
855      smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y2");
856      return;
857    }
858    if (agDevHandle == agNULL)
859    {
860      TI_DBG3(("ossaHwCB: agDevHandle null by design change\n"));
861    }
862
863    if (IDframe == agNULL)
864    {
865      TI_DBG1(("ossaHwCB: IDframe null, wrong\n"));
866      smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y2");
867      return;
868    }
869    /* debugging only */
870    if (LinkRate == 0x01)
871    {
872      TI_DBG1(("ossaHwCB: SAS Link Rate is 1.5 Gbps PhyID %d\n",PhyID));
873    }
874    if (LinkRate == 0x02)
875    {
876      TI_DBG1(("ossaHwCB: SAS Link Rate is 3.0 Gbps PhyID %d\n",PhyID));
877    }
878    if (LinkRate == 0x04)
879    {
880      TI_DBG1(("ossaHwCB: SAS Link Rate is 6.0 Gbps PhyID %d\n",PhyID));
881    }
882    if (LinkRate == 0x08)
883    {
884      TI_DBG1(("ossaHwCB: SAS Link Rate is 12.0 Gbps PhyID %d\n",PhyID));
885    }
886
887    if (PortState == OSSA_PORT_INVALID)
888    {
889      TI_DBG1(("ossaHwCB: Wrong port state with SAS link up\n"));
890      smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Y2");
891      return;
892    }
893
894    if ( agPortContext->osData == agNULL)
895    {/* if */
896      TI_DBG6 (("ossaHwCB: PhyID %d tdsaAllShared %p\n", PhyID, tdsaAllShared));
897      if (tdsaAllShared->Ports[PhyID].tiPortalContext == agNULL)
898      {
899        TI_DBG6(("ossaHwCB: NULL portalcontext\n"));
900      }
901      else
902      {
903        TI_DBG6(("ossaHwCB: NOT NULL portalcontext\n"));
904      }
905
906      if (IDframe == agNULL)
907      {
908        TI_DBG1(("ossaHwCB: IDFrame is NULL; SATA !!!!\n"));
909      }
910      else
911      {
912        TI_DBG3(("ossaHwCB: IDframe->sasAddressHi 0x%08x \n",
913                 SA_IDFRM_GET_SAS_ADDRESSHI(IDframe)));
914        TI_DBG3(("ossaHwCB: IDframe->sasAddressLo 0x%08x \n",
915                 SA_IDFRM_GET_SAS_ADDRESSLO(IDframe)));
916
917      }
918      /*
919        setting tdsaPortContext fields
920        take the head from the FreeLink of tdsaPortContext_t
921        then modify it
922        then put it in MainLink of tdsaPortContext_t
923      */
924      tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
925      if (TDLIST_NOT_EMPTY(&(tdsaAllShared->FreePortContextList)))
926      {
927        TDLIST_DEQUEUE_FROM_HEAD(&PortContextList, &(tdsaAllShared->FreePortContextList));
928        tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
929        onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, FreeLink, PortContextList);
930        TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
931        TI_DBG6(("ossaHwCB: onePortContext %p\n", onePortContext));
932        if (onePortContext == agNULL)
933        {
934          TI_DBG1(("ossaHwCB: onePortContext is NULL in allocation, wrong!\n"));
935          return;
936        }
937
938        /* sets fields of tdsaportcontext */
939#ifdef INITIATOR_DRIVER
940        onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
941        onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
942#endif
943        onePortContext->PhyIDList[PhyID] = agTRUE;
944        if (IDframe == agNULL)
945        {
946          onePortContext->sasRemoteAddressHi = 0xFFFFFFFF;
947          onePortContext->sasRemoteAddressLo = 0xFFFFFFFF;
948          onePortContext->directAttatchedSAS = agTRUE;
949        }
950        else
951        {
952          onePortContext->sasRemoteAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(IDframe);
953          onePortContext->sasRemoteAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(IDframe);
954          /* Create ID frame and storing ID frame */
955          osti_memcpy(&onePortContext->sasIDframe, IDframe, sizeof(agsaSASIdentify_t));
956          tdhexdump("ossaHWCB: sasIDframe", (bit8 *)(&onePortContext->sasIDframe), sizeof(agsaSASIdentify_t));
957          if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_END_DEVICE)
958          {
959            onePortContext->directAttatchedSAS = agTRUE;
960          }
961#ifdef FDS_DM
962          if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_EDGE_EXPANDER_DEVICE ||
963              SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_FANOUT_EXPANDER_DEVICE
964             )
965          {
966            onePortContext->UseDM = agTRUE;
967          }
968#endif
969        }
970
971        onePortContext->sasLocalAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&tdsaAllShared->Ports[PhyID].SASID);
972        onePortContext->sasLocalAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&tdsaAllShared->Ports[PhyID].SASID);
973        onePortContext->tiPortalContext = tdsaAllShared->Ports[PhyID].tiPortalContext;
974        onePortContext->agRoot = agRoot;
975        onePortContext->agPortContext = agPortContext;
976        tdsaAllShared->Ports[PhyID].portContext = onePortContext;
977        agPortContext->osData = onePortContext;
978        onePortContext->valid = agTRUE;
979        if (LinkRate == 0x01)
980        {
981          onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
982        }
983        else if (LinkRate == 0x02)
984        {
985          onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
986        }
987        else if (LinkRate == 0x04)
988        {
989          onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
990        }
991        else /* (LinkRate == 0x08) */
992        {
993          onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
994        }
995
996        tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
997        TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->MainLink), &(tdsaAllShared->MainPortContextList));
998        tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
999#ifdef FDS_DM
1000        dmPortContext = &(onePortContext->dmPortContext);
1001        dmPortContext->tdData = onePortContext;
1002        /* set up dmPortInfo_t */
1003        PORTINFO_PUT_SAS_REMOTE_ADDRESSLO(&dmPortInfo, onePortContext->sasRemoteAddressLo);
1004        PORTINFO_PUT_SAS_REMOTE_ADDRESSHI(&dmPortInfo, onePortContext->sasRemoteAddressHi);
1005        PORTINFO_PUT_SAS_LOCAL_ADDRESSLO(&dmPortInfo, onePortContext->sasLocalAddressLo);
1006        PORTINFO_PUT_SAS_LOCAL_ADDRESSHI(&dmPortInfo, onePortContext->sasLocalAddressHi);
1007
1008        TI_DBG2(("ossaHwCB: phy %d hi 0x%x lo 0x%x\n", PhyID,
1009                 SA_IDFRM_GET_SAS_ADDRESSHI(&(tdsaAllShared->Ports[PhyID].SASID)),
1010                 SA_IDFRM_GET_SAS_ADDRESSLO(&(tdsaAllShared->Ports[PhyID].SASID))));
1011        TI_DBG2(("ossaHwCB: LocalAddrHi 0x%08x LocaAddrLo 0x%08x\n", onePortContext->sasLocalAddressHi, onePortContext->sasLocalAddressLo));
1012
1013        dmPortInfo.flag = onePortContext->LinkRate;
1014
1015        if (onePortContext->UseDM == agTRUE)
1016        {
1017          TI_DBG1(("ossaHwCB: calling dmCreatePort\n"));
1018          status = dmCreatePort(dmRoot, dmPortContext, &dmPortInfo);
1019          if (status != DM_RC_SUCCESS)
1020          {
1021            TI_DBG1(("ossaHwCB: dmCreatePort failed!!! 0x%x\n", status));
1022          }
1023        }
1024#endif
1025
1026      }
1027      else
1028      {
1029        tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1030        TI_DBG1(("\nossaHwCB: Attention!!! no more free PortContext.\n"));
1031      }
1032#ifdef TD_INTERNAL_DEBUG     /* for debugging only */
1033
1034      print_tdlist_flink(&(tdsaPortContext->FreeLink), 1, 1);
1035      print_tdlist_flink(&(tdsaPortContext->MainLink), 1, 2);
1036      print_tdlist_flink(&(tdsaDeviceData->FreeLink), 2, 1);
1037      print_tdlist_flink(&(tdsaDeviceData->MainLink), 2, 2);
1038#endif
1039
1040#ifdef TD_INTERNAL_DEBUG      /* for debugging */
1041      PortContextList = tdsaPortContext->MainLink.flink;
1042      while (PortContextList != &(tdsaPortContext->MainLink))
1043      {
1044        twoPortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, PortContextList);
1045        TI_DBG6(("ossaHwCB: in while portContext ID %d\n", twoPortContext->id));
1046        TI_DBG6(("ossaHwCB: in while PortContext %p\n", twoPortContext));
1047        PortContextList = PortContextList->flink;
1048      }
1049#endif
1050      /* add agDevHandle */
1051      if (SA_IDFRM_GET_DEVICETTYPE(IDframe) != SAS_NO_DEVICE)
1052      {
1053#ifdef INITIATOR_DRIVER
1054        agSASSubID.sasAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(IDframe);
1055        agSASSubID.sasAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(IDframe);
1056        agSASSubID.initiator_ssp_stp_smp = IDframe->initiator_ssp_stp_smp;
1057        agSASSubID.target_ssp_stp_smp = IDframe->target_ssp_stp_smp;
1058#endif
1059
1060        TI_DBG2(("ossaHwCB: adding ....\n"));
1061        /* uses only SASIDframe not agsaSASDeviceInfo_t */
1062#ifdef INITIATOR_DRIVER
1063        tdssAddSASToSharedcontext(
1064                                  onePortContext,
1065                                  agRoot,
1066                                  agDevHandle, /* agNULL */
1067                                  &agSASSubID,
1068                                  agTRUE,
1069                                  (bit8)PhyID,
1070                                  TD_OPERATION_INITIATOR
1071                                  );
1072#endif
1073
1074#ifdef FDS_DM
1075        if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_END_DEVICE &&
1076            SA_IDFRM_IS_SSP_TARGET(IDframe) )
1077        {
1078          TI_DBG2(("ossaHwCB: NOTIFY_ENABLE_SPINUP PhyID %d \n", PhyID));
1079
1080          for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
1081          {
1082            saLocalPhyControl(agRoot, agNULL, 0, PhyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
1083          }
1084        }
1085
1086        /* update MCN */
1087        tdsaUpdateMCN(dmRoot, onePortContext);
1088#endif
1089
1090#ifdef TARGET_DRIVER
1091        TI_DBG1(("ossaHwCB: target, link up PhyID 0x%x\n",PhyID));
1092
1093        /* notifying link up */
1094        ostiPortEvent (
1095                       tiRoot,
1096                       tiPortLinkUp,
1097                       tiSuccess,
1098                       (void *)tdsaAllShared->Ports[PhyID].tiPortalContext
1099                       );
1100#endif
1101      }
1102      else
1103      {
1104        TI_DBG5(("ossaHwCB: $$$$$ not end device. not adding....\n"));
1105      }
1106
1107      saPortControl(agRoot, /* AGSA_PORT_SET_PORT_RECOVERY_TIME */
1108                    agNULL,
1109                    0,
1110                    agPortContext,
1111                    AGSA_PORT_SET_PORT_RECOVERY_TIME,
1112                    tdsaAllShared->portTMO, //PORT_RECOVERY_TIMEOUT
1113                    0
1114                    );
1115      /* setting SAS PORT RESET TMO and SATA PORT RESET TMO*/
1116      if (tIsSPCV12G(agRoot))
1117      {
1118        saPortControl(agRoot, /* AGSA_PORT_SET_PORT_RESET_TIME */
1119                      agNULL,
1120                      0,
1121                      agPortContext,
1122                      AGSA_PORT_SET_PORT_RESET_TIME,
1123                      SAS_12G_PORT_RESET_TMO, // 800 ms
1124                      0
1125                      );
1126      }
1127      else
1128      {
1129        saPortControl(agRoot, /* AGSA_PORT_SET_PORT_RESET_TIME */
1130                      agNULL,
1131                      0,
1132                      agPortContext,
1133                      AGSA_PORT_SET_PORT_RESET_TIME,
1134                      SAS_PORT_RESET_TMO, // 300 ms
1135                      0
1136                      );
1137      }
1138    }
1139    else
1140    {
1141      /*
1142        an existing portcontext
1143        to be tested
1144      */
1145
1146      TI_DBG2(("ossaHwCB: SAS existing portcontext returned\n"));
1147
1148      onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
1149      if (onePortContext == agNULL)
1150      {
1151        TI_DBG1(("ossaHwCB: onePortContext is NULL, wrong!\n"));
1152        return;
1153      }
1154      if (onePortContext->valid == agFALSE)
1155      {
1156        /* port has been invalidated; needs to be allocated */
1157        TI_DBG2(("ossaHwCB: SAS allocating port context\n"));
1158
1159        tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1160        if (TDLIST_NOT_EMPTY(&(tdsaAllShared->FreePortContextList)))
1161        {
1162          TDLIST_DEQUEUE_FROM_HEAD(&PortContextList, &(tdsaAllShared->FreePortContextList));
1163          tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1164          onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, FreeLink, PortContextList);
1165          TI_DBG2(("ossaHwCB: allocating pid %d\n", onePortContext->id));
1166          TI_DBG6(("ossaHwCB: allocating onePortContext %p\n", onePortContext));
1167          if (onePortContext == agNULL)
1168          {
1169            TI_DBG1(("ossaHwCB: onePortContext is NULL in allocation, wrong!\n"));
1170            return;
1171          }
1172          /* sets fields of tdsaportcontext */
1173#ifdef INITIATOR_DRIVER
1174          onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
1175          onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
1176#endif
1177          onePortContext->PhyIDList[PhyID] = agTRUE;
1178          if (IDframe == agNULL)
1179          {
1180            onePortContext->sasRemoteAddressHi = 0xFFFFFFFF;
1181            onePortContext->sasRemoteAddressLo = 0xFFFFFFFF;
1182            onePortContext->directAttatchedSAS = agTRUE;
1183          }
1184          else
1185          {
1186            onePortContext->sasRemoteAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(IDframe);
1187            onePortContext->sasRemoteAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(IDframe);
1188            /* Create ID frame and storing ID frame */
1189            osti_memcpy(&onePortContext->sasIDframe, IDframe, sizeof(agsaSASIdentify_t));
1190            tdhexdump("ossaHWCB: sasIDframe", (bit8 *)(&onePortContext->sasIDframe), sizeof(agsaSASIdentify_t));
1191            if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_END_DEVICE)
1192            {
1193              onePortContext->directAttatchedSAS = agTRUE;
1194            }
1195          }
1196
1197          onePortContext->sasLocalAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&tdsaAllShared->Ports[PhyID].SASID);
1198          onePortContext->sasLocalAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&tdsaAllShared->Ports[PhyID].SASID);
1199          onePortContext->tiPortalContext = tdsaAllShared->Ports[PhyID].tiPortalContext;
1200          onePortContext->agRoot = agRoot;
1201          onePortContext->agPortContext = agPortContext;
1202          tdsaAllShared->Ports[PhyID].portContext = onePortContext;
1203          agPortContext->osData = onePortContext;
1204          onePortContext->valid = agTRUE;
1205          if (LinkRate == 0x01)
1206          {
1207            onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
1208          }
1209          else if (LinkRate == 0x02)
1210          {
1211            onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
1212          }
1213          else if (LinkRate == 0x04)
1214          {
1215            onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
1216          }
1217          else /* (LinkRate == 0x08) */
1218          {
1219            onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
1220          }
1221          tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1222          TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->MainLink), &(tdsaAllShared->MainPortContextList));
1223          tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1224        }
1225        else
1226        {
1227          tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1228          TI_DBG1(("\nossaHwCB: Attention!!! no more free PortContext.\n"));
1229          smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "Y2");
1230          return;
1231        }
1232      } /* invalidated port */
1233      else
1234      {
1235        /* already alloacated */
1236        TI_DBG2(("ossaHwCB: SAS already allocated port context\n"));
1237        if (TDLIST_EMPTY(&(tdsaAllShared->MainPortContextList)))
1238        {
1239          TI_DBG1(("ossaHwCB: wrong!!!  null tdsaPortContext list\n"));
1240          smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "Y2");
1241          return;
1242        }
1243        if (onePortContext == agNULL)
1244        {
1245          TI_DBG1(("ossaHwCB: wrong !!! No corressponding tdsaPortContext\n"));
1246          smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "Y2");
1247          return;
1248        }
1249
1250        TI_DBG2(("ossaHwCB: existing pid %d\n", onePortContext->id));
1251        if (tdsaAllShared->Ports[PhyID].portContext == agNULL)
1252        {
1253          TI_DBG1(("ossaHwCB: existing allshared pid is NULL\n"));
1254        }
1255        else
1256        {
1257          TI_DBG2(("ossaHwCB: existing allshared pid %d\n", tdsaAllShared->Ports[PhyID].portContext->id));
1258        }
1259        /* updates PhyID belong to a port */
1260        onePortContext->PhyIDList[PhyID] = agTRUE;
1261#ifdef FDS_DM
1262        if (SA_IDFRM_GET_DEVICETTYPE(IDframe) == SAS_END_DEVICE &&
1263            SA_IDFRM_IS_SSP_TARGET(IDframe) )
1264        {
1265          TI_DBG2(("ossaHwCB: NOTIFY_ENABLE_SPINUP PhyID %d \n", PhyID));
1266
1267          for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
1268          {
1269            saLocalPhyControl(agRoot, agNULL, 0, PhyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
1270          }
1271        }
1272
1273        /* update MCN */
1274        tdsaUpdateMCN(dmRoot, onePortContext);
1275#endif
1276      }
1277      onePortContext->SeenLinkUp = agTRUE;
1278    } /* else, old portcontext */
1279
1280    break;
1281  }
1282#ifdef INITIATOR_DRIVER
1283  case OSSA_HW_EVENT_SATA_PHY_UP:
1284  {
1285    PhyID = TD_GET_PHY_ID(eventParm1);
1286    LinkRate = TD_GET_LINK_RATE(eventParm1);
1287    PortState = TD_GET_PORT_STATE(eventParm1);
1288    agDevHandle = agNULL;
1289    RegD2H = ( agsaFisRegDeviceToHost_t *)eventParm3;
1290
1291    TI_DBG2(("ossaHwCB: Phy%d SATA link Up\n", PhyID));
1292
1293    if (agDevHandle == agNULL)
1294    {
1295      TI_DBG3(("ossaHwCB: agDevHandle null by design change\n"));
1296    }
1297
1298    if (RegD2H == agNULL)
1299    {
1300      TI_DBG1(("ossaHwCB: RegD2H null, wrong\n"));
1301      smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "Y2");
1302      return;
1303    }
1304
1305
1306    TI_DBG2(("ossaHwCB: agDevHandle %p\n", agDevHandle));
1307    tdhexdump("ossaHWCB RegD2H", (bit8 *)RegD2H, sizeof(agsaFisRegDeviceToHost_t));
1308    TI_DBG2(("ossaHwCB: Sector Count %d\n", RegD2H->d.sectorCount));
1309    TI_DBG2(("ossaHwCB: LBA LOW %d\n", RegD2H->d.lbaLow));
1310    TI_DBG2(("ossaHwCB: LBA MID  %d\n", RegD2H->d.lbaMid));
1311    TI_DBG2(("ossaHwCB: LBA HIGH  %d\n", RegD2H->d.lbaHigh));
1312    TI_DBG2(("ossaHwCB: DEVICE  %d\n", RegD2H->d.device));
1313
1314    /* debugging only */
1315    if (LinkRate == 0x01)
1316    {
1317      TI_DBG1(("ossaHwCB: SATA Link Rate is 1.5 Gbps PhyID %d\n",PhyID));
1318    }
1319    if (LinkRate == 0x02)
1320    {
1321      TI_DBG1(("ossaHwCB: SATA Link Rate is 3.0 Gbps PhyID %d\n",PhyID));
1322    }
1323    if (LinkRate == 0x04)
1324    {
1325      TI_DBG1(("ossaHwCB: SATA Link Rate is 6.0 Gbps PhyID %d\n",PhyID));
1326    }
1327    if (LinkRate == 0x08)
1328    {
1329      TI_DBG1(("ossaHwCB: SATA Link Rate is 12.0 Gbps PhyID %d\n",PhyID));
1330    }
1331
1332    if (PortState == OSSA_PORT_INVALID)
1333    {
1334      TI_DBG1(("ossaHwCB: Wrong port state with SATA link up\n"));
1335      smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "Y2");
1336      return;
1337    }
1338
1339    if ( agPortContext->osData == agNULL)
1340    {/* if */
1341      TI_DBG6 (("ossaHwCB: PhyID %d tdsaAllShared %p\n", PhyID, tdsaAllShared));
1342      tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1343      if (TDLIST_NOT_EMPTY(&(tdsaAllShared->FreePortContextList)))
1344      {
1345        TDLIST_DEQUEUE_FROM_HEAD(&PortContextList, &(tdsaAllShared->FreePortContextList));
1346        tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1347        onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, FreeLink, PortContextList);
1348        TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
1349        TI_DBG6(("ossaHwCB: onePortContext %p\n", onePortContext));
1350        if (onePortContext == agNULL)
1351        {
1352          TI_DBG1(("ossaHwCB: onePortContext is NULL in allocation, wrong!\n"));
1353          return;
1354        }
1355
1356        /* sets fields of tdsaportcontext */
1357        onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
1358        onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
1359        onePortContext->PhyIDList[PhyID] = agTRUE;
1360        /* NO sas address for SATA */
1361        onePortContext->sasRemoteAddressHi = 0xFFFFFFFF;
1362        onePortContext->sasRemoteAddressLo = 0xFFFFFFFF;
1363        /* copying the signature */
1364        onePortContext->remoteSignature[0] = RegD2H->d.sectorCount;
1365        onePortContext->remoteSignature[1] = RegD2H->d.lbaLow;
1366        onePortContext->remoteSignature[2] = RegD2H->d.lbaMid;
1367        onePortContext->remoteSignature[3] = RegD2H->d.lbaHigh;
1368        onePortContext->remoteSignature[4] = RegD2H->d.device;
1369
1370        onePortContext->sasLocalAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&tdsaAllShared->Ports[PhyID].SASID);
1371        onePortContext->sasLocalAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&tdsaAllShared->Ports[PhyID].SASID);
1372        onePortContext->tiPortalContext = tdsaAllShared->Ports[PhyID].tiPortalContext;
1373        onePortContext->agRoot = agRoot;
1374        onePortContext->agPortContext = agPortContext;
1375        tdsaAllShared->Ports[PhyID].portContext = onePortContext;
1376        agPortContext->osData = onePortContext;
1377        onePortContext->nativeSATAMode = agTRUE;
1378        onePortContext->valid = agTRUE;
1379        if (LinkRate == 0x01)
1380        {
1381          onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
1382        }
1383        else if (LinkRate == 0x02)
1384        {
1385          onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
1386        }
1387        else if (LinkRate == 0x04)
1388        {
1389          onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
1390        }
1391        else /* (LinkRate == 0x08) */
1392        {
1393          onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
1394        }
1395
1396        tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1397        TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->MainLink), &(tdsaAllShared->MainPortContextList));
1398        tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1399      }
1400      else
1401      {
1402        tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1403        TI_DBG1(("\nossaHwCB: Attention!!! no more free PortContext.\n"));
1404        smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "Y2");
1405        return;
1406      }
1407#ifdef SATA_ENABLE
1408      /* tdssAddSATAToSharedcontext() sends identify device data to find out the uniqueness of
1409         target. In identify device data CB fn (satAddSATAIDDevCB()),
1410         tiPortLinkUp and tiPortDiscoveryReady happen
1411      */
1412      tdssAddSATAToSharedcontext(
1413                                  onePortContext,
1414                                  agRoot,
1415                                  agDevHandle, /* agNULL */
1416                                  agNULL,
1417                                  agTRUE,
1418                                  (bit8)PhyID
1419                                  );
1420#endif
1421      /* setting SAS PORT RESET TMO and SATA PORT RESET TMO*/
1422      saPortControl(agRoot, /* AGSA_PORT_SET_PORT_RESET_TIME */
1423                    agNULL,
1424                    0,
1425                    agPortContext,
1426                    AGSA_PORT_SET_PORT_RESET_TIME,
1427                    0,
1428                    SATA_PORT_RESET_TMO // 8000 ms
1429                    );
1430
1431    }
1432    else
1433    {
1434      /*
1435        an existing portcontext
1436        to be tested
1437      */
1438
1439      TI_DBG1(("ossaHwCB: SATA existing portcontext returned. need testing\n"));
1440      onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
1441      /* for debugging only */
1442      if (onePortContext->valid == agFALSE)
1443      {
1444        /* port has been invalidated; needs to be allocated */
1445        TI_DBG2(("ossaHwCB: SATA allocating port context\n"));
1446      }
1447      else
1448      {
1449        /* already alloacated */
1450        TI_DBG1(("ossaHwCB: Wrong!!! SATA already allocated port context\n"));
1451        smTraceFuncExit(hpDBG_VERY_LOUD, 'j', "Y2");
1452        return;
1453      }
1454
1455      tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1456      if (TDLIST_NOT_EMPTY(&(tdsaAllShared->FreePortContextList)))
1457      {
1458        TDLIST_DEQUEUE_FROM_HEAD(&PortContextList, &(tdsaAllShared->FreePortContextList));
1459        tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1460        onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, FreeLink, PortContextList);
1461        TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
1462        TI_DBG6(("ossaHwCB: onePortContext %p\n", onePortContext));
1463        if (onePortContext == agNULL)
1464        {
1465          TI_DBG1(("ossaHwCB: onePortContext is NULL in allocation, wrong!\n"));
1466          return;
1467        }
1468
1469        /* sets fields of tdsaportcontext */
1470        onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
1471        onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
1472        onePortContext->PhyIDList[PhyID] = agTRUE;
1473        /* NO sas address for SATA */
1474        onePortContext->sasRemoteAddressHi = 0xFFFFFFFF;
1475        onePortContext->sasRemoteAddressLo = 0xFFFFFFFF;
1476        /* copying the signature */
1477        onePortContext->remoteSignature[0] = RegD2H->d.sectorCount;
1478        onePortContext->remoteSignature[1] = RegD2H->d.lbaLow;
1479        onePortContext->remoteSignature[2] = RegD2H->d.lbaMid;
1480        onePortContext->remoteSignature[3] = RegD2H->d.lbaHigh;
1481        onePortContext->remoteSignature[4] = RegD2H->d.device;
1482
1483        onePortContext->sasLocalAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(&tdsaAllShared->Ports[PhyID].SASID);
1484        onePortContext->sasLocalAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(&tdsaAllShared->Ports[PhyID].SASID);
1485        onePortContext->tiPortalContext = tdsaAllShared->Ports[PhyID].tiPortalContext;
1486        onePortContext->agRoot = agRoot;
1487        onePortContext->agPortContext = agPortContext;
1488        tdsaAllShared->Ports[PhyID].portContext = onePortContext;
1489        agPortContext->osData = onePortContext;
1490        onePortContext->nativeSATAMode = agTRUE;
1491        onePortContext->valid = agTRUE;
1492        if (LinkRate == 0x01)
1493        {
1494          onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
1495        }
1496        else if (LinkRate == 0x02)
1497        {
1498          onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
1499        }
1500        else if (LinkRate == 0x04)
1501        {
1502          onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
1503        }
1504        else /* (LinkRate == 0x08) */
1505        {
1506          onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
1507        }
1508
1509        tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
1510        TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->MainLink), &(tdsaAllShared->MainPortContextList));
1511        tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1512      }
1513      else
1514      {
1515        tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
1516        TI_DBG1(("\nossaHwCB: Attention!!! no more free PortContext.\n"));
1517        smTraceFuncExit(hpDBG_VERY_LOUD, 'k', "Y2");
1518        return;
1519      }
1520
1521
1522      /*hotplug */
1523#ifdef SATA_ENABLE
1524      tdssAddSATAToSharedcontext(
1525                                  onePortContext,
1526                                  agRoot,
1527                                  agDevHandle, /* agNULL */
1528                                  agNULL,
1529                                  agTRUE,
1530                                  (bit8)PhyID
1531                                  );
1532#endif
1533    /* end hotplug */
1534    }
1535
1536    break;
1537  }
1538#endif
1539  case OSSA_HW_EVENT_SATA_SPINUP_HOLD:
1540  {
1541    PhyID = TD_GET_PHY_ID(eventParm1);
1542
1543    TI_DBG2(("ossaHwCB: spinup hold PhyID %d\n", PhyID));
1544    break;
1545  }
1546
1547  case OSSA_HW_EVENT_PHY_DOWN:
1548  {
1549    bit32 AllPhyDown = agTRUE;
1550
1551    /* 4/15/08 spec */
1552    PhyID = TD_GET_PHY_ID(eventParm1);
1553    LinkRate = TD_GET_LINK_RATE(eventParm1);
1554    PortState = TD_GET_PORT_STATE(eventParm1);
1555
1556
1557    TI_DBG2(("ossaHwCB: Phy%d link Down\n", PhyID));
1558
1559    if (agPortContext == agNULL)
1560    {
1561      TI_DBG1(("ossaHwCB: agPortContext null, wrong\n"));
1562      smTraceFuncExit(hpDBG_VERY_LOUD, 'l', "Y2");
1563      return;
1564    }
1565
1566    if ( agPortContext->osData == agNULL)
1567    { /* if */
1568      /* PortContext must exit at this point */
1569      TI_DBG1(("ossaHwCB: NULL portalcontext. Error. Can't be NULL\n"));
1570    }
1571    else
1572    {
1573      TI_DBG3(("ossaHwCB: NOT NULL portalcontext\n"));
1574      onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
1575      if (onePortContext == agNULL)
1576      {
1577        TI_DBG1(("ossaHwCB: wrong !!! No corressponding tdsaPortContext\n"));
1578        smTraceFuncExit(hpDBG_VERY_LOUD, 'm', "Y2");
1579        return;
1580      }
1581      onePortContext->PhyIDList[PhyID] = agFALSE;
1582      for(i=0;i<TD_MAX_NUM_PHYS;i++)
1583      {
1584        if (onePortContext->PhyIDList[i] == agTRUE)
1585        {
1586          TI_DBG3(("ossaHwCB: Phy %d is still up\n", i));
1587          AllPhyDown = agFALSE;
1588          break;
1589        }
1590      }
1591
1592      /* last phy belong to the portcontext */
1593      if (AllPhyDown == agTRUE)
1594      {
1595#ifdef NOT_YET
1596        TI_DBG1(("ossaHwCB: calling tiPortLinkDown\n"));
1597        ostiPortEvent (
1598                       tiRoot,
1599                       tiPortLinkDown,
1600                       tiSuccess,
1601                       (void *)onePortContext->tiPortalContext
1602                       );
1603#endif
1604      }
1605
1606      if (PortState == OSSA_PORT_VALID)
1607      {
1608        /* do nothing */
1609        /* no ack for every phy down */
1610#ifdef FDS_DM
1611        /* update MCN for all devices belong to this port */
1612        tdsaUpdateMCN(dmRoot, onePortContext);
1613#endif
1614      }
1615      else if (PortState == OSSA_PORT_LOSTCOMM)
1616      {
1617        /*
1618         1. Mark the port as invalid and stop the io for that port and its device
1619         No ack here. Otherwise, port will be released by FW.
1620        */
1621        TI_DBG2(("ossaHwCB: phy Down and OSSA_PORT_LOSTCOMM\n"));
1622        /* save eventSource related information in tdsaAllShared */
1623        tdsaAllShared->eventSource[PhyID].EventValid =  agTRUE;
1624        tdsaAllShared->eventSource[PhyID].Source.agPortContext =  agPortContext;
1625        tdsaAllShared->eventSource[PhyID].Source.event =  OSSA_HW_EVENT_PHY_DOWN;
1626        /* phy ID */
1627        tdsaAllShared->eventSource[PhyID].Source.param =  PhyID;
1628        /* phy ID */
1629        onePortContext->eventPhyID = PhyID;
1630        /* to stop IO's */
1631        onePortContext->valid = agFALSE;
1632        break;
1633      }
1634      else if (PortState == OSSA_PORT_IN_RESET)
1635      {
1636        TI_DBG2(("ossaHwCB: phy Down and OSSA_PORT_IN_RESET\n"));
1637        /* save eventSource related information in tdsaAllShared */
1638        tdsaAllShared->eventSource[PhyID].EventValid =  agTRUE;
1639        tdsaAllShared->eventSource[PhyID].Source.agPortContext =  agPortContext;
1640        tdsaAllShared->eventSource[PhyID].Source.event =  OSSA_HW_EVENT_PHY_DOWN;
1641        /* phy ID */
1642        tdsaAllShared->eventSource[PhyID].Source.param =  PhyID;
1643        /* phy ID */
1644        onePortContext->eventPhyID = PhyID;
1645        /* to stop IO's */
1646        onePortContext->valid = agFALSE;
1647        break;
1648      }
1649      else if (PortState == OSSA_PORT_INVALID)
1650      {
1651        TI_DBG1(("ossaHwCB: Last phy Down and port invalid OSSA_PORT_INVALID\n"));
1652        /*
1653          invalidate port
1654          then, saHwEventAck() in ossaDeregisterDeviceHandleCB()
1655        */
1656
1657        /* save eventSource related information in tdsaAllShared */
1658        tdsaAllShared->eventSource[PhyID].EventValid =  agTRUE;
1659        tdsaAllShared->eventSource[PhyID].Source.agPortContext =  agPortContext;
1660        tdsaAllShared->eventSource[PhyID].Source.event =  OSSA_HW_EVENT_PHY_DOWN;
1661        /* phy ID */
1662        tdsaAllShared->eventSource[PhyID].Source.param =  PhyID;
1663        /* phy ID */
1664        onePortContext->eventPhyID = PhyID;
1665
1666        onePortContext->valid = agFALSE;
1667
1668        TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
1669#ifdef INITIATOR_DRIVER
1670        /* notifying link down (all links belonging to a port are down) */
1671        ostiPortEvent(
1672                      tiRoot,
1673                      tiPortStopped,
1674                      tiSuccess,
1675                      (void *)onePortContext->tiPortalContext
1676                      );
1677#endif
1678
1679#ifdef TARGET_DRIVER
1680        ostiPortEvent(
1681                      tiRoot,
1682                      tiPortLinkDown,
1683                      tiSuccess,
1684                      (void *)onePortContext->tiPortalContext
1685                      );
1686
1687#endif
1688
1689#ifdef INITIATOR_DRIVER
1690        tdssReportRemovals(agRoot,
1691                         onePortContext,
1692                         agFALSE
1693                        );
1694#endif
1695#ifdef TARGET_DRIVER
1696        ttdssReportRemovals(agRoot,
1697                            onePortContext,
1698                            agFALSE
1699                           );
1700
1701#endif
1702
1703        /* find a PhyID and reset for portContext in tdssSASShared */
1704        for(i=0;i<TD_MAX_NUM_PHYS;i++)
1705        {
1706          if (onePortContext->PhyIDList[i] == agTRUE)
1707          {
1708            tdsaAllShared->Ports[i].portContext = agNULL;
1709          }
1710        }
1711    /* portcontext is removed from MainLink to FreeLink in tdssReportRemovals or
1712       ossaDeregisterDeviceHandleCB
1713     */
1714      }/* OSSA_PORT_INVALID */
1715      else
1716      {
1717        /* other newly defined port state */
1718        /* do nothing */
1719        TI_DBG2(("ossaHwCB: portstate 0x%x\n", PortState));
1720      }
1721    } /* big else */
1722    break;
1723  }
1724  case OSSA_HW_EVENT_PHY_START_STATUS:
1725  {
1726    PhyID = TD_GET_PHY_ID(eventParm1);
1727    PhyStatus =  TD_GET_PHY_STATUS(eventParm1);
1728
1729    TI_DBG6(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS\n"));
1730    if (PhyStatus == 0x00)
1731    {
1732      TI_DBG6(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS, SUCCESS\n"));
1733    }
1734    else if (PhyStatus == 0x01)
1735    {
1736      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS, INVALID_PHY\n"));
1737    }
1738    else if (PhyStatus == 0x02)
1739    {
1740      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS, PHY_NOT_DISABLED\n"));
1741    }
1742    else
1743    {
1744      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_START_STATUS, OTHER_FAILURE %d\n", PhyStatus));
1745    }
1746    break;
1747  }
1748  case OSSA_HW_EVENT_PHY_STOP_STATUS:
1749  {
1750    agsaContext_t     *agContext;
1751    PhyID = TD_GET_PHY_ID(eventParm1);
1752    PhyStatus =  TD_GET_PHY_STATUS(eventParm1);
1753    PortState = TD_GET_PORT_STATE(eventParm1);
1754
1755    TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS\n"));
1756    if (PhyStatus == 0x00)
1757    {
1758      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, SUCCESS\n"));
1759      agContext = (agsaContext_t *)eventParm2;
1760      onePortContext  = (tdsaPortContext_t *)agContext->osData;;
1761      if (onePortContext == agNULL)
1762      {
1763        TI_DBG1(("ossaHwCB: onePortContext is null, wrong!!!\n"));
1764        return;
1765      }
1766      onePortContext->PhyIDList[PhyID] = agFALSE;
1767      if (PortState == OSSA_PORT_INVALID) /* invalid port */
1768      {
1769        TI_DBG1(("ossaHwCB: OSSA_PORT_INVALID\n"));
1770        tdsaAllShared->eventSource[PhyID].EventValid =  NO_ACK;
1771        onePortContext->eventPhyID = PhyID;
1772        onePortContext->valid = agFALSE;
1773
1774        TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
1775#ifdef INITIATOR_DRIVER
1776        /* notifying link down (all links belonging to a port are down) */
1777        ostiPortEvent(
1778                      tiRoot,
1779                      tiPortStopped,
1780                      tiSuccess,
1781                      (void *)onePortContext->tiPortalContext
1782                      );
1783#endif
1784
1785#ifdef TARGET_DRIVER
1786        ostiPortEvent(
1787                      tiRoot,
1788                      tiPortLinkDown,
1789                      tiSuccess,
1790                      (void *)onePortContext->tiPortalContext
1791                      );
1792
1793#endif
1794
1795#ifdef INITIATOR_DRIVER
1796        tdssReportRemovals(agRoot,
1797                           onePortContext,
1798                           agFALSE
1799                          );
1800#endif
1801#ifdef TARGET_DRIVER
1802        ttdssReportRemovals(agRoot,
1803                            onePortContext,
1804                            agFALSE
1805                           );
1806
1807#endif
1808
1809        /* find a PhyID and reset for portContext in tdssSASShared */
1810        for(i=0;i<TD_MAX_NUM_PHYS;i++)
1811        {
1812          if (onePortContext->PhyIDList[i] == agTRUE)
1813          {
1814            tdsaAllShared->Ports[i].portContext = agNULL;
1815          }
1816        }
1817    /* portcontext is removed from MainLink to FreeLink in tdssReportRemovals or
1818       ossaDeregisterDeviceHandleCB
1819     */
1820      } /* invalid port */
1821    }
1822    else if (PhyStatus == 0x01)
1823    {
1824      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, INVALID_PHY\n"));
1825    }
1826    else if (PhyStatus == 0x02)
1827    {
1828      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, DEVICES_ATTACHED\n"));
1829    }
1830    else if (PhyStatus == 0x03)
1831    {
1832      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, OTHER_FAILURE\n"));
1833    }
1834    else if (PhyStatus == 0x04)
1835    {
1836      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, PHY_NOT_DISABLED\n"));
1837    }
1838    else
1839    {
1840      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_STOP_STATUS, Unknown %d\n", PhyStatus));
1841    }
1842    break;
1843  }
1844
1845  case OSSA_HW_EVENT_RESET_START:
1846  {
1847    bit32 new_status = TD_GET_RESET_STATUS(eventParm1);
1848    TI_DBG2(("ossaHwCB: RESET_START, status %d\n", new_status));
1849    if (new_status == OSSA_SUCCESS)
1850    {
1851      tdsaAllShared->flags.resetInProgress = agTRUE;
1852      TI_DBG2(("ossaHwCB: RESET_START, SUCCESS\n"));
1853    }
1854    else if (new_status == OSSA_FAILURE)
1855    {
1856      TI_DBG1(("ossaHwCB: RESET_START, FAILURE\n"));
1857    }
1858    else
1859    {
1860      TI_DBG1(("ossaHwCB: RESET_START, PENDING\n"));
1861    }
1862    break;
1863  }
1864
1865  case OSSA_HW_EVENT_RESET_COMPLETE:
1866  {
1867    bit32 new_status = TD_GET_RESET_STATUS(eventParm1);
1868#ifdef SOFT_RESET_TEST
1869    DbgPrint("Reset Complete\n");
1870#endif
1871    TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_RESET_COMPLETE, status %d\n", new_status));
1872    if (new_status == OSSA_SUCCESS)
1873    {
1874      /* remove all portcontext and devices */
1875#ifdef INITIATOR_DRIVER
1876      tdssRemoveSASSATAFromSharedcontextByReset(agRoot);
1877#endif
1878      tdsaAllShared->flags.resetInProgress = agFALSE;
1879      /*
1880        a callback notifying reset completion
1881      */
1882      ostiPortEvent(
1883                    tiRoot,
1884                    tiPortResetComplete,
1885                    tiSuccess,
1886                    agNULL
1887                    );
1888    }
1889    else
1890    {
1891      /*
1892        a callback notifying reset completion
1893      */
1894      tdsaAllShared->flags.resetInProgress = agFALSE;
1895      ostiPortEvent(
1896                    tiRoot,
1897                    tiPortResetComplete,
1898                    tiError,
1899                    agNULL
1900                    );
1901
1902    }
1903    break;
1904  }
1905
1906  case OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC:
1907  {
1908    PhyID = TD_GET_PHY_ID(eventParm1);
1909    PortState = TD_GET_PORT_STATE(eventParm1);
1910    agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
1911
1912    TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC from PhyID %d; to be tested\n", PhyID));
1913
1914    if (PortState == OSSA_PORT_INVALID)
1915    {
1916      TI_DBG1(("ossaHwCB: Wrong port state with OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC\n"));
1917      smTraceFuncExit(hpDBG_VERY_LOUD, 'n', "Y2");
1918      return;
1919    }
1920
1921    if (agPhyErrCountersPage != agNULL)
1922    {
1923      TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC from PhyID %d\n", PhyID));
1924      TI_DBG1(("ossaHwCB: iDw %d rDE %d cV %d lS %d rP %d iCRC %d\n",
1925                        agPhyErrCountersPage->invalidDword,
1926                        agPhyErrCountersPage->runningDisparityError,
1927                        agPhyErrCountersPage->codeViolation,
1928                        agPhyErrCountersPage->lossOfDwordSynch,
1929                        agPhyErrCountersPage->phyResetProblem,
1930                        agPhyErrCountersPage->inboundCRCError ));
1931    }
1932    else
1933    {
1934      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC: Error!!!  eventParm2 is NULL\n"));
1935    }
1936
1937    /* saHwEventAck() */
1938    eventSource.agPortContext = agPortContext;
1939    eventSource.event = OSSA_HW_EVENT_PHY_ERR_INBOUND_CRC;
1940    /* phy ID */
1941    eventSource.param = PhyID;
1942    HwAckSatus = saHwEventAck(
1943                              agRoot,
1944                              agNULL, /* agContext */
1945                              0,
1946                              &eventSource, /* agsaEventSource_t */
1947                              0,
1948                              0
1949                              );
1950    if ( HwAckSatus != AGSA_RC_SUCCESS)
1951    {
1952      TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
1953      smTraceFuncExit(hpDBG_VERY_LOUD, 'o', "Y2");
1954      return;
1955    }
1956    break;
1957  }
1958#ifdef REMOVED
1959  case OSSA_HW_EVENT_PORT_INVALID:
1960  {
1961    TI_DBG1(("ossaHwCB: PORT_INVALID\n"));
1962
1963    if ( agPortContext == agNULL)
1964    {
1965      TI_DBG1(("ossaHwCB: agPortContext is NULL, wrong.\n"));
1966      smTraceFuncExit(hpDBG_VERY_LOUD, 'p', "Y2");
1967      return;
1968    }
1969    if ( agPortContext->osData != agNULL)
1970    {
1971      TI_DBG1(("ossaHwCB: NOT NULL osDATA\n"));
1972      /*
1973        put the old portcontext back to free list
1974      */
1975      onePortContext = (tdsaPortContext_t *)agPortContext->osData;
1976      TI_DBG1(("ossaHwCB: pid %d\n", onePortContext->id));
1977
1978#ifdef INITIATOR_DRIVER
1979      /* notifying link down (all links belonging to a port are down) */
1980      ostiPortEvent (
1981                     tiRoot,
1982                     tiPortStopped,
1983                     tiSuccess,
1984                     (void *)onePortContext->tiPortalContext
1985
1986                     );
1987#endif /* INITIATOR_DRIVER */
1988#ifdef TARGET_DRIVER
1989        ostiPortEvent(
1990                      tiRoot,
1991                      tiPortLinkDown,
1992                      tiSuccess,
1993                      (void *)onePortContext->tiPortalContext
1994                      );
1995
1996#endif /*TARGET_DRIVER  */
1997
1998      /* find the device belonging to the port and remove it from the device list */
1999      //tdssRemoveSASSATAFromSharedcontext(agRoot, tdsaDeviceData, onePortContext);
2000
2001
2002#ifdef INITIATOR_DRIVER
2003      /* reset the fields of portcontext */
2004      onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
2005      tdssReportRemovals(agRoot,
2006                         onePortContext,
2007                         agFALSE
2008                        );
2009
2010      onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_FULL_START;
2011      onePortContext->DiscoveryRdyGiven = agFALSE;
2012      onePortContext->SeenLinkUp = agFALSE;
2013
2014#endif /* INITIATOR_DRIVER */
2015
2016
2017
2018      /* for hotplug */
2019
2020      /* find a PhyID and reset for portContext in tdssSASShared */
2021      for(i=0;i<TD_MAX_NUM_PHYS;i++)
2022      {
2023        if (onePortContext->PhyIDList[i] == agTRUE)
2024        {
2025          tdsaAllShared->Ports[i].portContext = agNULL;
2026        }
2027      }
2028
2029      /* reset PhyIDList in portcontext */
2030      for(i=0;i<TD_MAX_NUM_PHYS;i++)
2031      {
2032        onePortContext->PhyIDList[i] = agFALSE;
2033      }
2034
2035//      onePortContext->tiPortalContext = agNULL;
2036//      onePortContext->agRoot = agNULL;
2037      onePortContext->agPortContext = agNULL;
2038      onePortContext->valid = agFALSE;
2039
2040      TI_DBG4(("ossaHwCB: pid %d count %d\n", onePortContext->id, onePortContext->Count));
2041
2042      /* resets the number of devices in onePortContext */
2043      onePortContext->Count = 0;
2044      onePortContext->discovery.pendingSMP = 0;
2045      onePortContext->discovery.SeenBC = agFALSE;
2046
2047
2048      /*
2049        put all devices belonging to the onePortContext
2050        back to the free link
2051      */
2052
2053      tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
2054      TDLIST_DEQUEUE_THIS(&(onePortContext->MainLink));
2055      TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->FreeLink), &(tdsaPortContext->FreeLink));
2056      tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
2057    }
2058    else
2059    {
2060      TI_DBG1(("ossaHwCB: NULL osDATA: wrong\n"));
2061    }
2062    TI_DBG6(("ossaHwCB: PORT_INVALID end\n"));
2063    break;
2064  }
2065#endif /* REMOVED */
2066
2067  case OSSA_HW_EVENT_BROADCAST_CHANGE:
2068  {
2069    PhyID = TD_GET_PHY_ID(eventParm1);
2070    PortState = TD_GET_PORT_STATE(eventParm1);
2071    TI_DBG1(("ossaHwCB: BROADCAST_CHANGE from PhyID %d\n", PhyID));
2072
2073    if (PortState == OSSA_PORT_INVALID)
2074    {
2075      TI_DBG1(("ossaHwCB: Wrong port state with  BROADCAST_CHANGE\n"));
2076      smTraceFuncExit(hpDBG_VERY_LOUD, 'q', "Y2");
2077      return;
2078    }
2079    /* saHwEventAck() */
2080    eventSource.agPortContext = agPortContext;
2081    eventSource.event = OSSA_HW_EVENT_BROADCAST_CHANGE;
2082    /* phy ID */
2083    eventSource.param = PhyID;
2084    HwAckSatus = saHwEventAck(
2085                              agRoot,
2086                              agNULL, /* agContext */
2087                              0,
2088                              &eventSource, /* agsaEventSource_t */
2089                              0,
2090                              0
2091                              );
2092    TI_DBG4(("ossaHwCB: calling saHwEventAck\n"));
2093
2094    if ( HwAckSatus != AGSA_RC_SUCCESS)
2095    {
2096      TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
2097      smTraceFuncExit(hpDBG_VERY_LOUD, 'r', "Y2");
2098      return;
2099    }
2100    if (tIsSPC12SATA(agRoot))
2101    {
2102      TI_DBG1(("ossaHwCB: BROADCAST_CHANGE received for SATA Controller\n"));
2103      break;
2104    }
2105    /*
2106     * incremental discovery is to be tested and debugged further
2107     */
2108
2109     /* just for testing discovery abort */
2110#ifdef FDS_DM_NO
2111    if (agPortContext == agNULL)
2112    {
2113      /* this case happens when broadcase is received first before the link up */
2114      TI_DBG2(("ossaHwCB: agPortContext is NULL. Do nothing.\n"));
2115    }
2116    else if ( agPortContext->osData != agNULL)
2117    {
2118      dmRoot = &(tdsaAllShared->dmRoot);
2119      onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2120      dmPortContext = &(onePortContext->dmPortContext);
2121
2122      dmQueryDiscovery(dmRoot, dmPortContext);
2123//      dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_ABORT);
2124
2125#if 1
2126      if (onePortContext->DMDiscoveryState == dmDiscInProgress)
2127      {
2128        dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_ABORT);
2129      }
2130#endif /* 1 */
2131
2132      TI_DBG2(("ossaHwCB: portcontext pid %d\n", onePortContext->id));
2133      if (onePortContext->DMDiscoveryState == dmDiscCompleted ||
2134          onePortContext->DMDiscoveryState == dmDiscAborted ||
2135          onePortContext->DMDiscoveryState == dmDiscAbortInvalid )
2136      {
2137        TI_DBG1(("ossaHwCB: BROADCAST_CHANGE; calling dmNotifyBC and does incremental discovery\n"));
2138        dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
2139        dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_INCREMENTAL_START);
2140
2141      }
2142      else
2143      {
2144        TI_DBG2(("ossaHwCB: pid %d BROADCAST_CHANGE; updating SeenBC. calling dmNotifyBC\n", onePortContext->id));
2145        dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
2146      }
2147    }
2148    else
2149    {
2150      TI_DBG1(("ossaHwCB: BROADCAST_CHANGE NULL osDATA wrong !!! \n"));
2151    }
2152
2153
2154#endif /* FDS_DM_NO */
2155
2156#ifdef FDS_DM
2157    if (agPortContext == agNULL)
2158    {
2159      /* this case happens when broadcase is received first before the link up */
2160      TI_DBG2(("ossaHwCB: agPortContext is NULL. Do nothing.\n"));
2161    }
2162    else if ( agPortContext->osData != agNULL)
2163    {
2164      dmRoot = &(tdsaAllShared->dmRoot);
2165      onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2166      dmPortContext = &(onePortContext->dmPortContext);
2167
2168      dmQueryDiscovery(dmRoot, dmPortContext);
2169
2170      TI_DBG2(("ossaHwCB: portcontext pid %d\n", onePortContext->id));
2171      if (onePortContext->DMDiscoveryState == dmDiscCompleted ||
2172          onePortContext->DMDiscoveryState == dmDiscAborted ||
2173          onePortContext->DMDiscoveryState == dmDiscAbortInvalid )
2174      {
2175        TI_DBG1(("ossaHwCB: BROADCAST_CHANGE; calling dmNotifyBC and does incremental discovery, pid %d\n", onePortContext->id));
2176        onePortContext->DiscoveryState = ITD_DSTATE_STARTED;
2177        dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
2178        dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_INCREMENTAL_START);
2179
2180      }
2181      else if (onePortContext->DMDiscoveryState == dmDiscFailed )
2182      {
2183        TI_DBG1(("ossaHwCB: dmDiscFailed; pid %d BROADCAST_CHANGE; updating SeenBC. calling dmNotifyBC\n", onePortContext->id));
2184        onePortContext->DiscFailNSeenBC = agTRUE;
2185        dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
2186      }
2187      else
2188      {
2189        TI_DBG2(("ossaHwCB: pid %d BROADCAST_CHANGE; updating SeenBC. calling dmNotifyBC\n", onePortContext->id));
2190        dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
2191      }
2192    }
2193    else
2194    {
2195      TI_DBG1(("ossaHwCB: BROADCAST_CHANGE NULL osDATA wrong !!! \n"));
2196    }
2197#endif /* FDS_DM */
2198
2199#ifdef FDS_DM_WORKED
2200    if (agPortContext == agNULL)
2201    {
2202      /* this case happens when broadcase is received first before the link up */
2203      TI_DBG2(("ossaHwCB: agPortContext is NULL. Do nothing.\n"));
2204    }
2205    else if ( agPortContext->osData != agNULL)
2206    {
2207      onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2208      TI_DBG2(("ossaHwCB: calling dmNotifyBC\n"));
2209      dmRoot = &(tdsaAllShared->dmRoot);
2210      dmPortContext = &(onePortContext->dmPortContext);
2211      dmNotifyBC(dmRoot, dmPortContext, OSSA_HW_EVENT_BROADCAST_CHANGE);
2212    }
2213#endif /* FDS_DM_WORKED */
2214
2215#ifndef FDS_DM
2216#ifdef INITIATOR_DRIVER
2217    if (agPortContext == agNULL)
2218    {
2219      /* this case happens when broadcase is received first before the link up */
2220      TI_DBG2(("ossaHwCB: agPortContext is NULL. Do nothing.\n"));
2221    }
2222    else if ( agPortContext->osData != agNULL)
2223    {
2224      onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2225      TI_DBG2(("ossaHwCB: portcontext pid %d\n", onePortContext->id));
2226      if (onePortContext->DiscoveryState == ITD_DSTATE_COMPLETED)
2227      {
2228        TI_DBG1(("ossaHwCB: BROADCAST_CHANGE; does incremental discovery\n"));
2229        onePortContext->DiscoveryState = ITD_DSTATE_NOT_STARTED;
2230        onePortContext->discoveryOptions = AG_SA_DISCOVERY_OPTION_INCREMENTAL_START;
2231        /* processed broadcast change */
2232        onePortContext->discovery.SeenBC = agFALSE;
2233#ifdef TD_DISCOVER
2234        if (tdsaAllShared->ResetInDiscovery != 0 &&
2235            onePortContext->discovery.ResetTriggerred == agTRUE)
2236        {
2237          TI_DBG2(("ossaHwCB: tdsaBCTimer\n"));
2238          tdsaBCTimer(tiRoot, onePortContext);
2239        }
2240        else
2241        {
2242          tdsaDiscover(
2243                     tiRoot,
2244                     onePortContext,
2245                     TDSA_DISCOVERY_TYPE_SAS,
2246                     TDSA_DISCOVERY_OPTION_INCREMENTAL_START
2247                    );
2248        }
2249#else
2250        saDiscover(agRoot,
2251                   agPortContext,
2252                   AG_SA_DISCOVERY_TYPE_SAS,
2253                   onePortContext->discoveryOptions);
2254#endif
2255      }
2256      else
2257      {
2258        TI_DBG2(("ossaHwCB: pid %d BROADCAST_CHANGE; updating SeenBC. Do nothing.\n", onePortContext->id));
2259        onePortContext->discovery.SeenBC = agTRUE;
2260      }
2261    }
2262    else
2263    {
2264      TI_DBG1(("ossaHwCB: BROADCAST_CHANGE NULL osDATA wrong !!! \n"));
2265    }
2266#endif
2267#endif /* ifndef FDS_DM */
2268
2269    break;
2270  }
2271
2272  case OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO:
2273  {
2274    PhyID = TD_GET_PHY_ID(eventParm1);
2275    PortState = TD_GET_PORT_STATE(eventParm1);
2276
2277    /*
2278      1. tear town the portcontext just like link down last phy down
2279      2. ack
2280      port state must be invalid
2281    */
2282
2283    TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RECOVERY_TIMER_TMO\n"));
2284
2285    if (PortState == OSSA_PORT_VALID)
2286    {
2287      TI_DBG1(("ossaHwCB: Wrong port state\n"));
2288      smTraceFuncExit(hpDBG_VERY_LOUD, 's', "Y2");
2289      return;
2290    }
2291
2292    TD_ASSERT(agPortContext, "agPortContext");
2293    if ( agPortContext->osData == agNULL)
2294    { /* if */
2295      /* PortContext must exit at this point */
2296      TI_DBG1(("ossaHwCB: NULL portalcontext. Error. Can't be NULL\n"));
2297    }
2298    else
2299    {
2300      onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
2301      onePortContext->valid = agFALSE;
2302
2303      TI_DBG1(("ossaHwCB: tiPortStopped pid %d\n", onePortContext->id));
2304#ifdef INITIATOR_DRIVER
2305      /* notifying link down (all links belonging to a port are down) */
2306      ostiPortEvent(
2307                    tiRoot,
2308                    tiPortStopped,
2309                    tiSuccess,
2310                    (void *)onePortContext->tiPortalContext
2311                    );
2312#endif
2313
2314#ifdef TARGET_DRIVER
2315        ostiPortEvent(
2316                      tiRoot,
2317                      tiPortLinkDown,
2318                      tiSuccess,
2319                      (void *)onePortContext->tiPortalContext
2320                      );
2321
2322#endif
2323
2324#ifdef INITIATOR_DRIVER
2325      tdssReportRemovals(agRoot,
2326                         onePortContext,
2327                         agFALSE
2328                         );
2329#endif
2330#ifdef TARGET_DRIVER
2331      ttdssReportRemovals(agRoot,
2332                          onePortContext,
2333                          agFALSE
2334                         );
2335
2336#endif
2337      /* find a PhyID and reset for portContext in tdssSASShared */
2338      for(i=0;i<TD_MAX_NUM_PHYS;i++)
2339      {
2340        if (onePortContext->PhyIDList[i] == agTRUE)
2341        {
2342          tdsaAllShared->Ports[i].portContext = agNULL;
2343        }
2344      }
2345      /* portcontext is removed from MainLink to FreeLink in tdssReportRemovals or
2346         ossaDeregisterDeviceHandleCB
2347       */
2348    }
2349
2350    break;
2351  }
2352
2353  case OSSA_HW_EVENT_PORT_RESET_TIMER_TMO:
2354  {
2355    /*
2356       clean up
2357    */
2358    PhyID = TD_GET_PHY_ID(eventParm1);
2359    PortState = TD_GET_PORT_STATE(eventParm1);
2360
2361    TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RESET_TIMER_TMO\n"));
2362
2363    if (PortState == OSSA_PORT_VALID)
2364    {
2365      TI_DBG1(("ossaHwCB: Wrong port state\n"));
2366      smTraceFuncExit(hpDBG_VERY_LOUD, 't', "Y2");
2367      return;
2368    }
2369
2370    if (agPortContext == agNULL)
2371    {
2372      TI_DBG1(("ossaHwCB: agPortContext is NULL, error\n"));
2373      smTraceFuncExit(hpDBG_VERY_LOUD, 'u', "Y2");
2374      return;
2375    }
2376
2377    if ( agPortContext->osData == agNULL)
2378    { /* if */
2379      /* PortContext must exit at this point */
2380      TI_DBG1(("ossaHwCB: NULL portalcontext. Error. Can't be NULL\n"));
2381    }
2382    else
2383    {
2384      onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
2385      onePortContext->valid = agFALSE;
2386
2387      TI_DBG1(("ossaHwCB: pid %d tiPortStopped\n", onePortContext->id));
2388
2389#ifdef INITIATOR_DRIVER
2390      /* notifying link down (all links belonging to a port are down) */
2391      ostiPortEvent(
2392                    tiRoot,
2393                    tiPortStopped,
2394                    tiSuccess,
2395                    (void *)onePortContext->tiPortalContext
2396                    );
2397#endif
2398
2399#ifdef TARGET_DRIVER
2400        ostiPortEvent(
2401                      tiRoot,
2402                      tiPortLinkDown,
2403                      tiSuccess,
2404                      (void *)onePortContext->tiPortalContext
2405                      );
2406
2407#endif
2408
2409#ifdef INITIATOR_DRIVER
2410      tdssReportRemovals(agRoot,
2411                         onePortContext,
2412                         agFALSE
2413                         );
2414#endif
2415#ifdef TARGET_DRIVER
2416      ttdssReportRemovals(agRoot,
2417                          onePortContext,
2418                          agFALSE
2419                         );
2420
2421#endif
2422      /* find a PhyID and reset for portContext in tdssSASShared */
2423      for(i=0;i<TD_MAX_NUM_PHYS;i++)
2424      {
2425        if (onePortContext->PhyIDList[i] == agTRUE)
2426        {
2427          tdsaAllShared->Ports[i].portContext = agNULL;
2428        }
2429      }
2430      /* portcontext is removed from MainLink to FreeLink in tdssReportRemovals or
2431         ossaDeregisterDeviceHandleCB
2432       */
2433    }
2434
2435    break;
2436  }
2437
2438  case OSSA_HW_EVENT_PORT_RESET_COMPLETE:
2439  {
2440#ifdef INITIATOR_DRIVER
2441    tiIORequest_t *currentTaskTag = agNULL;
2442#endif
2443
2444#ifdef REMOVED
2445    smRoot_t  *smRoot = &(tdsaAllShared->smRoot);
2446#endif
2447
2448    PhyID = TD_GET_PHY_ID(eventParm1);
2449    PortState = TD_GET_PORT_STATE(eventParm1);
2450    IDframe = (agsaSASIdentify_t *)eventParm3;
2451
2452    /* completes for Lun Reset and Target reset for directly attached SATA */
2453    /* completes for Target reset for directly attached SAS */
2454
2455    TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PORT_RESET_COMPLETE, phyID %d\n", PhyID));
2456
2457    /* error check */
2458    if (PortState == OSSA_PORT_INVALID)
2459    {
2460      TI_DBG1(("ossaHwCB: Wrong port state\n"));
2461      smTraceFuncExit(hpDBG_VERY_LOUD, 'v', "Y2");
2462      return;
2463    }
2464
2465    if (agPortContext == agNULL)
2466    {
2467      TI_DBG1(("ossaHwCB: agPortContext null, wrong\n"));
2468      smTraceFuncExit(hpDBG_VERY_LOUD, 'w', "Y2");
2469      return;
2470    }
2471    if ( agPortContext->osData == agNULL)
2472    {
2473      TI_DBG1(("ossaHwCB: agPortContext->osData null, wrong\n"));
2474      smTraceFuncExit(hpDBG_VERY_LOUD, 'x', "Y2");
2475      return;
2476    }
2477
2478    /* find a corresponding portcontext */
2479    onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
2480
2481    if (onePortContext == agNULL)
2482    {
2483      TI_DBG1(("ossaHwCB: oneportContext is NULL; wrong??????\n"));
2484    }
2485    else
2486    {
2487      TI_DBG1(("ossaHwCB: oneportContext %p pid %d\n", onePortContext, onePortContext->id));
2488      onePortContext->valid = agTRUE;
2489#ifdef INITIATOR_DRIVER
2490#ifdef REMOVED
2491      if (tdsaAllShared->ResetInDiscovery != 0)
2492      {
2493        DeviceListList = tdsaAllShared->MainDeviceList.flink;
2494        while (DeviceListList != &(tdsaAllShared->MainDeviceList))
2495        {
2496          oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
2497          if (oneDeviceData->tdPortContext != onePortContext)
2498          {
2499            DeviceListList = DeviceListList->flink;
2500          }
2501          else
2502          {
2503            found = agTRUE;
2504            break;
2505          }
2506        } /* while */
2507        if (found == agTRUE)
2508        {
2509          /* applied to only SATA devices */
2510          if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
2511          {
2512          #ifdef FDS_SM
2513            tdIDStart(tiRoot, agRoot, smRoot, oneDeviceData, onePortContext);
2514          #else
2515            tdssRetrySATAID(tiRoot, oneDeviceData);
2516          #endif
2517          }
2518        }
2519        else
2520        {
2521          TI_DBG1(("ossaHwCB: no onedevicedata found!\n"));
2522        }
2523      }
2524#endif
2525      /* completed TM */
2526      DeviceListList = tdsaAllShared->MainDeviceList.flink;
2527      while (DeviceListList != &(tdsaAllShared->MainDeviceList))
2528      {
2529        oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
2530        if ( oneDeviceData == agNULL)
2531        {
2532          TI_DBG1(("ossaHwCB: oneDeviceData is NULL!!!\n"));
2533          return;
2534        }
2535
2536        if ( (oneDeviceData->tdPortContext == onePortContext) &&
2537             (oneDeviceData->directlyAttached == agTRUE) &&
2538             (oneDeviceData->phyID == PhyID) )
2539        {
2540          TI_DBG1(("ossaHwCB: found the onePortContext and oneDeviceData!!\n"));
2541
2542          currentTaskTag = (tiIORequest_t *)oneDeviceData->agDeviceResetContext.osData;
2543          if (currentTaskTag != agNULL )
2544          {
2545            /* applied to only SATA devices */
2546            if (DEVICE_IS_SATA_DEVICE(oneDeviceData))
2547            {
2548               tdIORequestBody_t  *SMTMtdIORequestBody = agNULL;
2549               SMTMtdIORequestBody = (tdIORequestBody_t *)currentTaskTag->tdData;
2550               if (SMTMtdIORequestBody != agNULL)
2551               {
2552                 /* free the SMTMtdIORequestBody memory allocated in tiINITaskManagement function */
2553                 ostiFreeMemory(
2554                       tiRoot,
2555                       SMTMtdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
2556                       sizeof(tdIORequestBody_t)
2557                      );
2558               }
2559               else
2560               {
2561                 TI_DBG1(("ossaHwCB: SATA device but SMTMtdIORequestBody is NULL!!!\n"));
2562               }
2563            }
2564            /* set device state to DS_OPERATIONAL */
2565            saSetDeviceState(agRoot,
2566                            agNULL,
2567                            tdsaRotateQnumber(tiRoot, oneDeviceData),
2568                            oneDeviceData->agDevHandle,
2569                            SA_DS_OPERATIONAL
2570                            );
2571            /* notify OS layer to complete the TMF IO */
2572            ostiInitiatorEvent(tiRoot,
2573                              agNULL,
2574                              agNULL,
2575                              tiIntrEventTypeTaskManagement,
2576                              tiTMOK,
2577                              currentTaskTag
2578                              );
2579
2580          }
2581          else
2582          {
2583            TI_DBG1(("ossaHwCB: currentTaskTag is NULL!!!\n"));
2584          }
2585
2586          break;
2587        }
2588        else
2589        {
2590          DeviceListList = DeviceListList->flink;
2591        }
2592      }
2593#endif
2594    }
2595    break;
2596  }
2597  case OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT:
2598  {
2599    PhyID = TD_GET_PHY_ID(eventParm1);
2600    PortState = TD_GET_PORT_STATE(eventParm1);
2601
2602    TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT\n"));
2603    if (tIsSPC12SATA(agRoot))
2604    {
2605      TI_DBG1(("ossaHwCB: BROADCAST_ASYNCH_EVENT received for SATA Controller\n"));
2606      break;
2607    }
2608    if (agPortContext == agNULL)
2609    {
2610      TI_DBG1(("ossaHwCB: Error!!! agPortContext is NULL %d\n", PhyID));
2611      smTraceFuncExit(hpDBG_VERY_LOUD, 'y', "Y2");
2612      return;
2613    }
2614    onePortContext = (tdsaPortContext_t *)agPortContext->osData;
2615    if (onePortContext == agNULL)
2616    {
2617      TI_DBG1(("ossaHwCB: Error!!! onePortContext is NULL %d\n", PhyID));
2618      smTraceFuncExit(hpDBG_VERY_LOUD, 'z', "Y2");
2619      return;
2620    }
2621
2622    if (onePortContext->tiPortalContext != agNULL)
2623    {
2624#if 0
2625      ostiInitiatorEvent(
2626                         tiRoot,
2627                         onePortContext->tiPortalContext,
2628                         agNULL,
2629                         tiIntrEventTypeDeviceChange,
2630                         OSSA_HW_EVENT_BROADCAST_ASYNCH_EVENT,
2631                         agNULL
2632                         );
2633#endif
2634    }
2635    else
2636    {
2637      TI_DBG1(("ossaHwCB: Error!!! onePortContext->tiPortalContext is NULL\n"));
2638      smTraceFuncExit(hpDBG_VERY_LOUD, 'A', "Y2");
2639      return;
2640    }
2641
2642    break;
2643   }
2644
2645  case OSSA_HW_EVENT_PORT_RECOVER:
2646  {
2647
2648    PhyID = TD_GET_PHY_ID(eventParm1);
2649    if (agPortContext == agNULL)
2650    {
2651      TI_DBG1(("ossaHwCB: Error!!! agPortContext is NULL %d\n", PhyID));
2652      smTraceFuncExit(hpDBG_VERY_LOUD, 'B', "Y2");
2653      return;
2654    }
2655
2656    LinkRate = TD_GET_LINK_RATE(eventParm1);
2657    PortState = TD_GET_PORT_STATE(eventParm1);
2658    agDevHandle = agNULL;
2659    IDframe = (agsaSASIdentify_t *)eventParm3;
2660
2661    /*
2662      1. this is like link up
2663      2. handle the phyID
2664      3. no trigger discovery (broadcast change will do this later)
2665      port state must be valid
2666    */
2667
2668    TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RECOVER, phyID %d\n", PhyID));
2669
2670    if (PortState == OSSA_PORT_INVALID)
2671    {
2672      TI_DBG1(("ossaHwCB: Wrong port state\n"));
2673      smTraceFuncExit(hpDBG_VERY_LOUD, 'C', "Y2");
2674      return;
2675    }
2676    if ( agPortContext->osData == agNULL)
2677    { /* if */
2678      /* PortContext must exit at this point */
2679      TI_DBG1(("ossaHwCB: NULL portalcontext. Error. Can't be NULL\n"));
2680    }
2681    else
2682    {
2683      onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
2684      TI_DBG2(("ossaHwCB: pid %d\n", onePortContext->id));
2685      onePortContext->PhyIDList[PhyID] = agTRUE;
2686      onePortContext->valid = agTRUE;
2687      tdsaAllShared->Ports[PhyID].portContext = onePortContext;
2688      onePortContext->tiPortalContext = tdsaAllShared->Ports[PhyID].tiPortalContext;
2689      onePortContext->PortRecoverPhyID = PhyID;
2690      if (LinkRate == 0x01)
2691      {
2692        onePortContext->LinkRate = SAS_CONNECTION_RATE_1_5G;
2693      }
2694      else if (LinkRate == 0x02)
2695      {
2696        onePortContext->LinkRate = SAS_CONNECTION_RATE_3_0G;
2697      }
2698      else if (LinkRate == 0x04)
2699      {
2700        onePortContext->LinkRate = SAS_CONNECTION_RATE_6_0G;
2701      }
2702      else /* (LinkRate == 0x08) */
2703      {
2704        onePortContext->LinkRate = SAS_CONNECTION_RATE_12_0G;
2705      }
2706
2707      if (SA_IDFRM_GET_DEVICETTYPE(&onePortContext->sasIDframe) == SAS_END_DEVICE &&
2708          SA_IDFRM_IS_SSP_TARGET(&onePortContext->sasIDframe) )
2709      {
2710        TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RECOVER, sending spinup on phyID %d\n", PhyID));
2711        for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
2712        {
2713          saLocalPhyControl(agRoot, agNULL, 0, PhyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
2714        }
2715      }
2716
2717      /* transient period between link up and link down/port recovery */
2718      if (onePortContext->Transient == agTRUE && onePortContext->RegisteredDevNums == 0)
2719      {
2720        TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PORT_RECOVER transient period"));
2721        if (SA_IDFRM_GET_DEVICETTYPE(IDframe) != SAS_NO_DEVICE)
2722        {
2723#ifdef INITIATOR_DRIVER
2724          agSASSubID.sasAddressHi = SA_IDFRM_GET_SAS_ADDRESSHI(IDframe);
2725          agSASSubID.sasAddressLo = SA_IDFRM_GET_SAS_ADDRESSLO(IDframe);
2726          agSASSubID.initiator_ssp_stp_smp = IDframe->initiator_ssp_stp_smp;
2727          agSASSubID.target_ssp_stp_smp = IDframe->target_ssp_stp_smp;
2728          tdssAddSASToSharedcontext(
2729                                    onePortContext,
2730                                    agRoot,
2731                                    agDevHandle, /* agNULL */
2732                                    &agSASSubID,
2733                                    agTRUE,
2734                                    (bit8)PhyID,
2735                                    TD_OPERATION_INITIATOR
2736                                    );
2737#endif
2738        }
2739        onePortContext->Transient = agFALSE;
2740      }
2741
2742
2743
2744
2745    }
2746    break;
2747  }
2748
2749  case OSSA_HW_EVENT_BROADCAST_SES:
2750  {
2751    PhyID = TD_GET_PHY_ID(eventParm1);
2752    PortState = TD_GET_PORT_STATE(eventParm1);
2753
2754    TI_DBG2(("ossaHwCB: BROADCAST_SES  from PhyID %d; to be tested\n", PhyID));
2755    if (tIsSPC12SATA(agRoot))
2756    {
2757      TI_DBG1(("ossaHwCB: BROADCAST_SES received for SATA Controller\n"));
2758      break;
2759    }
2760    if (PortState == OSSA_PORT_INVALID)
2761    {
2762      TI_DBG1(("ossaHwCB: Wrong port state with  BROADCAST_SES\n"));
2763      smTraceFuncExit(hpDBG_VERY_LOUD, 'D', "Y2");
2764      return;
2765    }
2766
2767    /*
2768       let os layer read payload
2769    */
2770    break;
2771  }
2772  case OSSA_HW_EVENT_BROADCAST_EXP:
2773  {
2774    PhyID = TD_GET_PHY_ID(eventParm1);
2775    PortState = TD_GET_PORT_STATE(eventParm1);
2776
2777    TI_DBG2(("ossaHwCB: BROADCAST_EXP from PhyID %d; to be tested\n", PhyID));
2778    if (tIsSPC12SATA(agRoot))
2779    {
2780      TI_DBG1(("ossaHwCB: BROADCAST_EXP received for SATA Controller\n"));
2781      break;
2782    }
2783
2784    if (PortState == OSSA_PORT_INVALID)
2785    {
2786      TI_DBG1(("ossaHwCB: Wrong port state with  BROADCAST_EXP\n"));
2787      smTraceFuncExit(hpDBG_VERY_LOUD, 'E', "Y2");
2788      return;
2789    }
2790    /* to-do:
2791       let os layer read payload
2792    */
2793    break;
2794  }
2795
2796  case OSSA_HW_EVENT_HARD_RESET_RECEIVED:
2797  {
2798    PhyID = TD_GET_PHY_ID(eventParm1);
2799    PortState = TD_GET_PORT_STATE(eventParm1);
2800
2801    TI_DBG2(("ossaHwCB: HARD_RESET_RECEIVED from PhyID %d\n", PhyID));
2802
2803    if (PortState == OSSA_PORT_VALID && tiIS_SPC(agRoot))
2804    {
2805      TI_DBG1(("ossaHwCB: calling saPortControl and OSSA_PORT_VALID\n"));
2806      saPortControl(agRoot, agNULL, 0, agPortContext, AGSA_PORT_HARD_RESET, 0,0);
2807    }
2808    else if (PortState == OSSA_PORT_3RDPARTY_RESET && (tIsSPCV12or6G(agRoot))  )
2809    {
2810      TI_DBG1(("ossaHwCB: calling saPortControl and OSSA_PORT_3RDPARTY_RESET\n"));
2811      saPortControl(agRoot, agNULL, 0, agPortContext, AGSA_PORT_HARD_RESET, 0,0);
2812    }
2813    else /* PortState == OSSA_PORT_INVALID */
2814    {
2815      TI_DBG1(("ossaHwCB: Error. Port state is invalid\n"));
2816#ifdef REMOVED
2817      TI_DBG1(("ossaHwCB: calling saLocalPhyControl on phyID %d\n", PhyID));
2818      saLocalPhyControl(agRoot, agNULL, 0, PhyID, AGSA_PHY_LINK_RESET, agNULL);
2819#endif
2820    }
2821
2822    break;
2823  }
2824
2825  case OSSA_HW_EVENT_MALFUNCTION:
2826  {
2827#ifdef TD_DEBUG_ENABLE
2828    agsaFatalErrorInfo_t  *FatalError = (agsaFatalErrorInfo_t *)eventParm2;
2829#endif
2830    TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_MALFUNCTION \n"));
2831    TI_DBG1(("ossaHwCB: errorInfo0 %8X errorInfo1 %8X\n", FatalError->errorInfo0, FatalError->errorInfo1));
2832    TI_DBG1(("ossaHwCB: errorInfo2 %8X errorInfo3 %8X\n", FatalError->errorInfo2, FatalError->errorInfo3));
2833    TI_DBG1(("ossaHwCB: regDumpBusBaseNum0 %8X regDumpOffset0 %8X regDumpLen0 %8X\n", FatalError->regDumpBusBaseNum0, FatalError->regDumpOffset0, FatalError->regDumpLen0));
2834    TI_DBG1(("ossaHwCB: regDumpBusBaseNum1 %8X regDumpOffset1 %8X regDumpLen1 %8X\n", FatalError->regDumpBusBaseNum1, FatalError->regDumpOffset1, FatalError->regDumpLen1));
2835
2836
2837    if (eventParm1 == agTRUE)
2838    {
2839      TI_DBG1(("ossaHwCB: fatal error\n"));
2840      /* port panic */
2841      ostiPortEvent (
2842                     tiRoot,
2843                     tiPortPanic,
2844                     0,
2845                     agNULL
2846                     );
2847    }
2848    else
2849    {
2850      TI_DBG1(("ossaHwCB: non-fatal error \n"));
2851    }
2852    break;
2853  }
2854
2855  case OSSA_HW_EVENT_ID_FRAME_TIMEOUT:
2856  {
2857    PhyID = TD_GET_PHY_ID(eventParm1);
2858    PortState = TD_GET_PORT_STATE(eventParm1);
2859
2860    TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_ID_FRAME_TIMEOUT from PhyID %d\n", PhyID));
2861
2862    if (PortState == OSSA_PORT_INVALID)
2863    {
2864      TI_DBG1(("ossaHwCB: Wrong port state with  OSSA_HW_EVENT_ID_FRAME_TIMEOUT\n"));
2865      smTraceFuncExit(hpDBG_VERY_LOUD, 'F', "Y2");
2866      return;
2867    }
2868    break;
2869  }
2870
2871  case OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD:
2872  {
2873    PhyID = TD_GET_PHY_ID(eventParm1);
2874    PortState = TD_GET_PORT_STATE(eventParm1);
2875    agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
2876    TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD\n"));
2877
2878    if (PortState == OSSA_PORT_INVALID)
2879    {
2880      TI_DBG1(("ossaHwCB: Wrong port state with  OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD\n"));
2881      smTraceFuncExit(hpDBG_VERY_LOUD, 'G', "Y2");
2882      return;
2883    }
2884
2885    if (agPhyErrCountersPage != agNULL)
2886    {
2887      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD from PhyID %d\n", PhyID));
2888      TI_DBG1(("ossaHwCB: invalidDword %d\n", agPhyErrCountersPage->invalidDword));
2889    }
2890    else
2891    {
2892      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD: Error!!!  eventParm2 is NULL\n"));
2893    }
2894
2895    /* saHwEventAck() */
2896    eventSource.agPortContext = agPortContext;
2897    eventSource.event = OSSA_HW_EVENT_PHY_ERR_INVALID_DWORD;
2898    /* phy ID */
2899    eventSource.param = PhyID;
2900    HwAckSatus = saHwEventAck(
2901                              agRoot,
2902                              agNULL, /* agContext */
2903                              0,
2904                              &eventSource, /* agsaEventSource_t */
2905                              0,
2906                              0
2907                              );
2908    if ( HwAckSatus != AGSA_RC_SUCCESS)
2909    {
2910      TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
2911      smTraceFuncExit(hpDBG_VERY_LOUD, 'H', "Y2");
2912      return;
2913    }
2914
2915    break;
2916  }
2917
2918  case OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR:
2919  {
2920    PhyID = TD_GET_PHY_ID(eventParm1);
2921    PortState = TD_GET_PORT_STATE(eventParm1);
2922    agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
2923    TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR\n"));
2924
2925    if (PortState == OSSA_PORT_INVALID)
2926    {
2927      TI_DBG1(("ossaHwCB: Wrong port state with  OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR\n"));
2928      smTraceFuncExit(hpDBG_VERY_LOUD, 'I', "Y2");
2929      return;
2930    }
2931
2932    if (agPhyErrCountersPage != agNULL)
2933    {
2934      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR from PhyID %d\n", PhyID));
2935      TI_DBG1(("ossaHwCB: runningDisparityError %d\n", agPhyErrCountersPage->runningDisparityError));
2936    }
2937    else
2938    {
2939      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR: Error!!!  eventParm2 is NULL\n"));
2940    }
2941
2942    /* saHwEventAck() */
2943    eventSource.agPortContext = agPortContext;
2944    eventSource.event = OSSA_HW_EVENT_PHY_ERR_DISPARITY_ERROR;
2945    /* phy ID */
2946    eventSource.param = PhyID;
2947    HwAckSatus = saHwEventAck(
2948                              agRoot,
2949                              agNULL, /* agContext */
2950                              0,
2951                              &eventSource, /* agsaEventSource_t */
2952                              0,
2953                              0
2954                              );
2955    if ( HwAckSatus != AGSA_RC_SUCCESS)
2956    {
2957      TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
2958      smTraceFuncExit(hpDBG_VERY_LOUD, 'J', "Y2");
2959      return;
2960    }
2961
2962    break;
2963  }
2964
2965  case OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION:
2966  {
2967    PhyID = TD_GET_PHY_ID(eventParm1);
2968    PortState = TD_GET_PORT_STATE(eventParm1);
2969    agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
2970    TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION\n"));
2971
2972    if (PortState == OSSA_PORT_INVALID)
2973    {
2974      TI_DBG1(("ossaHwCB: Wrong port state with  OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION\n"));
2975      smTraceFuncExit(hpDBG_VERY_LOUD, 'K', "Y2");
2976      return;
2977    }
2978
2979    if (agPhyErrCountersPage != agNULL)
2980    {
2981      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION from PhyID %d\n", PhyID));
2982      TI_DBG1(("ossaHwCB: codeViolation %d\n", agPhyErrCountersPage->codeViolation));
2983    }
2984    else
2985    {
2986      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION: Error!!!  eventParm2 is NULL\n"));
2987    }
2988
2989    /* saHwEventAck() */
2990    eventSource.agPortContext = agPortContext;
2991    eventSource.event = OSSA_HW_EVENT_PHY_ERR_CODE_VIOLATION;
2992    /* phy ID */
2993    eventSource.param = PhyID;
2994    HwAckSatus = saHwEventAck(
2995                              agRoot,
2996                              agNULL, /* agContext */
2997                              0,
2998                              &eventSource, /* agsaEventSource_t */
2999                              0,
3000                              0
3001                              );
3002    if ( HwAckSatus != AGSA_RC_SUCCESS)
3003    {
3004      TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
3005      smTraceFuncExit(hpDBG_VERY_LOUD, 'L', "Y2");
3006      return;
3007    }
3008
3009    break;
3010  }
3011
3012#ifdef REMOVED
3013  case OSSA_HW_EVENT_LINK_ERR_CODE_VIOLATION1:
3014  {
3015    PhyID = eventParm1 & 0xFF;
3016    agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
3017
3018    if (agPhyErrCountersPage != agNULL)
3019    {
3020      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_LINK_ERR_CODE_VIOLATION1 from PhyID %d\n", PhyID));
3021      TI_DBG1(("ossaHwCB: invalidDword %d\n", agPhyErrCountersPage->invalidDword));
3022      TI_DBG1(("ossaHwCB: runningDisparityError %d\n", agPhyErrCountersPage->runningDisparityError));
3023      TI_DBG1(("ossaHwCB: codeViolation %d\n", agPhyErrCountersPage->codeViolation));
3024      TI_DBG1(("ossaHwCB: lostOfDwordSynch %d\n", agPhyErrCountersPage->lossOfDwordSynch));
3025      TI_DBG1(("ossaHwCB: phyResetProblem %d\n", agPhyErrCountersPage->phyResetProblem));
3026      TI_DBG1(("ossaHwCB: inboundCRCError %d\n", agPhyErrCountersPage->inboundCRCError));
3027    }
3028    else
3029    {
3030      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_LINK_ERR_CODE_VIOLATION1: Error!!!  eventParm2 is NULL\n"));
3031    }
3032    break;
3033  }
3034#endif /* REMOVED */
3035
3036  case OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH:
3037  {
3038    PhyID = TD_GET_PHY_ID(eventParm1);
3039    PortState = TD_GET_PORT_STATE(eventParm1);
3040    agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
3041    TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH\n"));
3042
3043    if (PortState == OSSA_PORT_INVALID)
3044    {
3045      TI_DBG1(("ossaHwCB: Wrong port state with  OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH\n"));
3046      smTraceFuncExit(hpDBG_VERY_LOUD, 'M', "Y2");
3047      return;
3048    }
3049
3050    if (agPhyErrCountersPage != agNULL)
3051    {
3052      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH from PhyID %d\n", PhyID));
3053      TI_DBG1(("ossaHwCB: lostOfDwordSynch %d\n", agPhyErrCountersPage->lossOfDwordSynch));
3054    }
3055    else
3056    {
3057      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH: Error!!!  eventParm2 is NULL\n"));
3058    }
3059
3060    /* saHwEventAck() */
3061    eventSource.agPortContext = agPortContext;
3062    eventSource.event = OSSA_HW_EVENT_PHY_ERR_LOSS_OF_DWORD_SYNCH;
3063    /* phy ID */
3064    eventSource.param = PhyID;
3065    HwAckSatus = saHwEventAck(
3066                              agRoot,
3067                              agNULL, /* agContext */
3068                              0,
3069                              &eventSource, /* agsaEventSource_t */
3070                              0,
3071                              0
3072                              );
3073    if ( HwAckSatus != AGSA_RC_SUCCESS)
3074    {
3075      TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
3076      smTraceFuncExit(hpDBG_VERY_LOUD, 'N', "Y2");
3077      return;
3078    }
3079
3080    break;
3081  }
3082
3083  case OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED:
3084  {
3085    PhyID = TD_GET_PHY_ID(eventParm1);
3086    PortState = TD_GET_PORT_STATE(eventParm1);
3087    agPhyErrCountersPage = (agsaPhyErrCountersPage_t *)eventParm2;
3088
3089    TI_DBG2(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED\n"));
3090
3091    if (PortState == OSSA_PORT_INVALID)
3092    {
3093      TI_DBG1(("ossaHwCB: Wrong port state with  OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED\n"));
3094      smTraceFuncExit(hpDBG_VERY_LOUD, 'O', "Y2");
3095      return;
3096    }
3097
3098    if (agPhyErrCountersPage != agNULL)
3099    {
3100      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED from PhyID %d\n", PhyID));
3101      TI_DBG1(("ossaHwCB: phyResetProblem %d\n", agPhyErrCountersPage->phyResetProblem));
3102    }
3103    else
3104    {
3105      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED: Error!!!  eventParm2 is NULL\n"));
3106    }
3107
3108    /* saHwEventAck() */
3109    eventSource.agPortContext = agPortContext;
3110    eventSource.event = OSSA_HW_EVENT_PHY_ERR_PHY_RESET_FAILED;
3111    /* phy ID */
3112    eventSource.param = PhyID;
3113    HwAckSatus = saHwEventAck(
3114                              agRoot,
3115                              agNULL, /* agContext */
3116                              0,
3117                              &eventSource, /* agsaEventSource_t */
3118                              0,
3119                              0
3120                              );
3121    if ( HwAckSatus != AGSA_RC_SUCCESS)
3122    {
3123      TI_DBG1(("ossaHwCB: failing in saHwEventAck; status %d\n", HwAckSatus));
3124      smTraceFuncExit(hpDBG_VERY_LOUD, 'P', "Y2");
3125      return;
3126    }
3127
3128    break;
3129  }
3130
3131// #ifdef INITIATOR_DRIVER
3132  case OSSA_HW_EVENT_ENCRYPTION:
3133  {
3134    pEncryptCBData = (agsaHWEventEncrypt_t *) eventParm2;
3135    TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_ENCRYPTION: encryptOperation 0x%x\n",pEncryptCBData->encryptOperation));
3136    TI_DBG1(("ossaHwCB: event 0x%x eventParm1 0x%x eventParm2 %p eventParm3 %p\n",event,eventParm1,eventParm2,eventParm3));
3137
3138    /*
3139     * All events and status need to be translated from
3140     * SAS specific values to TISA specific values. This
3141     * is effectively a NOP, but the OS layer won't want to
3142     * look for SAS values.
3143     */
3144    if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE)
3145    {
3146      TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE\n"));
3147      encryptEventData.encryptEvent = tiEncryptKekStore;
3148    }
3149    else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_UPDATE)
3150    {
3151      TI_DBG1(("ossaHwCB:OSSA_HW_ENCRYPT_KEK_UPDATE \n"));
3152      encryptEventData.encryptEvent = tiEncryptKekAdd;
3153    }
3154    else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_INVALIDTE)
3155    {
3156      TI_DBG1(("ossaHwCB:OSSA_HW_ENCRYPT_KEK_INVALIDTE \n"));
3157      /* none */
3158    }
3159    else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_DEK_UPDATE)
3160    {
3161      TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_DEK_UPDATE\n"));
3162      encryptEventData.encryptEvent = tiEncryptDekAdd;
3163    }
3164    else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_DEK_INVALIDTE)
3165    {
3166      TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_DEK_INVALIDTE\n"));
3167      encryptEventData.encryptEvent = tiEncryptDekInvalidate;
3168    }
3169    else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT)
3170    {
3171      TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_OPERATOR_MANAGEMENT\n"));
3172      encryptEventData.encryptEvent = tiEncryptOperatorManagement;
3173    }
3174    else if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_TEST_EXECUTE)
3175    {
3176      TI_DBG1(("ossaHwCB: OSSA_HW_ENCRYPT_TEST_EXECUTE\n"));
3177      encryptEventData.encryptEvent = tiEncryptSelfTest;
3178      encryptEventData.subEvent = pEncryptCBData->eq;
3179    }
3180    else
3181    {
3182      TI_DBG1(("ossaHwCB: unknown encryptOperation 0x%x\n",pEncryptCBData->encryptOperation));
3183    }
3184
3185    if (pEncryptCBData->status != OSSA_SUCCESS)
3186    {
3187      encryptStatus = tiError;
3188
3189      /* prints out status and error qualifier */
3190      TI_DBG1(("ossaHwCB: encrypt response status 0x%x error qualifier 0x%x\n", pEncryptCBData->status, pEncryptCBData->eq));
3191    }
3192    else
3193    {
3194      encryptStatus = tiSuccess;
3195    }
3196
3197    if (pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_UPDATE_AND_STORE ||
3198        pEncryptCBData->encryptOperation == OSSA_HW_ENCRYPT_KEK_UPDATE )
3199    {
3200      /* returning new KEK index */
3201      encryptEventData.pData = pEncryptCBData->handle;
3202    }
3203    else
3204    {
3205      /* returning current KEK index or DEK index */
3206      encryptEventData.pData = pEncryptCBData->param;
3207    }
3208
3209    ostiPortEvent(tiRoot,
3210                  tiEncryptOperation,
3211                  encryptStatus,
3212                  &encryptEventData);
3213    break;
3214  }
3215  case OSSA_HW_EVENT_SECURITY_MODE:
3216  {
3217    securitySetModeStatus = eventParm1;
3218    pEncryptInfo = (agsaEncryptInfo_t *) eventParm2;
3219
3220    TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_SECURITY_MODE\n"));
3221    if (securitySetModeStatus == OSSA_SUCCESS)
3222    {
3223      securityModeStatus = tiSuccess;
3224    }
3225    else
3226    {
3227      securityModeStatus = tiError;
3228    }
3229
3230    encryptEventData.encryptEvent = tiEncryptSetMode;
3231    /* process status to fill in subevent */
3232    /* See PM 4.26.12.6 */
3233    TI_DBG1(("ossaHwCB: pEncryptInfo->status 0x%x\n", pEncryptInfo->status));
3234    if ( pEncryptInfo->status == OSSA_SUCCESS)
3235    {
3236      encryptEventData.subEvent = tiNVRAMSuccess;
3237    }
3238    else if (pEncryptInfo->status == 0x24)
3239    {
3240      encryptEventData.subEvent = tiNVRAMNotFound;
3241    }
3242    else if (pEncryptInfo->status == 0x05 || pEncryptInfo->status == 0x20 || pEncryptInfo->status == 0x21)
3243    {
3244      encryptEventData.subEvent = tiNVRAMAccessTimeout;
3245    }
3246    else
3247    {
3248      encryptEventData.subEvent = tiNVRAMWriteFail;
3249    }
3250
3251    encryptEventData.pData = agNULL;
3252    ostiPortEvent(tiRoot,
3253                  tiEncryptOperation,
3254                  securityModeStatus,
3255                  &encryptEventData);
3256
3257    break;
3258  }
3259  case OSSA_HW_EVENT_MODE:
3260  {
3261    pModeEvent = (agsaHWEventMode_t *) eventParm2;
3262    pModePage = (bit32 *) pModeEvent->modePage;
3263
3264    TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_MODE modePageOperation 0x%x status 0x%x modePageLen 0x%x\n",
3265              pModeEvent->modePageOperation, pModeEvent->status, pModeEvent->modePageLen));
3266
3267    if (pModeEvent->modePageOperation == agsaModePageSet)
3268    {
3269      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_MODE page code 0x%x error qualifier 0x%x\n", (eventParm1 & 0xFF), (eventParm1 >> 16)));
3270      ostiPortEvent(tiRoot,
3271                    tiModePageOperation,
3272                    pModeEvent->status,
3273                    eventParm2);
3274    }
3275    else if (pModeEvent->modePageOperation == agsaModePageGet)
3276    {
3277      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_MODE error qualifier 0x%x\n", eventParm1));
3278      switch ((*pModePage) & 0xFF)
3279      {
3280      case AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE:
3281        TI_DBG1(("ossaHwCB: AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
3282        TI_DBG1(("ossaHwCB:modePageOperation 0x%x status 0x%x modePageLen 0x%x modePage %p context %p\n",
3283                      pModeEvent->modePageOperation,
3284                      pModeEvent->status,
3285                      pModeEvent->modePageLen,
3286                      pModeEvent->modePage,
3287                      pModeEvent->context));
3288        ostiPortEvent(tiRoot,
3289                      tiModePageOperation,
3290                      pModeEvent->status,
3291                      eventParm2);
3292        break;
3293      case AGSA_ENCRYPTION_DEK_CONFIG_PAGE:
3294        TI_DBG1(("ossaHwCB: AGSA_ENCRYPTION_DEK_CONFIG_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
3295        ostiPortEvent(tiRoot,
3296                      tiModePageOperation,
3297                      pModeEvent->status,
3298                      eventParm2);
3299        break;
3300      case AGSA_ENCRYPTION_HMAC_CONFIG_PAGE:
3301        TI_DBG1(("ossaHwCB: AGSA_ENCRYPTION_HMAC_CONFIG_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
3302        ostiPortEvent(tiRoot,
3303                      tiModePageOperation,
3304                      pModeEvent->status,
3305                      eventParm2);
3306        break;
3307      case AGSA_ENCRYPTION_CONTROL_PARM_PAGE:
3308        TI_DBG1(("ossaHwCB: AGSA_ENCRYPTION_CONTROL_PARM_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
3309        /*
3310         * This page is directly related to tiCOMEncryptGetInfo() and
3311         * will be translated into a tiEncrytOperation for the OS layer.
3312         */
3313
3314        /* Fill out tiEncryptInfo_t */
3315        securityMode = *pModePage & 0x0F00 >> 8;
3316        cipherMode = *pModePage & 0xF000 >> 12;
3317
3318        if (securityMode == agsaEncryptSMA)
3319        {
3320          encryptInfo.securityCipherMode = TI_ENCRYPT_SEC_MODE_A;
3321        }
3322        else if (securityMode == agsaEncryptSMB)
3323        {
3324          encryptInfo.securityCipherMode = TI_ENCRYPT_SEC_MODE_B;
3325        }
3326        else
3327        {
3328          encryptInfo.securityCipherMode = TI_ENCRYPT_SEC_MODE_FACT_INIT;
3329        }
3330
3331        if (cipherMode == agsaEncryptCipherModeECB)
3332        {
3333          encryptInfo.securityCipherMode |= TI_ENCRYPT_ATTRIB_CIPHER_ECB;
3334        }
3335
3336        if (cipherMode == agsaEncryptCipherModeXTS)
3337        {
3338          encryptInfo.securityCipherMode |= TI_ENCRYPT_ATTRIB_CIPHER_XTS;
3339        }
3340
3341        /* How will subEvents be tracked? */
3342        encryptInfo.status = 0;
3343
3344        encryptInfo.sectorSize[0] = 512;  /* DIF is allowed on 512 BPS SATA drives */
3345        encryptInfo.sectorSize[1] = 520;
3346        encryptInfo.sectorSize[2] = 528;
3347        encryptInfo.sectorSize[3] = 4104;
3348        encryptInfo.sectorSize[4] = 4168;
3349        encryptInfo.sectorSize[5] = 4232;
3350
3351        encryptEventData.encryptEvent = tiEncryptGetInfo;
3352        encryptEventData.subEvent = 0;
3353        encryptEventData.pData = &encryptInfo;
3354
3355        ostiPortEvent(tiRoot,
3356                    tiEncryptOperation,
3357                    pModeEvent->status,
3358                    &encryptEventData);
3359        break;
3360      case AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE:
3361        TI_DBG1(("ossaHwCB: AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
3362
3363#ifdef IOCTL_INTERRUPT_TIME_CONFIG
3364         ostiPortEvent(tiRoot,
3365                    tiModePageOperation,
3366                    pModeEvent->status,
3367                    eventParm2
3368                 );
3369#endif /* IOCTL_INTERRUPT_TIME_CONFIG */
3370
3371        /*ostiPortEvent(tiRoot,
3372                    tiModePageOperation,
3373                    pModeEvent->status,
3374                    &encryptEventData);*/
3375        break;
3376      case AGSA_INTERRUPT_CONFIGURATION_PAGE:
3377        TI_DBG1(("ossaHwCB: AGSA_INTERRUPT_CONFIGURATION_PAGE 0x%x %p\n", pModeEvent->status,eventParm2));
3378
3379#ifdef IOCTL_INTERRUPT_TIME_CONFIG
3380        ostiPortEvent(tiRoot,
3381                    tiModePageOperation,
3382                    pModeEvent->status,
3383                    eventParm2
3384                    );
3385#endif /* IOCTL_INTERRUPT_TIME_CONFIG */
3386
3387        break;
3388      default:
3389        TI_DBG1(("ossaHwCB: Unknown Mode Event %x\n", *pModePage));
3390         break;
3391      }
3392
3393    }
3394    else
3395    {
3396      TI_DBG1(("ossaHwCB: Unknown modePageOperation %x\n", pModeEvent->modePageOperation));
3397    }
3398    break;
3399  }
3400
3401// #endif  /* INITIATOR_DRIVER */
3402
3403#ifdef REMOVED
3404  case OSSA_HW_EVENT_PHY_UNRECOVERABLE_ERROR:
3405  {
3406    PhyID = TD_GET_PHY_ID(eventParm1);
3407    PortState = TD_GET_PORT_STATE(eventParm1);
3408
3409    TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_PHY_UNRECOVERABLE_ERROR\n"));
3410
3411    if (PortState == OSSA_PORT_INVALID)
3412    {
3413      TI_DBG1(("ossaHwCB: INVALID port state\n"));
3414    }
3415    else
3416    {
3417      TI_DBG1(("ossaHwCB: VALID port state\n"));
3418    }
3419    break;
3420  }
3421#endif /* REMOVED */
3422    case OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED:
3423    {
3424      TI_DBG1(("ossaHwCB: OSSA_HW_EVENT_OPEN_RETRY_BACKOFF_THR_ADJUSTED\n"));
3425      break;
3426    }
3427
3428    default:
3429    {
3430      TI_DBG1(("ossaHwCB: default error (0x%X)!!!!!\n",event));
3431      break;
3432    }
3433  }
3434
3435  smTraceFuncExit(hpDBG_VERY_LOUD, 'R', "Y2");
3436  return;
3437}
3438
3439osGLOBAL void ossaPortControlCB(
3440                  agsaRoot_t          *agRoot,
3441                  agsaContext_t       *agContext,
3442                  agsaPortContext_t   *agPortContext,
3443                  bit32               portOperation,
3444                  bit32               status)
3445{
3446  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
3447  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
3448  tdsaPortContext_t   *onePortContext = agNULL;
3449
3450  TI_DBG6(("ossaPortControlCB: start\n"));
3451
3452  smTraceFuncEnter(hpDBG_VERY_LOUD,"Y3");
3453  if (portOperation == AGSA_PORT_SET_SMP_PHY_WIDTH)
3454  {
3455    TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_SET_SMP_PHY_WIDTH\n"));
3456  }
3457  else if (portOperation == AGSA_PORT_SET_PORT_RECOVERY_TIME)
3458  {
3459    TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_SET_PORT_RECOVERY_TIME\n"));
3460  }
3461  else if (portOperation == AGSA_PORT_IO_ABORT)
3462  {
3463    TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_IO_ABORT\n"));
3464    /* code is here because disocvery failed
3465       deregister all targets. Then, later call discovery if broacast is seen in ossaDeregisterDeviceHandleCB.
3466    */
3467    onePortContext = (tdsaPortContext_t *)agPortContext->osData;
3468    if (onePortContext == agNULL)
3469    {
3470      TI_DBG1(("ossaPortControlCB: onePortContext is NULL\n"));
3471      return;
3472    }
3473    /* qqqqq deregister all devices */
3474   tdsaDeregisterDevicesInPort(tiRoot, onePortContext);
3475
3476  }
3477  else if (portOperation == AGSA_PORT_SET_PORT_RESET_TIME)
3478  {
3479    TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_SET_PORT_RESET_TIME\n"));
3480  }
3481  else if (portOperation == AGSA_PORT_HARD_RESET)
3482  {
3483    TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_HARD_RESET\n"));
3484  }
3485  else if (portOperation == AGSA_PORT_CLEAN_UP)
3486  {
3487    TI_DBG1(("ossaPortControlCB: portOperation AGSA_PORT_CLEAN_UP\n"));
3488  }
3489  else if (portOperation == AGSA_STOP_PORT_RECOVERY_TIMER)
3490  {
3491    TI_DBG1(("ossaPortControlCB: portOperation AGSA_STOP_PORT_RECOVERY_TIMER\n"));
3492  }
3493  else
3494  {
3495    TI_DBG1(("ossaPortControlCB: undefined portOperation %d\n", portOperation));
3496  }
3497
3498  TI_DBG1(("ossaPortControlCB: status %d\n", status));
3499
3500  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y3");
3501  return;
3502}
3503
3504/*****************************************************************************
3505*! \brief  ossaHwRegRead
3506*
3507*  Purpose: This routine is called to read a 32-bit value from the PCI
3508*           registers of the controller
3509*
3510*  \param  agRoot:       Pointer to chip/driver Instance.
3511*  \param  regOffset:    Byte offset to chip register from which to read a 32-bit
3512*                        value.
3513*
3514*  \return:             32-bit value.
3515*
3516*  \note - The scope is shared target and initiator.
3517*
3518*****************************************************************************/
3519FORCEINLINE
3520bit32
3521ossaHwRegRead(agsaRoot_t *agRoot,
3522              bit32      regOffset
3523              )
3524{
3525  tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3526  bit32 return_value;
3527
3528
3529  return_value =  ostiChipReadBit32 (
3530                             osData->tiRoot,
3531                             regOffset
3532                             );
3533  if( agNULL != agRoot->sdkData )
3534  {
3535    smTrace(hpDBG_REGISTERS,"RR",regOffset);
3536    /* TP:RR regOffset */
3537    smTrace(hpDBG_REGISTERS,"RV",return_value);
3538    /* TP:RV value read */
3539  }
3540
3541  return(return_value);
3542
3543}
3544
3545/*****************************************************************************
3546*! \brief  ossaHwRegWrite
3547*
3548*  Purpose: This routine is called to write a 32-bit value to the PCI
3549*           registers of the controller.
3550*
3551*  \param   agRoot:     Pointer to chip/driver Instance.
3552*  \param   regOffset:  Byte offset to chip register to which chipIOValue is
3553*                       written.
3554*  \param   regValue:   32-bit value to write at chipIOOffset in host byte order.
3555*
3556*  \return:             None.
3557*
3558*  \note - The scope is shared target and initiator.
3559*
3560*****************************************************************************/
3561FORCEINLINE
3562void
3563ossaHwRegWrite(agsaRoot_t *agRoot,
3564               bit32      regOffset,
3565               bit32      regValue
3566               )
3567{
3568
3569  tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3570  if( agNULL != agRoot->sdkData )
3571  {
3572    smTrace(hpDBG_REGISTERS,"RW",regOffset);
3573    /* TP:RW regOffset */
3574    smTrace(hpDBG_REGISTERS,"VW",regValue);
3575    /* TP:VW value written */
3576  }
3577
3578  ostiChipWriteBit32 (
3579                      osData->tiRoot,
3580                      regOffset,
3581                      regValue
3582                      );
3583  return;
3584}
3585
3586/*****************************************************************************
3587*! \brief  ossaHwRegReadExt
3588*
3589*  Purpose: This routine is called to read a 32-bit value from a bus-specific
3590*           mapped registers of the controller
3591*
3592*  \param  agRoot:       Pointer to chip/driver Instance.
3593*  \param  regOffset:    Byte offset to chip register from which to read a 32-bit
3594*                        value.
3595*
3596*  \return:             32-bit value.
3597*
3598*  \note - The scope is shared target and initiator.
3599*
3600*****************************************************************************/
3601FORCEINLINE
3602bit32
3603ossaHwRegReadExt(
3604                 agsaRoot_t  *agRoot,
3605                 bit32       busBaseNumber,
3606                 bit32       regOffset
3607                 )
3608{
3609  tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3610
3611  bit32 return_value;
3612
3613  return_value = ostiChipReadBit32Ext(
3614                               osData->tiRoot,
3615                               busBaseNumber,
3616                               regOffset
3617                               );
3618
3619  /* TI_DBG4(("#_R: 0x%x:0x%x=0x%x\n",busBaseNumber,regOffset,return_value)); */
3620
3621  if( agNULL != agRoot->sdkData )
3622  {
3623    smTrace(hpDBG_REGISTERS,"EB",busBaseNumber);
3624    /* TP:EB EX read busBaseNumber */
3625    smTrace(hpDBG_REGISTERS,"EO",regOffset);
3626    /* TP:EO regOffset */
3627    smTrace(hpDBG_REGISTERS,"ER",return_value);
3628    /* TP:ER value read */
3629  }
3630  return(return_value);
3631}
3632
3633void ossaPCI_TRIGGER(agsaRoot_t  *agRoot )
3634{
3635  tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3636  ostiPCI_TRIGGER(osData->tiRoot);
3637
3638}
3639
3640
3641
3642/*****************************************************************************
3643*! \brief  ossaHwRegWriteExt
3644*
3645*  Purpose: This routine is called to write a 32-bit value to a bus specific
3646*           mapped registers of the controller.
3647*
3648*  \param   agRoot:     Pointer to chip/driver Instance.
3649*  \param   regOffset:  Byte offset to chip register to which chipIOValue is
3650*                       written.
3651*  \param   regValue:   32-bit value to write at chipIOOffset in host byte order.
3652*
3653*  \return:             None.
3654*
3655*  \note - The scope is shared target and initiator.
3656*
3657*****************************************************************************/
3658FORCEINLINE
3659void
3660ossaHwRegWriteExt(
3661                  agsaRoot_t  *agRoot,
3662                  bit32       busBaseNumber,
3663                  bit32       regOffset,
3664                  bit32       regValue
3665                  )
3666{
3667  tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3668  ostiChipWriteBit32Ext(
3669                        osData->tiRoot,
3670                        busBaseNumber,
3671                        regOffset,
3672                        regValue
3673                        );
3674
3675  /*  TI_DBG4(("#_W: 0x%x:0x%x=0x%x\n",busBaseNumber,regOffset,regValue)); */
3676
3677  if( agNULL != agRoot->sdkData )
3678  {
3679    smTrace(hpDBG_REGISTERS,"Eb",busBaseNumber);
3680    /* TP:Eb Ex Write busBaseNumber */
3681    smTrace(hpDBG_REGISTERS,"Eo",regOffset);
3682    /* TP:Eo regOffset */
3683    smTrace(hpDBG_REGISTERS,"Ew",regValue);
3684    /* TP:Ew value written  regValue*/
3685  }
3686  return;
3687}
3688
3689
3690osGLOBAL bit32 ossaHwRegReadConfig32(
3691              agsaRoot_t  *agRoot,
3692              bit32       regOffset
3693              )
3694{
3695  tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
3696  bit32 to_ret;
3697  to_ret= ostiChipConfigReadBit32( osData->tiRoot, regOffset);
3698  TI_DBG4(("ossaHwRegReadConfig32: regOffset 0x%x returns 0x%x\n",regOffset,to_ret));
3699  return(to_ret);
3700}
3701
3702
3703
3704
3705#ifdef TD_INT_COALESCE
3706void
3707ossaIntCoalesceInitCB(
3708                      agsaRoot_t                *agRoot,
3709                      agsaIntCoalesceContext_t    *agIntCoContext,
3710                      bit32                   status
3711                      )
3712{
3713  tdsaRootOsData_t          *osData = (tdsaRootOsData_t *)agRoot->osData;
3714  tiRoot_t                  *tiRoot = (tiRoot_t *)osData->tiRoot;
3715  tdsaContext_t             *tdsaAllShared = (tdsaContext_t *)osData->tdsaAllShared;
3716  tiIntCoalesceContext_t    *tiIntCoalesceCxt;
3717  tdsaIntCoalesceContext_t  *tdsaIntCoalCxt;
3718  tdsaIntCoalesceContext_t  *tdsaIntCoalCxtHead
3719    = (tdsaIntCoalesceContext_t *)tdsaAllShared->IntCoalesce;;
3720  bit32                     tiStatus;
3721
3722  TI_DBG2(("ossaIntCoalesceInitCB: start\n"));
3723
3724  tdsaIntCoalCxt = (tdsaIntCoalesceContext_t *)agIntCoContext->osData;
3725  tiIntCoalesceCxt = tdsaIntCoalCxt->tiIntCoalesceCxt;
3726  switch (status)
3727  {
3728  case AGSA_RC_SUCCESS:
3729    tiStatus = tiSuccess;
3730    break;
3731  case AGSA_RC_BUSY:
3732    tiStatus = tiBusy;
3733    break;
3734  case AGSA_RC_FAILURE:
3735    tiStatus = tiError;
3736    break;
3737  default:
3738    TI_DBG1(("ossaIntCoalesceInitCB: unknown status %d\n", status));
3739    tiStatus = tiError;
3740    break;
3741  }
3742
3743  TI_DBG2(("ossaIntCoalesceInitCB: status %d\n", tiStatus));
3744
3745  /* enqueue tdsaIntCoalCxt to freelink */
3746  tdsaIntCoalCxt->tiIntCoalesceCxt = agNULL;
3747  TI_DBG2(("ossaIntCoalesceInitCB: id %d\n", tdsaIntCoalCxt->id));
3748
3749  tdsaSingleThreadedEnter(tiRoot, TD_INTCOAL_LOCK);
3750  TDLIST_DEQUEUE_THIS(&(tdsaIntCoalCxt->MainLink));
3751  TDLIST_ENQUEUE_AT_TAIL(&(tdsaIntCoalCxt->FreeLink), &(tdsaIntCoalCxtHead->FreeLink));
3752  tdsaSingleThreadedLeave(tiRoot, TD_INTCOAL_LOCK);
3753
3754#ifdef OS_INT_COALESCE
3755  ostiInitiatorIntCoalesceInitCB(tiRoot,
3756                                 tiIntCoalesceCxt,
3757                                 tiStatus);
3758#endif
3759
3760  TI_DBG2(("ossaIntCoalesceInitCB: return end\n"));
3761
3762  return;
3763}
3764#endif /* TD_INT_COALESCE */
3765
3766/*****************************************************************************/
3767/*! \brief ossaSingleThreadedEnter
3768 *
3769 *
3770 * Purpose: This routine is called to ensure that only a single thread of
3771 *          the given port instance executes code in the region protected by
3772 *          this function.
3773 *
3774 *
3775 *  \param   agRoot:       Pointer to chip/driver Instance.
3776 *  \param   syncLockId    to be explained.
3777 *
3778 *
3779 *  \return None.
3780 *
3781 *  \note - The scope is shared target and initiator.
3782 *
3783 */
3784/*****************************************************************************/
3785FORCEINLINE
3786void ossaSingleThreadedEnter(
3787     agsaRoot_t *agRoot,
3788     bit32  syncLockId
3789     )
3790{
3791  tdsaRootOsData_t *pOsData = agNULL;
3792  tiRoot_t  *ptiRoot = agNULL;
3793  tdsaContext_t *tdsaAllShared = agNULL;
3794
3795  TD_ASSERT(agRoot, "agRoot");
3796  pOsData = (tdsaRootOsData_t *) (agRoot->osData);
3797  TD_ASSERT(pOsData, "pOsData");
3798  ptiRoot = pOsData->tiRoot;
3799  TD_ASSERT(ptiRoot, "ptiRoot");
3800
3801  tdsaAllShared = (tdsaContext_t *)pOsData->tdsaAllShared;
3802  TD_ASSERT(tdsaAllShared, "tdsaAllShared");
3803
3804  ostiSingleThreadedEnter(ptiRoot, syncLockId + tdsaAllShared->MaxNumOSLocks);
3805  return;
3806}
3807
3808/*****************************************************************************/
3809/*! \brief ossaSingleThreadedLeave
3810 *
3811 *
3812 *  Purpose: This routine is called to leave a critical region of code
3813 *           previously protected by a call to osSingleThreadedEnter()
3814 *
3815 *
3816 *  \param   agRoot:       Pointer to chip/driver Instance.
3817 *  \param   syncLockId    to be explained.
3818 *
3819 *
3820 *  \return None.
3821 *
3822 *  \note - The scope is shared target and initiator.
3823 *
3824 */
3825/*****************************************************************************/
3826FORCEINLINE
3827void ossaSingleThreadedLeave(
3828     agsaRoot_t *agRoot,
3829     bit32  syncLockId
3830     )
3831{
3832  tdsaRootOsData_t *pOsData = agNULL;
3833  tiRoot_t  *ptiRoot = agNULL;
3834  tdsaContext_t *tdsaAllShared = agNULL;
3835
3836  TD_ASSERT(agRoot, "agRoot");
3837  pOsData = (tdsaRootOsData_t *) (agRoot->osData);
3838  TD_ASSERT(pOsData, "pOsData");
3839  ptiRoot = pOsData->tiRoot;
3840  TD_ASSERT(ptiRoot, "ptiRoot");
3841
3842  tdsaAllShared = (tdsaContext_t *)pOsData->tdsaAllShared;
3843  TD_ASSERT(tdsaAllShared, "tdsaAllShared");
3844
3845  ostiSingleThreadedLeave(ptiRoot, syncLockId + tdsaAllShared->MaxNumOSLocks);
3846  return;
3847}
3848
3849#ifdef PERF_COUNT
3850osGLOBAL void ossaEnter(agsaRoot_t *agRoot, int io)
3851{
3852  ostiEnter(((tdsaRootOsData_t*)(agRoot->osData))->tiRoot, 0, io);
3853  return;
3854}
3855
3856osGLOBAL void ossaLeave(agsaRoot_t *agRoot, int io)
3857{
3858  ostiLeave(((tdsaRootOsData_t*)(agRoot->osData))->tiRoot, 0, io);
3859  return;
3860}
3861#endif
3862
3863
3864osGLOBAL void
3865ossaSSPIoctlCompleted(
3866                        agsaRoot_t                        *agRoot,
3867                        agsaIORequest_t           *agIORequest,
3868                        bit32                             agIOStatus,
3869                        bit32                             agIOInfoLen,
3870                        void                              *agParam,
3871                        bit16                             sspTag,
3872                        bit32                             agOtherInfo
3873                   )
3874{
3875  tdsaRootOsData_t                              *osData           = (tdsaRootOsData_t *)agRoot->osData;
3876  tiRoot_t                                              *tiRoot           = (tiRoot_t *)osData->tiRoot;
3877  tdIORequestBody_t                             *tdIORequestBody  = (tdIORequestBody_t *)agIORequest->osData;
3878  agsaSASRequestBody_t                  *agSASRequestBody = agNULL;
3879  agsaSSPInitiatorRequest_t             *agSSPFrame       = agNULL;
3880  bit8                          scsiOpcode        = 0;
3881
3882  agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody);
3883  agSSPFrame = &(agSASRequestBody->sspInitiatorReq);
3884  scsiOpcode = agSSPFrame->sspCmdIU.cdb[0];
3885
3886  TI_DBG2(("ossaSSPIoctlCompleted: start\n"));
3887
3888  if (agIOStatus == OSSA_SUCCESS)
3889  {
3890    TI_DBG2(("ossaSSPIoctlCompleted: Success status\n"));
3891  }
3892  else
3893  {
3894    TI_DBG1(("ossaSSPIoctlCompleted: Status 0x%x\n", agIOStatus));
3895  }
3896  switch(scsiOpcode)
3897  {
3898  case REPORT_LUN_OPCODE:
3899    ostiNumOfLUNIOCTLRsp(tiRoot, agIOStatus);
3900        break;
3901
3902  default:
3903        TI_DBG1(("ossaSSPIoctlCompleted: Unsupported SCSI command Response  0x%x\n",scsiOpcode));
3904        break;
3905  }
3906  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yi");
3907  return;
3908
3909}
3910
3911osGLOBAL void
3912ossaSMPIoctlCompleted(
3913                 agsaRoot_t            *agRoot,
3914                 agsaIORequest_t       *agIORequest,
3915                 bit32                 agIOStatus,
3916                 bit32                 agIOInfoLen,
3917                 agsaFrameHandle_t     agFrameHandle
3918                 )
3919{
3920        tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
3921        tiRoot_t                        *tiRoot = (tiRoot_t *)osData->tiRoot;
3922        TI_DBG2(("ossaSMPIoctlCompleted: start\n"));
3923
3924        if (agIOStatus == OSSA_SUCCESS)
3925        {
3926          TI_DBG2(("ossaSMPIoctlCompleted: Success status\n"));
3927        }
3928        else
3929        {
3930          TI_DBG1(("ossaSMPIoctlCompleted: Status 0x%x\n", agIOStatus));
3931        }
3932
3933        ostiSendSMPIOCTLRsp(tiRoot, agIOStatus);
3934        smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yi");
3935        return;
3936
3937}
3938
3939
3940/*****************************************************************************/
3941/*! \brief ossaSMPCompleted
3942 *
3943 *
3944 *  Purpose: This routine is called by lower layer to indicate the completion of
3945 *           SMP request
3946 *
3947 *  \param   agRoot:       Pointer to chip/driver Instance.
3948 *  \param   agIORequest   Pointer to SMP request handle
3949 *  \param   agIOStatus    Status
3950 *  \param   agFrameHeader:Pointer to SMP frame header.
3951 *  \param   agIOInfoLen   IO information length assoicated with the IO
3952 *  \param   agFrameHandle A Handle used to refer to the response frame
3953 *
3954 *
3955 *  \return None.
3956 *
3957 *  \note - The scope is shared target and initiator.
3958 *          For details, refer to SAS/SATA Low-Level API Specification
3959 */
3960/*****************************************************************************/
3961osGLOBAL void ossaSMPCompleted(
3962                 agsaRoot_t            *agRoot,
3963                 agsaIORequest_t       *agIORequest,
3964                 bit32                 agIOStatus,
3965                 bit32                 agIOInfoLen,
3966                 agsaFrameHandle_t     agFrameHandle
3967                 )
3968{
3969#ifdef PASSTHROUGH
3970  tdsaRootOsData_t         *osData = (tdsaRootOsData_t *)agRoot->osData;
3971  tiRoot_t                 *tiRoot = (tiRoot_t *)osData->tiRoot;
3972  tdPassthroughCmndBody_t  *tdPTCmndBody  = (tdPassthroughCmndBody_t *)agIORequest->osData;
3973  bit32                    tiStatus = tiPassthroughError;
3974  bit8                     SMPframe[agIOInfoLen + sizeof(agsaSMPFrameHeader_t)];
3975  bit8                     SMPpayload[agIOInfoLen];
3976
3977  TI_DBG2(("ossaSMPCompleted: start and passthrough\n"));
3978#else /* not PASSTHROUGH */
3979
3980  tdssSMPRequestBody_t *pSMPRequestBody = (tdssSMPRequestBody_t *) agIORequest->osData;
3981  TI_DBG4(("ossaSMPCompleted: start\n"));
3982#endif /* end not PASSTHROUGH */
3983
3984  TDSA_OUT_ENTER((tiRoot_t *)((tdsaRootOsData_t *)agRoot->osData)->tiRoot);
3985  smTraceFuncEnter(hpDBG_VERY_LOUD,"Y4");
3986
3987#ifdef PASSTHROUGH
3988  if (tdPTCmndBody == agNULL)
3989  {
3990    TI_DBG1(("ossaSMPCompleted: tdPTCmndBody is NULL \n"));
3991    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y4");
3992    goto ext;
3993  }
3994
3995  if (tdPTCmndBody->EventCB == agNULL)
3996  {
3997    TI_DBG1(("ossaSMPCompleted: tdPTCmndBody->EventCB is NULL \n"));
3998    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y4");
3999    goto ext;
4000  }
4001
4002  if (agIOStatus == OSSA_IO_SUCCESS)
4003  {
4004    tiStatus = tiPassthroughSuccess;
4005  }
4006  else if (agIOStatus == OSSA_IO_ABORTED)
4007  {
4008    tiStatus = tiPassthroughAborted;
4009  }
4010  else
4011  {
4012    tiStatus = tiPassthroughError;
4013  }
4014
4015  osti_memset(SMPpayload, 0, agIOInfoLen);
4016  osti_memset(SMPframe, 0, agIOInfoLen + sizeof(agsaSMPFrameHeader_t));
4017
4018  /* combine the header and payload */
4019  saFrameReadBlock(agRoot, agFrameHandle, 0, &SMPpayload, agIOInfoLen);
4020  osti_memcpy(SMPframe, agFrameHeader, sizeof(agsaSMPFrameHeader_t));
4021  osti_memcpy(SMPframe+sizeof(agsaSMPFrameHeader_t), SMPpayload, agIOInfoLen);
4022
4023  tdPTCmndBody->EventCB(tiRoot,
4024                        tdPTCmndBody->tiPassthroughRequest,
4025                        tiStatus,
4026                        SMPframe,
4027                        agIOInfoLen + sizeof(agsaSMPFrameHeader_t)
4028                        );
4029
4030
4031#else /* not PASSTHROUGH */
4032
4033  /*
4034    At initiator, passing SMP to TD layer, itdssSMPCompleted(), which does nothing.
4035    At target, passing SMP to TD layer, ttdsaSMPCompleted()
4036  */
4037  /*
4038     how to use agFrameHandle, when saFrameReadBlock() is used
4039  */
4040
4041  /* SPC can't be SMP target */
4042
4043  TI_DBG4(("ossaSMPCompleted: start\n"));
4044
4045  if (pSMPRequestBody == agNULL)
4046  {
4047    TI_DBG1(("ossaSMPCompleted: pSMPRequestBody is NULL \n"));
4048    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Y4");
4049    goto ext;
4050  }
4051
4052  if (pSMPRequestBody->SMPCompletionFunc == agNULL)
4053  {
4054    TI_DBG1(("ossaSMPCompleted: pSMPRequestBody->SMPCompletionFunc is NULL \n"));
4055    smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "Y4");
4056    goto ext;
4057  }
4058#ifdef TD_INTERNAL_DEBUG /* debugging */
4059  TI_DBG4(("ossaSMPCompleted: agIOrequest %p\n", agIORequest->osData));
4060  TI_DBG4(("ossaSMPCompleted: sizeof(tdIORequestBody_t) %d 0x%x\n", sizeof(tdIORequestBody_t),
4061           sizeof(tdIORequestBody_t)));
4062  TI_DBG4(("ossaSMPCompleted: SMPRequestbody %p\n", pSMPRequestBody));
4063  TI_DBG4(("ossaSMPCompleted: calling callback fn\n"));
4064  TI_DBG4(("ossaSMPCompleted: callback fn %p\n",pSMPRequestBody->SMPCompletionFunc));
4065#endif /* TD_INTERNAL_DEBUG */
4066  /*
4067    if initiator, calling itdssSMPCompleted() in itdcb.c
4068    if target,    calling ttdsaSMPCompleted() in ttdsmp.c
4069  */
4070  pSMPRequestBody->SMPCompletionFunc(
4071                                     agRoot,
4072                                     agIORequest,
4073                                     agIOStatus,
4074                                     agIOInfoLen,
4075                                     agFrameHandle
4076                                     );
4077
4078#endif /* Not PASSTHROUGH */
4079
4080  smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "Y4");
4081ext:
4082  TDSA_OUT_LEAVE((tiRoot_t *)((tdsaRootOsData_t *)agRoot->osData)->tiRoot);
4083  return;
4084}
4085
4086osGLOBAL void
4087ossaSMPReqReceived(
4088                   agsaRoot_t           *agRoot,
4089                   agsaDevHandle_t      *agDevHandle,
4090                   agsaFrameHandle_t    agFrameHandle,
4091                   bit32                agIOInfoLen,
4092                   bit32                phyId
4093                   )
4094{
4095  smTraceFuncEnter(hpDBG_VERY_LOUD,"Y5");
4096  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y5");
4097  return;
4098}
4099
4100/*****************************************************************************/
4101/*! \brief ossaSMPCAMCompleted
4102 *
4103 *
4104 *  Purpose: This routine is called by lower layer to indicate the completion of
4105 *           SMP request
4106 *
4107 *  \param   agRoot:       Pointer to chip/driver Instance.
4108 *  \param   agIORequest   Pointer to SMP request handle
4109 *  \param   agIOStatus    Status
4110 *  \param   agIOInfoLen   IO information length assoicated with the IO
4111 *  \param   agFrameHandle A Handle used to refer to the response frame
4112 *
4113 *
4114 *  \return None.
4115 *
4116 *  \note - The scope is shared target and initiator.
4117 *          For details, refer to SAS/SATA Low-Level API Specification
4118 */
4119/*****************************************************************************/
4120osGLOBAL void ossaSMPCAMCompleted(
4121                 agsaRoot_t            *agRoot,
4122                 agsaIORequest_t       *agIORequest,
4123                 bit32                 agIOStatus,
4124                 bit32                 agIOInfoLen,
4125                 agsaFrameHandle_t     agFrameHandle
4126                 )
4127{
4128  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
4129  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
4130  tdIORequestBody_t   *tdSMPRequestBody  = agNULL;
4131  bit32                context = osData->IntContext;
4132  tiSMPStatus_t        status;
4133  bit32               PhysUpper32;
4134  bit32               PhysLower32;
4135  bit32               memAllocStatus;
4136  void                *osMemHandle;
4137  bit32               *SMPpayload;
4138  TI_DBG2(("ossaSMPCAMCompleted: start\n"));
4139  TI_DBG2(("ossaSMPCAMCompleted: agIOInfoLen %d\n", agIOInfoLen));
4140  if (!agIORequest->osData)
4141  {
4142    TD_ASSERT((0), "ossaSMPCAMCompleted agIORequest->osData");
4143    goto ext;
4144  }
4145  tdSMPRequestBody = (tdIORequestBody_t *)agIORequest->osData;
4146  if (tdSMPRequestBody->tiIORequest->osData == agNULL)
4147  {
4148    TI_DBG1(("ossaSMPCAMCompleted: tdIORequestBody->tiIORequest->osData is null, wrong\n"));
4149    goto ext;
4150  }
4151  /* allocating agIORequest for SMP Payload itself */
4152  memAllocStatus = ostiAllocMemory(
4153                                   tiRoot,
4154                                   &osMemHandle,
4155                                   (void **)&SMPpayload,
4156                                   &PhysUpper32,
4157                                   &PhysLower32,
4158                                   8,
4159                                   agIOInfoLen,
4160                                   agTRUE
4161                                   );
4162  if (memAllocStatus != tiSuccess)
4163  {
4164    /* let os process IO */
4165    TI_DBG1(("ossaSMPCAMCompleted: ostiAllocMemory failed...\n"));
4166    goto ext;
4167  }
4168  if (SMPpayload == agNULL)
4169  {
4170    TI_DBG1(("ossaSMPCAMCompleted: ostiAllocMemory returned NULL SMPpayload\n"));
4171    goto ext;
4172  }
4173  if (agIOStatus == OSSA_IO_SUCCESS)
4174  {
4175    TI_DBG1(("ossaSMPCAMCompleted: Success status\n"));
4176    osti_memset(SMPpayload, 0, agIOInfoLen);
4177    TI_DBG1(("ossaSMPCAMCompleted: after memset\n"));
4178    saFrameReadBlock(agRoot, agFrameHandle, 0, SMPpayload, agIOInfoLen);
4179    TI_DBG1(("ossaSMPCAMCompleted: after read \n"));
4180    status = tiSMPSuccess;
4181  }
4182  else if (agIOStatus == OSSA_IO_ABORTED)
4183  {
4184    TI_DBG1(("ossaSMPCAMCompleted: SMP Aborted status\n"));
4185    status = tiSMPAborted;
4186    TI_DBG1(("ossaSMPCAMCompleted: failed status=%d\n", status));
4187    //failed to send smp command, we need to free the memory
4188    ostiFreeMemory(
4189                  tiRoot,
4190                  osMemHandle,
4191                  agIOInfoLen
4192                  );
4193  }
4194  else
4195  {
4196    TI_DBG1(("ossaSMPCAMCompleted: SMP failed status\n"));
4197    status = tiSMPFailed;
4198    TI_DBG1(("ossaSMPCAMCompleted: failed status=%d\n", status));
4199    //failed to send smp command, we need to free the memory
4200    ostiFreeMemory(
4201                  tiRoot,
4202                  osMemHandle,
4203                  agIOInfoLen
4204                  );
4205  }
4206  ostiInitiatorSMPCompleted(tiRoot,
4207                            tdSMPRequestBody->tiIORequest,
4208                            status,
4209                            agIOInfoLen,
4210                            SMPpayload,
4211                            context
4212                            );
4213  ext:
4214  TDSA_OUT_LEAVE((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
4215  return;
4216}
4217#ifdef REMOVED
4218#ifdef TARGET_DRIVER
4219/*****************************************************************************/
4220/*! \brief ossaSMPReqReceived
4221 *
4222 *
4223 *  Purpose: This routine is called by lower layer to indicate the reception of
4224 *           SMP request
4225 *
4226 *  \param   agRoot:       Pointer to chip/driver Instance.
4227 *  \param   agDevHandle   Pointer to the device handle of the device
4228 *  \param   agFrameHandle A Handle used to refer to the response frame
4229 *
4230 *
4231 *  \return None.
4232 *
4233 *  \note - The scope is target only
4234 *          For details, refer to SAS/SATA Low-Level API Specification
4235 */
4236/*****************************************************************************/
4237osGLOBAL void ossaSMPReqReceived(
4238                   agsaRoot_t           *agRoot,
4239                   agsaDevHandle_t      *agDevHandle,
4240                   agsaFrameHandle_t    agFrameHandle,
4241                   bit32                 agFrameLength,
4242                   bit32                phyId
4243                   )
4244{
4245  bit8                   smpHeader[4];
4246  agsaSMPFrameHeader_t   *agFrameHeader;
4247#ifdef PASSTHROUGH
4248  /* call the registered function(parameter in tiTGTPassthroughCmndRegister() by target */
4249  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
4250  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
4251  ttdsaTgt_t             *Target = (ttdsaTgt_t *)osData->ttdsaTgt;
4252
4253  bit8                   SMPframe[agIOInfoLen + sizeof(agsaSMPFrameHeader_t)];
4254  bit8                   SMPpayload[agIOInfoLen];
4255
4256  TI_DBG2(("ossaSMPReqReceived: start and passthrough\n"));
4257  osti_memset(SMPpayload, 0, agIOInfoLen);
4258  osti_memset(SMPframe, 0, agIOInfoLen + sizeof(agsaSMPFrameHeader_t));
4259  /* combine smp header and payload */
4260  saFrameReadBlock(agRoot, agFrameHandle, 0, &SMPpayload, agIOInfoLen);
4261  osti_memcpy(SMPframe, agFrameHeader, sizeof(agsaSMPFrameHeader_t));
4262  osti_memcpy(SMPframe+sizeof(agsaSMPFrameHeader_t), SMPpayload, agIOInfoLen);
4263
4264  Target->PasthroughCB(
4265                       tiRoot,
4266                       tiSASATA,
4267                       tiSMP,
4268                       tiSMPResponse,
4269                       SMPframe,
4270                       agIOInfoLen + sizeof(agsaSMPFrameHeader_t),
4271                       phyId
4272                       );
4273
4274#else
4275
4276  /*
4277    agDevHandle_t->osData points to tdssDeviceData_t
4278   */
4279  tdsaDeviceData_t *pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
4280
4281    saFrameReadBlock(agRoot, agFrameHandle, 0, smpHeader, 4);
4282    agFrameHeader = (agsaSMPFrameHeader_t *)smpHeader;
4283  TI_DBG4(("ossaSMPReqReceived: start\n"));
4284
4285  /* tdtypes.h, calling  ttdsaSMPReqReceived in ttdsmp.c */
4286  pDeviceData->pJumpTable->pSMPReqReceived (
4287                                            agRoot,
4288                                            agDevHandle,
4289                                            agFrameHeader,
4290                                            agFrameHandle,
4291                                            agFrameLength,
4292                                            phyId
4293                                            );
4294#endif
4295  return;
4296}
4297#endif
4298#endif
4299
4300/*****************************************************************************/
4301/*! \brief ossaSSPCompleted
4302 *
4303 *
4304 *  Purpose: This routine is called by lower layer to indicate the completion of
4305 *           SSP request
4306 *
4307 *  \param   agRoot:       Pointer to chip/driver Instance.
4308 *  \param   agIORequest   Pointer to SMP request handle
4309 *  \param   agIOStatus    Status
4310 *  \param   agIOInfoLen   IO information length assoicated with the IO
4311 *  \param   agFrameHandle A Handle used to refer to the response frame
4312 *
4313 *
4314 *  \return None.
4315 *
4316 *  \note - The scope is shared target and initiator.
4317 *          For details, refer to SAS/SATA Low-Level API Specification
4318 */
4319/*****************************************************************************/
4320FORCEINLINE
4321void ossaSSPCompleted(
4322                 agsaRoot_t          *agRoot,
4323                 agsaIORequest_t     *agIORequest,
4324                 bit32               agIOStatus,
4325                 bit32               agIOInfoLen,
4326                 void                *agParam,
4327                 bit16               sspTag,
4328                 bit32               agOtherInfo
4329                )
4330{
4331  tdIORequestBody_t  *pIORequestBody;
4332#ifdef TD_DEBUG_ENABLE
4333  tiDeviceHandle_t   *tiDeviceHandle = agNULL;
4334  tdsaDeviceData_t   *oneDeviceData = agNULL;
4335#endif
4336
4337  TDSA_OUT_ENTER((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
4338  smTraceFuncEnter(hpDBG_VERY_LOUD,"2L");
4339
4340  if(!agIORequest->osData)
4341  {
4342    TD_ASSERT((0), "ossaSSPCompleted agIORequest->osData");
4343    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2L");
4344    goto ext;
4345  }
4346  pIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4347
4348
4349  TI_DBG4(("ossaSSPCompleted: start\n"));
4350
4351  if (pIORequestBody == agNULL)
4352  {
4353    TI_DBG1(("ossaSSPCompleted: pIORequestBody is NULL \n"));
4354    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2L");
4355    goto ext;
4356  }
4357  if (pIORequestBody->IOCompletionFunc == agNULL)
4358  {
4359#ifdef TD_DEBUG_ENABLE
4360    tiDeviceHandle = pIORequestBody->tiDevHandle;
4361    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
4362#endif
4363    TI_DBG1(("ossaSSPCompleted: IOCompletionFunc is NULL \n"));
4364    TI_DBG1(("ossaSSPCompleted: did %d \n", oneDeviceData->id));
4365    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2L");
4366    goto ext;
4367  }
4368
4369   /*
4370     if initiator, calling itdssIOCompleted() in itdcb.c
4371     if initiator, calling itdssTaskCompleted in itdcb.c
4372     if target,    calling ttdsaIOCompleted() in ttdio.c
4373   */
4374  pIORequestBody->IOCompletionFunc(
4375                                   agRoot,
4376                                   agIORequest,
4377                                   agIOStatus,
4378                                   agIOInfoLen,
4379                                   agParam,
4380                                   agOtherInfo
4381                                   );
4382  smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2L");
4383ext:
4384  TDSA_OUT_LEAVE((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
4385  return;
4386}
4387
4388#ifdef FAST_IO_TEST
4389GLOBAL void ossaFastSSPCompleted(
4390                 agsaRoot_t          *agRoot,
4391                 agsaIORequest_t     *cbArg,
4392                 bit32               agIOStatus,
4393                 bit32               agIOInfoLen,
4394                 void                *agParam,
4395                 bit16               sspTag,
4396                 bit32               agOtherInfo
4397                )
4398{
4399  agsaFastCBBuf_t    *safb = (agsaFastCBBuf_t*)cbArg;
4400  tdsaRootOsData_t *osData = (tdsaRootOsData_t*)agRoot->osData;
4401  tiRoot_t         *tiRoot = (tiRoot_t*)osData->tiRoot;
4402  bit32            scsi_status;
4403  bit32            data_status;
4404  bit32            respLen;
4405  bit8             respData[128];
4406  bit32            senseLen;
4407  agsaSSPResponseInfoUnit_t agSSPRespIU;
4408
4409  TDSA_OUT_ENTER((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
4410  smTraceFuncEnter(hpDBG_VERY_LOUD,"Y6");
4411
4412  TI_DBG4(("ossaSSPCompleted: start\n"));
4413
4414  if (safb->cb == agNULL || safb->cbArg == agNULL)
4415  {
4416    TI_DBG1(("ossaFastSSPCompleted: pIORequestBody is NULL \n"));
4417    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y6");
4418    TD_ASSERT((0), "");
4419    goto ext;
4420  }
4421
4422  switch (agIOStatus)
4423  {
4424    case OSSA_IO_SUCCESS:
4425
4426      /* ~ itdssIOSuccessHandler */
4427      if ((agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t)))
4428      {
4429        ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, OSSA_IO_SUCCESS, 0);
4430        break;
4431      }
4432
4433      /* reads agsaSSPResponseInfoUnit_t */
4434      saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU,
4435                       sizeof(agsaSSPResponseInfoUnit_t));
4436
4437      data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU);
4438      scsi_status = agSSPRespIU.status;
4439
4440      TI_DBG1(("itdssIOSuccessHandler: scsi_status %d\n", scsi_status));
4441
4442      /* endianess is invovled here */
4443      senseLen = SA_SSPRESP_GET_SENSEDATALEN(&agSSPRespIU);
4444      respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU);
4445      TI_DBG2(("itdssIOSuccessHandler: scsi status=0x%x, senselen=0x%x resplen "
4446               "0x%x\n", scsi_status, senseLen, respLen));
4447
4448      if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen)
4449      {
4450        ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4451                                     tiDetailOtherError);
4452        break;
4453      }
4454
4455      /* reads response data */
4456      saFrameReadBlock(agRoot, agParam, sizeof(agsaSSPResponseInfoUnit_t),
4457                       respData, respLen);
4458      /* reads sense data */
4459      saFrameReadBlock(agRoot, agParam, sizeof(agsaSSPResponseInfoUnit_t)
4460                       + respLen, safb->pSenseData, senseLen);
4461
4462      if (data_status == 0)
4463      {
4464        /* NO_DATA */
4465        TI_DBG2(("ossaFastSSPCompleted: no data\n"));
4466        ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOSuccess,
4467                                     scsi_status);
4468        break;
4469      }
4470
4471      if (data_status == 1)
4472      {
4473        /* RESPONSE_DATA */
4474        TI_DBG1(("ossaFastSSPCompleted: response data \n"));
4475        ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOSuccess, 0);
4476        break;
4477      }
4478
4479      if (data_status == 2)
4480      {
4481        tiSenseData_t senseData;
4482
4483        /* SENSE_DATA */
4484        TI_DBG2(("itdssIOSuccessHandler: sense data \n"));
4485
4486        senseData.senseData = safb->pSenseData;
4487        senseData.senseLen = MIN(*(safb->senseLen), senseLen);
4488
4489        /* when ASC = 0x04 - Log Unit Not Ready,
4490           and ASCQ = 0x11 - Enable Spinup Required:
4491           call saLocalPhyControl to notify spinup */
4492        if (((char*)safb->pSenseData)[12] == 0x04 &&
4493            ((char*)safb->pSenseData)[13] == 0x11)
4494        {
4495          int i;
4496
4497          TI_DBG2(("ossaFastSSPCompleted: sending notfify spinup\n"));
4498
4499          if (((tdsaDeviceData_t*)safb->oneDeviceData)->directlyAttached ==
4500               agTRUE)
4501          {
4502            for (i = 0; i < TD_MAX_NUM_NOTIFY_SPINUP; i++)
4503            {
4504              saLocalPhyControl(agRoot, agNULL, 0,
4505                                ((tdsaDeviceData_t*)safb->oneDeviceData)->phyID,
4506                                AGSA_PHY_NOTIFY_ENABLE_SPINUP,
4507                                agNULL);
4508            }
4509          }
4510        }
4511
4512        if (*(safb->senseLen) > senseData.senseLen)
4513          *(safb->senseLen) = senseData.senseLen;
4514//       memcpy((void *)safb->pSenseData, senseData.senseData, safb->senseLen);
4515
4516        ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOSuccess,
4517                                     scsi_status);
4518        break;
4519      }
4520
4521      if (data_status == 3)
4522      {
4523        /* RESERVED */
4524        TI_DBG1(("ossaFastSSPCompleted: reserved wrong!!!\n"));
4525
4526        ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4527                                     scsi_status);
4528        break;
4529      }
4530      break;
4531#ifdef REMOVED
4532    case OSSA_IO_OVERFLOW:
4533      ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOOverRun,
4534                                   agIOInfoLen);
4535      break;
4536#endif /* REMOVED */
4537    case OSSA_IO_UNDERFLOW:
4538      ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOUnderRun,
4539                                   agIOInfoLen);
4540      break;
4541
4542    case OSSA_IO_ABORTED:
4543      ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4544                                   tiDetailAborted);
4545      break;
4546    case OSSA_IO_ABORT_RESET:
4547      ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4548                                   tiDetailAbortReset);
4549      break;
4550    case OSSA_IO_NO_DEVICE:
4551      ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4552                                   tiDetailNoLogin);
4553      break;
4554    case OSSA_IO_DS_NON_OPERATIONAL:
4555    {
4556
4557      tdsaDeviceData_t *oneDeviceData;
4558
4559      oneDeviceData = (tdsaDeviceData_t*)safb->oneDeviceData;
4560      if (oneDeviceData->valid == agTRUE &&
4561          oneDeviceData->registered == agTRUE &&
4562          oneDeviceData->tdPortContext != agNULL)
4563      {
4564        saSetDeviceState(oneDeviceData->agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData),
4565                         oneDeviceData->agDevHandle, SA_DS_OPERATIONAL);
4566      }
4567      /* fall through */
4568    }
4569
4570    default:
4571      ((ostiFastSSPCb_t)safb->cb)(tiRoot, safb->cbArg, tiIOFailed,
4572                                   tiDetailOtherError);
4573      break;
4574  }
4575
4576  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y6");
4577
4578ext:
4579  TDSA_OUT_LEAVE((tiRoot_t*)((tdsaRootOsData_t*)agRoot->osData)->tiRoot);
4580  return;
4581} /* ossaFastSSPCompleted */
4582#endif
4583
4584/*****************************************************************************/
4585/*! \brief ossaSSPReqReceived
4586 *
4587 *
4588 *  Purpose: This routine is called by lower layer to indicate the reception of
4589 *           SMP request
4590 *
4591 *  \param   agRoot:         Pointer to chip/driver Instance.
4592 *  \param   agDevHandle     Pointer to the device handle of the device
4593 *  \param   agFrameHandle   A Handle used to refer to the response frame
4594 *  \param   agInitiatorTag  the initiator tag
4595 *  \param   agFrameType     SSP frame type
4596 *
4597 *  \return none.
4598 *
4599 *  \note - The scope is target only
4600 *          For details, refer to SAS/SATA Low-Level API Specification
4601 */
4602/*****************************************************************************/
4603osGLOBAL void ossaSSPReqReceived(
4604                   agsaRoot_t           *agRoot,
4605                   agsaDevHandle_t      *agDevHandle,
4606                   agsaFrameHandle_t    agFrameHandle,
4607                   bit16                agInitiatorTag,
4608                   bit32                parameter,
4609                   bit32                agFrameLen
4610                   )
4611{
4612  /*
4613    at target only
4614    uses jumptable, not callback
4615  */
4616  /*
4617    agDevHandle_t->osData points to tdssDeviceData_t
4618  */
4619  tdsaDeviceData_t *pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData;
4620  smTraceFuncEnter(hpDBG_VERY_LOUD,"Y7");
4621
4622  /* tdtypes.h, calling  ttdsaSSPReqReceived() in ttdio.c */
4623  pDeviceData->pJumpTable->pSSPReqReceived (
4624                                            agRoot,
4625                                            agDevHandle,
4626                                            agFrameHandle,
4627                                            agInitiatorTag,
4628                                            parameter,
4629                                            agFrameLen
4630                                            );
4631  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y7");
4632  return;
4633}
4634/*****************************************************************************/
4635/*! \brief ossaStallThread
4636 *
4637 *
4638 *  Purpose: This routine is called to stall this thread for a number of
4639 *           microseconds.
4640 *
4641 *
4642 *  \param  agRoot:       Pointer to chip/driver Instance.
4643 *  \param   microseconds: Micro second to stall.
4644 *
4645 *
4646 *  \return None.
4647 *
4648 *  \note - The scope is shared target and initiator.
4649 *
4650 */
4651/*****************************************************************************/
4652osGLOBAL void ossaStallThread(agsaRoot_t *agRoot,
4653                bit32 microseconds
4654                )
4655{
4656  tdsaRootOsData_t *pOsData = (tdsaRootOsData_t *) (agRoot->osData);
4657
4658  ostiStallThread (
4659                   pOsData->tiRoot,
4660                   microseconds
4661                   );
4662  return;
4663}
4664
4665
4666/*****************************************************************************
4667*! \brief  ossaSSPEvent
4668*
4669*   This routine is called to notify the OS Layer of an event associated with
4670*   SAS port or SAS device
4671*
4672*  \param   agRoot:         Handles for this instance of SAS/SATA hardware
4673*  \param   agIORequest     Pointer to IO request
4674*  \param   event:          event type
4675*  \param   agIOInfoLen:    not in use
4676*  \param   agFrameHandle:  not in use
4677*
4678*  \return: none
4679*
4680*****************************************************************************/
4681/* in case of CMD ACK_NAK timeout, send query task */
4682osGLOBAL void ossaSSPEvent(
4683             agsaRoot_t           *agRoot,
4684             agsaIORequest_t      *agIORequest,
4685             agsaPortContext_t    *agPortContext,
4686             agsaDevHandle_t      *agDevHandle,
4687             bit32                event,
4688             bit16                sspTag,
4689             bit32                agIOInfoLen,
4690             void                 *agParam
4691             )
4692{
4693#ifdef INITIATOR_DRIVER
4694  tdsaRootOsData_t            *osData = (tdsaRootOsData_t *)agRoot->osData;
4695  tiRoot_t                    *tiRoot = (tiRoot_t *)osData->tiRoot;
4696  /*  bit32                       intContext = osData->IntContext; */
4697  void                        *osMemHandle;
4698  tdIORequestBody_t           *TMtdIORequestBody;
4699  bit32                       PhysUpper32;
4700  bit32                       PhysLower32;
4701  bit32                       memAllocStatus;
4702  bit32                       agRequestType;
4703  agsaIORequest_t             *agTMIORequest = agNULL;  /* task management itself */
4704  agsaSASRequestBody_t        *agSASRequestBody = agNULL;
4705  agsaSSPScsiTaskMgntReq_t    *agSSPTaskMgntRequest;
4706  bit32                       saStatus;
4707  bit32                       agIORequestType;  /* type of IO recevied */
4708  tiIORequest_t               *taskTag;                 /* being task managed one */
4709  tdIORequestBody_t           *tdIORequestBody;
4710#endif
4711
4712#ifdef REMOVED
4713  tiDeviceHandle_t            *tiDeviceHandle;
4714  tdsaDeviceData_t            *oneDeviceData = agNULL;
4715  tdIORequestBody_t           *tdAbortIORequestBody;
4716#endif
4717  agsaDifDetails_t            agDifDetails;
4718  bit8                        framePayload[256];
4719#ifdef REMOVED
4720  bit16                       frameOffset = 0;
4721#endif
4722  bit16                       frameLen = 0;
4723
4724  TI_DBG6(("ossaSSPEvent: start\n"));
4725  smTraceFuncEnter(hpDBG_VERY_LOUD,"Y9");
4726
4727
4728
4729  if (event == OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT ||
4730      event == OSSA_IO_XFER_ERROR_BREAK ||
4731      event == OSSA_IO_XFER_ERROR_PHY_NOT_READY
4732      )
4733  {
4734
4735    /* IO being task managed(the original IO) depending on event */
4736#ifdef INITIATOR_DRIVER
4737    tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4738    taskTag         = tdIORequestBody->tiIORequest;
4739#endif
4740#ifdef REMOVED
4741    tiDeviceHandle  = tdIORequestBody->tiDevHandle;
4742    oneDeviceData   = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
4743#endif
4744
4745#ifdef INITIATOR_DRIVER
4746    agIORequestType = tdIORequestBody->agRequestType;
4747
4748    /* error checking; only command is expected here */
4749    if (agIORequestType == AGSA_REQ_TYPE_UNKNOWN)
4750    {
4751      TI_DBG1(("ossaSSPEvent: incorrect frame 0x%x. Should be command\n", agIORequestType));
4752      smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Y9");
4753      return;
4754    }
4755
4756    /* Allocate memory for query task management */
4757    memAllocStatus = ostiAllocMemory(
4758                                     tiRoot,
4759                                     &osMemHandle,
4760                                     (void **)&TMtdIORequestBody,
4761                                     &PhysUpper32,
4762                                     &PhysLower32,
4763                                     8,
4764                                     sizeof(tdIORequestBody_t),
4765                                     agTRUE
4766                                     );
4767
4768    if (memAllocStatus != tiSuccess)
4769    {
4770      /* let os process IO */
4771      TI_DBG1(("ossaSSPEvent: ostiAllocMemory failed...\n"));
4772      smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Y9");
4773      return;
4774    }
4775
4776    if (TMtdIORequestBody == agNULL)
4777    {
4778      /* let os process IO */
4779      TI_DBG1(("ossaSSPEvent: ostiAllocMemory returned NULL TMIORequestBody\n"));
4780      smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Y9");
4781      return;
4782    }
4783
4784    /* setup task management structure */
4785    TMtdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
4786    /* TD generates Query Task not OS layer */
4787    TMtdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = agNULL;
4788    TMtdIORequestBody->IOType.InitiatorTMIO.TaskTag = taskTag;
4789
4790    /* initialize callback function */
4791    TMtdIORequestBody->IOCompletionFunc = itdssQueryTaskCompleted;
4792
4793    /* initialize tiDevhandle */
4794    TMtdIORequestBody->tiDevHandle = tdIORequestBody->tiDevHandle;
4795
4796
4797    /* initialize agIORequest */
4798    agTMIORequest = &(TMtdIORequestBody->agIORequest);
4799    agTMIORequest->osData = (void *) TMtdIORequestBody;
4800    agTMIORequest->sdkData = agNULL; /* LL takes care of this */
4801
4802    /* request type */
4803    agRequestType = AGSA_SSP_TASK_MGNT_REQ;
4804    TMtdIORequestBody->agRequestType = AGSA_SSP_TASK_MGNT_REQ;
4805
4806    /*
4807      initialize
4808      tdIORequestBody_t tdIORequestBody -> agSASRequestBody
4809    */
4810    agSASRequestBody = &(TMtdIORequestBody->transport.SAS.agSASRequestBody);
4811    agSSPTaskMgntRequest = &(agSASRequestBody->sspTaskMgntReq);
4812
4813    /* fill up LUN field */
4814    osti_memset(agSSPTaskMgntRequest->lun, 0, 8);
4815
4816    /* sets taskMgntFunction field */
4817    agSSPTaskMgntRequest->taskMgntFunction = AGSA_QUERY_TASK;
4818    /* debugging */
4819    if (TMtdIORequestBody->IOCompletionFunc == agNULL)
4820    {
4821      TI_DBG1(("ossaSSPEvent: Error !!! IOCompletionFunc is NULL\n"));
4822    }
4823    /* send query task management */
4824    saStatus = saSSPStart(agRoot,
4825                          agTMIORequest,
4826                          0,
4827                          agDevHandle,
4828                          agRequestType,
4829                          agSASRequestBody,
4830                          agIORequest,
4831                          &ossaSSPCompleted);
4832
4833    if (saStatus != AGSA_RC_SUCCESS)
4834    {
4835      /* free up allocated memory */
4836      ostiFreeMemory(
4837                     tiRoot,
4838                     TMtdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
4839                     sizeof(tdIORequestBody_t)
4840                     );
4841      TI_DBG1(("ossaSSPEvent: saSSPStart failed\n"));
4842      return;
4843    }
4844#endif
4845  }
4846#ifdef REMOVED
4847  else if (event == OSSA_IO_ABORTED)
4848  {
4849    TI_DBG2(("ossaSSPEvent: OSSA_IO_ABORTED\n"));
4850    /* clean up TD layer's IORequestBody */
4851    tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4852    ostiFreeMemory(
4853                   tiRoot,
4854                   tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
4855                   sizeof(tdIORequestBody_t)
4856                   );
4857
4858  }
4859  else if (event == OSSA_IO_NOT_VALID)
4860  {
4861    TI_DBG1(("ossaSSPEvent: OSSA_IO_NOT_VALID\n"));
4862    tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4863    ostiFreeMemory(
4864                   tiRoot,
4865                   tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
4866                   sizeof(tdIORequestBody_t)
4867                   );
4868
4869
4870  }
4871#endif
4872  else if (event == OSSA_IO_XFER_CMD_FRAME_ISSUED)
4873  {
4874    TI_DBG2(("ossaSSPEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED\n"));
4875  }
4876  else if (event == OSSA_IO_XFER_ERROR_OFFSET_MISMATCH)
4877  {
4878    TI_DBG1(("ossaSSPEvent: OSSA_IO_XFER_ERROR_OFFSET_MISMATCH\n"));
4879  }
4880  else if (event == OSSA_IO_OVERFLOW)
4881  {
4882    TI_DBG1(("ossaSSPEvent: OSSA_IO_OVERFLOW\n"));
4883    /*
4884    ??? can't call; missing agIOInfoLen
4885    ostiInitiatorIOCompleted (
4886                              tiRoot,
4887                              tdIORequestBody->tiIORequest,
4888                              tiIOOverRun,
4889                              agIOInfoLen,
4890                              agNULL,
4891                              intContext
4892                              );
4893
4894    */
4895
4896  }
4897  else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED)
4898  {
4899    TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED\n"));
4900  }
4901  else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO)
4902  {
4903    TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO\n"));
4904  }
4905  else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST)
4906  {
4907    TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST\n"));
4908  }
4909  else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE)
4910  {
4911    TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE\n"));
4912  }
4913  else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED)
4914  {
4915    TI_DBG1(("ossaSSPEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED\n"));
4916  }
4917  else if (event == OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH)
4918  {
4919    TI_DBG1(("ossaSSPEvent: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH\n"));
4920  }
4921  else if (event == OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN)
4922  {
4923    TI_DBG1(("ossaSSPEvent: OSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN\n"));
4924  }
4925  else if (event == OSSA_IO_XFR_ERROR_DIF_MISMATCH                 ||
4926           event == OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH ||
4927           event == OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH   ||
4928           event == OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH                 )
4929  {
4930    TI_DBG1(("ossaSSPEvent: DIF related, event 0x%x\n", event));
4931    /* process DIF detail information */
4932    TI_DBG2(("ossaSSPEvent: agIOInfoLen %d\n", agIOInfoLen));
4933    if (agParam == agNULL)
4934    {
4935      TI_DBG2(("ossaSSPEvent: agParam is NULL!!!\n"));
4936      return;
4937    }
4938    if (agIOInfoLen < sizeof(agsaDifDetails_t))
4939    {
4940      TI_DBG2(("ossaSSPEvent: wrong agIOInfoLen!!! agIOInfoLen %d sizeof(agsaDifDetails_t) %d\n", agIOInfoLen, (int)sizeof(agsaDifDetails_t)));
4941      return;
4942    }
4943    /* reads agsaDifDetails_t */
4944    saFrameReadBlock(agRoot, agParam, 0, &agDifDetails, sizeof(agsaDifDetails_t));
4945#ifdef REMOVED
4946    frameOffset = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF);
4947#endif
4948    frameLen = (bit16)((agDifDetails.ErrBoffsetEDataLen & 0xFFFF0000) >> 16);
4949
4950    TI_DBG2(("ossaSSPEvent: UpperLBA 0x%08x LowerLBA 0x%08x\n", agDifDetails.UpperLBA, agDifDetails.LowerLBA));
4951    TI_DBG2(("ossaSSPEvent: SASAddrHI 0x%08x SASAddrLO 0x%08x\n",
4952             TD_GET_SAS_ADDRESSHI(agDifDetails.sasAddressHi), TD_GET_SAS_ADDRESSLO(agDifDetails.sasAddressLo)));
4953    TI_DBG2(("ossaSSPEvent: DIF error mask 0x%x Device ID 0x%x\n",
4954             (agDifDetails.DIFErrDevID) & 0xFF, (agDifDetails.DIFErrDevID & 0xFFFF0000) >> 16));
4955    if (frameLen != 0 && frameLen <= 256)
4956    {
4957      saFrameReadBlock(agRoot, agParam, sizeof(agsaDifDetails_t), framePayload, frameLen);
4958      tdhexdump("ossaSSPEvent frame", framePayload, frameLen);
4959    }
4960  }
4961  else
4962  {
4963    TI_DBG1(("ossaSSPEvent: other event 0x%x\n", event));
4964  }
4965
4966  smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "Y9");
4967  return;
4968}
4969
4970#ifdef FDS_SM
4971osGLOBAL void ossaSATAIDAbortCB(
4972               agsaRoot_t               *agRoot,
4973               agsaIORequest_t          *agIORequest,
4974               bit32                    flag,
4975               bit32                    status)
4976{
4977  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
4978  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
4979  tdIORequestBody_t       *tdAbortIORequestBody;
4980
4981  TI_DBG1(("ossaSATAIDAbortCB: start flag %d status %d\n", flag, status));
4982
4983  tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
4984
4985  /*
4986   triggered by tdIDStartTimerCB
4987  */
4988  ostiFreeMemory(
4989                 tiRoot,
4990                 tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
4991                 sizeof(tdIORequestBody_t)
4992                );
4993  return;
4994}
4995#endif
4996
4997#ifdef INITIATOR_DRIVER
4998osGLOBAL void ossaSSPAbortCB(
4999               agsaRoot_t               *agRoot,
5000               agsaIORequest_t          *agIORequest,
5001               bit32                    flag,
5002               bit32                    status)
5003{
5004  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
5005  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
5006  tdIORequestBody_t       *tdAbortIORequestBody = agNULL;
5007  tdsaDeviceData_t        *oneDeviceData        = agNULL;
5008  tiDeviceHandle_t        *tiDeviceHandle       = agNULL;
5009  tiIORequest_t           *taskTag              = agNULL;
5010
5011  TI_DBG2(("ossaSSPAbortCB: start\n"));
5012  smTraceFuncEnter(hpDBG_VERY_LOUD,"Ya");
5013
5014  tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5015  if (tdAbortIORequestBody == agNULL)
5016  {
5017    TI_DBG1(("ossaSSPAbortCB: tdAbortIORequestBody is NULL warning!!!!\n"));
5018    return;
5019  }
5020
5021  if (flag == 2)
5022  {
5023    /* abort per port */
5024    TI_DBG1(("ossaSSPAbortCB: abort per port\n"));
5025  }
5026  else if (flag == 1)
5027  {
5028    TI_DBG2(("ossaSSPAbortCB: abort all\n"));
5029
5030    tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle;
5031    if (tiDeviceHandle == agNULL)
5032    {
5033      TI_DBG1(("ossaSSPAbortCB: tiDeviceHandle is NULL warning!!!!\n"));
5034      ostiFreeMemory(
5035               tiRoot,
5036               tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5037               sizeof(tdIORequestBody_t)
5038               );
5039      return;
5040    }
5041
5042    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
5043    if (oneDeviceData == agNULL)
5044    {
5045      TI_DBG1(("ossaSSPAbortCB: oneDeviceData is NULL warning!!!!\n"));
5046      ostiFreeMemory(
5047               tiRoot,
5048               tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5049               sizeof(tdIORequestBody_t)
5050               );
5051      return;
5052    }
5053
5054    if (status == OSSA_IO_SUCCESS)
5055    {
5056      TI_DBG2(("ossaSSPAbortCB: OSSA_IO_SUCCESS\n"));
5057      /* clean up TD layer's IORequestBody */
5058      if (oneDeviceData->OSAbortAll == agTRUE)
5059      {
5060        oneDeviceData->OSAbortAll = agFALSE;
5061        ostiInitiatorEvent( tiRoot,
5062                            agNULL,
5063                            tiDeviceHandle,
5064                            tiIntrEventTypeLocalAbort,
5065                            tiAbortOK,
5066                            agNULL);
5067      }
5068      else
5069      {
5070        TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5071        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5072      }
5073      TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5074      ostiFreeMemory(
5075                     tiRoot,
5076                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5077                     sizeof(tdIORequestBody_t)
5078                     );
5079
5080    }
5081    else if (status == OSSA_IO_NOT_VALID)
5082    {
5083      TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NOT_VALID\n"));
5084      /* clean up TD layer's IORequestBody */
5085      if (oneDeviceData->OSAbortAll == agTRUE)
5086      {
5087        oneDeviceData->OSAbortAll = agFALSE;
5088        ostiInitiatorEvent( tiRoot,
5089                            agNULL,
5090                            tiDeviceHandle,
5091                            tiIntrEventTypeLocalAbort,
5092                            tiAbortFailed,
5093                            agNULL );
5094      }
5095      else
5096      {
5097        TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5098        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5099      }
5100      TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5101      ostiFreeMemory(
5102                     tiRoot,
5103                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5104                     sizeof(tdIORequestBody_t)
5105                     );
5106    }
5107    else if (status == OSSA_IO_NO_DEVICE)
5108    {
5109      TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NO_DEVICE\n"));
5110      /* clean up TD layer's IORequestBody */
5111      if (oneDeviceData->OSAbortAll == agTRUE)
5112      {
5113        oneDeviceData->OSAbortAll = agFALSE;
5114        ostiInitiatorEvent( tiRoot,
5115                            agNULL,
5116                            tiDeviceHandle,
5117                            tiIntrEventTypeLocalAbort,
5118                            tiAbortInProgress,
5119                            agNULL );
5120      }
5121      else
5122      {
5123        TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5124        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5125      }
5126      TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5127      ostiFreeMemory(
5128                     tiRoot,
5129                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5130                     sizeof(tdIORequestBody_t)
5131                     );
5132    }
5133    else if (status == OSSA_IO_ABORT_IN_PROGRESS)
5134    {
5135      TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
5136      /* clean up TD layer's IORequestBody */
5137      if (oneDeviceData->OSAbortAll == agTRUE)
5138      {
5139        oneDeviceData->OSAbortAll = agFALSE;
5140        ostiInitiatorEvent( tiRoot,
5141                            agNULL,
5142                            tiDeviceHandle,
5143                            tiIntrEventTypeLocalAbort,
5144                            tiAbortInProgress,
5145                            agNULL );
5146      }
5147      else
5148      {
5149        TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5150        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5151      }
5152      TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5153      ostiFreeMemory(
5154                     tiRoot,
5155                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5156                     sizeof(tdIORequestBody_t)
5157                     );
5158    }
5159#ifdef REMOVED
5160    else if (status == OSSA_IO_ABORT_DELAYED)
5161    {
5162      TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
5163      /* clean up TD layer's IORequestBody */
5164      if (oneDeviceData->OSAbortAll == agTRUE)
5165      {
5166        oneDeviceData->OSAbortAll = agFALSE;
5167        ostiInitiatorEvent( tiRoot,
5168                            agNULL,
5169                            tiDeviceHandle,
5170                            tiIntrEventTypeLocalAbort,
5171                            tiAbortDelayed,
5172                            agNULL );
5173      }
5174      else
5175      {
5176        TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5177        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5178      }
5179      TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5180      ostiFreeMemory(
5181                     tiRoot,
5182                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5183                     sizeof(tdIORequestBody_t)
5184                     );
5185    }
5186#endif
5187    else
5188    {
5189      TI_DBG1(("ossaSSPAbortCB: other status %d\n", status));
5190      /* clean up TD layer's IORequestBody */
5191      if (oneDeviceData->OSAbortAll == agTRUE)
5192      {
5193        oneDeviceData->OSAbortAll = agFALSE;
5194        ostiInitiatorEvent( tiRoot,
5195                            agNULL,
5196                            tiDeviceHandle,
5197                            tiIntrEventTypeLocalAbort,
5198                            tiAbortInProgress,
5199                            agNULL );
5200      }
5201      else
5202      {
5203        TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5204        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5205      }
5206      TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5207      ostiFreeMemory(
5208                     tiRoot,
5209                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5210                     sizeof(tdIORequestBody_t)
5211                     );
5212    }
5213  }
5214  else if (flag == 0)
5215  {
5216    TI_DBG2(("ossaSSPAbortCB: abort one\n"));
5217    taskTag = tdAbortIORequestBody->tiIOToBeAbortedRequest;
5218
5219    if ( taskTag == agNULL)
5220    {
5221      TI_DBG1(("ossaSSPAbortCB: taskTag is NULL; triggered by itdssQueryTaskCompleted\n"));
5222    }
5223    if (status == OSSA_IO_SUCCESS)
5224    {
5225      TI_DBG2(("ossaSSPAbortCB: OSSA_IO_SUCCESS\n"));
5226      if (taskTag != agNULL)
5227      {
5228        ostiInitiatorEvent( tiRoot,
5229                            agNULL,
5230                            agNULL,
5231                            tiIntrEventTypeLocalAbort,
5232                            tiAbortOK,
5233                            taskTag );
5234      }
5235      ostiFreeMemory(
5236                     tiRoot,
5237                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5238                     sizeof(tdIORequestBody_t)
5239                     );
5240
5241    }
5242    else if (status == OSSA_IO_NOT_VALID)
5243    {
5244      TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NOT_VALID\n"));
5245
5246      if (taskTag != agNULL)
5247      {
5248        ostiInitiatorEvent( tiRoot,
5249                            agNULL,
5250                            agNULL,
5251                            tiIntrEventTypeLocalAbort,
5252                            tiAbortFailed,
5253                            taskTag );
5254      }
5255      ostiFreeMemory(
5256                     tiRoot,
5257                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5258                     sizeof(tdIORequestBody_t)
5259                     );
5260    }
5261    else if (status == OSSA_IO_NO_DEVICE)
5262    {
5263      TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NO_DEVICE\n"));
5264
5265      if (taskTag != agNULL)
5266      {
5267        ostiInitiatorEvent( tiRoot,
5268                            agNULL,
5269                            agNULL,
5270                            tiIntrEventTypeLocalAbort,
5271                            tiAbortInProgress,
5272                            taskTag );
5273      }
5274      ostiFreeMemory(
5275                     tiRoot,
5276                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5277                     sizeof(tdIORequestBody_t)
5278                     );
5279    }
5280    else if (status == OSSA_IO_ABORT_IN_PROGRESS)
5281    {
5282      TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
5283
5284      if (taskTag != agNULL)
5285      {
5286        ostiInitiatorEvent( tiRoot,
5287                            agNULL,
5288                            agNULL,
5289                            tiIntrEventTypeLocalAbort,
5290                            tiAbortInProgress,
5291                            taskTag );
5292      }
5293      ostiFreeMemory(
5294                     tiRoot,
5295                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5296                     sizeof(tdIORequestBody_t)
5297                     );
5298    }
5299#ifdef REMOVED
5300    else if (status == OSSA_IO_ABORT_DELAYED)
5301    {
5302      TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
5303
5304      if (taskTag != agNULL)
5305      {
5306        ostiInitiatorEvent( tiRoot,
5307                            agNULL,
5308                            agNULL,
5309                            tiIntrEventTypeLocalAbort,
5310                            tiAbortDelayed,
5311                            taskTag );
5312      }
5313      ostiFreeMemory(
5314                     tiRoot,
5315                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5316                     sizeof(tdIORequestBody_t)
5317                     );
5318    }
5319#endif
5320    else
5321    {
5322      TI_DBG1(("ossaSSPAbortCB: other status %d\n", status));
5323
5324      if (taskTag != agNULL)
5325      {
5326        ostiInitiatorEvent( tiRoot,
5327                            agNULL,
5328                            agNULL,
5329                            tiIntrEventTypeLocalAbort,
5330                            tiAbortFailed,
5331                            taskTag );
5332      }
5333      ostiFreeMemory(
5334                     tiRoot,
5335                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5336                     sizeof(tdIORequestBody_t)
5337                     );
5338    }
5339  }
5340  else
5341  {
5342    TI_DBG1(("ossaSSPAbortCB: wrong flag %d\n", flag));
5343  }
5344  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Ya");
5345  return;
5346
5347}
5348#endif
5349
5350
5351#ifdef TARGET_DRIVER
5352osGLOBAL void ossaSSPAbortCB(
5353               agsaRoot_t       *agRoot,
5354               agsaIORequest_t  *agIORequest,
5355               bit32            flag,
5356               bit32            status)
5357{
5358  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
5359  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
5360  tdIORequestBody_t       *tdAbortIORequestBody;
5361  tdsaDeviceData_t        *oneDeviceData;
5362  tiDeviceHandle_t        *tiDeviceHandle;
5363
5364  TI_DBG3(("ossaSSPAbortCB: start\n"));
5365  tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
5366
5367  if (flag == 2)
5368  {
5369    /* abort per port */
5370    TI_DBG2(("ossaSSPAbortCB: abort per port\n"));
5371  }
5372  else if (flag == 1)
5373  {
5374    TI_DBG2(("ossaSSPAbortCB: abort all\n"));
5375    tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle;
5376    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
5377    if (status == OSSA_IO_SUCCESS)
5378    {
5379      TI_DBG2(("ossaSSPAbortCB: OSSA_IO_SUCCESS\n"));
5380      /* clean up TD layer's IORequestBody */
5381      TI_DBG3(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5382      saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5383      TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5384      ostiFreeMemory(
5385                     tiRoot,
5386                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5387                     sizeof(tdIORequestBody_t)
5388                     );
5389
5390    }
5391    else if (status == OSSA_IO_NOT_VALID)
5392    {
5393      TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NOT_VALID\n"));
5394      /* clean up TD layer's IORequestBody */
5395      TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5396      saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5397      TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5398      ostiFreeMemory(
5399                     tiRoot,
5400                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5401                     sizeof(tdIORequestBody_t)
5402                     );
5403    }
5404    else if (status == OSSA_IO_NO_DEVICE)
5405    {
5406      TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NO_DEVICE\n"));
5407      /* clean up TD layer's IORequestBody */
5408      TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5409      saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5410      TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5411      ostiFreeMemory(
5412                     tiRoot,
5413                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5414                     sizeof(tdIORequestBody_t)
5415                     );
5416    }
5417    else if (status == OSSA_IO_ABORT_IN_PROGRESS)
5418    {
5419      TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
5420      /* clean up TD layer's IORequestBody */
5421      TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5422      saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5423      TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5424      ostiFreeMemory(
5425                     tiRoot,
5426                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5427                     sizeof(tdIORequestBody_t)
5428                     );
5429    }
5430#ifdef REMOVED
5431    else if (status == OSSA_IO_ABORT_DELAYED)
5432    {
5433      TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
5434      /* clean up TD layer's IORequestBody */
5435      TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5436      saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5437      TI_DBG2(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5438      ostiFreeMemory(
5439                     tiRoot,
5440                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5441                     sizeof(tdIORequestBody_t)
5442                     );
5443    }
5444#endif
5445    else
5446    {
5447      TI_DBG1(("ossaSSPAbortCB: other status %d\n", status));
5448      /* clean up TD layer's IORequestBody */
5449      TI_DBG2(("ossaSSPAbortCB: calling saDeregisterDeviceHandle\n"));
5450      saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
5451      TI_DBG1(("ossaSSPAbortCB: did %d\n", oneDeviceData->id));
5452      ostiFreeMemory(
5453                     tiRoot,
5454                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5455                     sizeof(tdIORequestBody_t)
5456                     );
5457    }
5458  }
5459  else if (flag == 0)
5460  {
5461    TI_DBG2(("ossaSSPAbortCB: abort one\n"));
5462    if (status == OSSA_IO_SUCCESS)
5463    {
5464      TI_DBG2(("ossaSSPAbortCB: OSSA_IO_SUCCESS\n"));
5465      ostiFreeMemory(
5466                     tiRoot,
5467                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5468                     sizeof(tdIORequestBody_t)
5469                     );
5470
5471    }
5472    else if (status == OSSA_IO_NOT_VALID)
5473    {
5474      TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NOT_VALID\n"));
5475      ostiFreeMemory(
5476                     tiRoot,
5477                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5478                     sizeof(tdIORequestBody_t)
5479                     );
5480    }
5481    else if (status == OSSA_IO_NO_DEVICE)
5482    {
5483      TI_DBG1(("ossaSSPAbortCB: OSSA_IO_NO_DEVICE\n"));
5484      ostiFreeMemory(
5485                     tiRoot,
5486                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5487                     sizeof(tdIORequestBody_t)
5488                     );
5489    }
5490    else if (status == OSSA_IO_ABORT_IN_PROGRESS)
5491    {
5492      TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
5493      ostiFreeMemory(
5494                     tiRoot,
5495                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5496                     sizeof(tdIORequestBody_t)
5497                     );
5498    }
5499#ifdef REMOVED
5500    else if (status == OSSA_IO_ABORT_DELAYED)
5501    {
5502      TI_DBG1(("ossaSSPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
5503      ostiFreeMemory(
5504                     tiRoot,
5505                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5506                     sizeof(tdIORequestBody_t)
5507                     );
5508    }
5509#endif
5510    else
5511    {
5512      TI_DBG1(("ossaSSPAbortCB: other status %d\n", status));
5513      ostiFreeMemory(
5514                     tiRoot,
5515                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
5516                     sizeof(tdIORequestBody_t)
5517                     );
5518    }
5519  }
5520  else
5521  {
5522    TI_DBG1(("ossaSSPAbortCB: wrong flag %d\n", flag));
5523  }
5524
5525  return;
5526
5527}
5528#endif
5529
5530
5531/*****************************************************************************/
5532/*! \brief ossaLocalPhyControlCB
5533 *
5534 *
5535 *  Purpose: This routine is called by lower layer to indicate the status of
5536 *           phy operations
5537 *
5538 *  \param   agRoot:       Pointer to chip/driver Instance.
5539 *  \param   phyId         Phy id
5540 *  \param   phyOperation  Operation to be done on the phy
5541 *  \param   status        Phy operation specific completion status
5542 *  \param   parm          Additional parameter, phy operation and status specific
5543 *
5544 *
5545 *  \return None.
5546 *
5547 */
5548/*****************************************************************************/
5549osGLOBAL void ossaLocalPhyControlCB(
5550                      agsaRoot_t  *agRoot,
5551                      agsaContext_t *agContext,
5552                      bit32       phyId,
5553                      bit32       phyOperation,
5554                      bit32       status,
5555                      void        *parm
5556                      )
5557{
5558#ifdef REMVOED
5559  agsaPhyErrCounters_t    *agPhyErrCounters;
5560#endif
5561#ifdef INITIATOR_DRIVER
5562  tdsaRootOsData_t         *osData = (tdsaRootOsData_t *)agRoot->osData;
5563  tiRoot_t                 *tiRoot = (tiRoot_t *)osData->tiRoot;
5564  tiIORequest_t            *currentTaskTag;
5565  tdsaDeviceData_t         *TargetDeviceData;
5566  satDeviceData_t          *pSatDevData;
5567  agsaDevHandle_t          *agDevHandle = agNULL;
5568  agsaContext_t            *agContextDevice;
5569#endif
5570
5571  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yb");
5572  TI_DBG3(("ossaLocalPhyControlCB: start phyID %d\n", phyId));
5573  TI_DBG3(("ossaLocalPhyControlCB: phyOperation %d status 0x%x\n", phyOperation, status));
5574  switch (phyOperation)
5575  {
5576  case AGSA_PHY_LINK_RESET: /* fall through */
5577  case AGSA_PHY_HARD_RESET:
5578    if (phyOperation == AGSA_PHY_LINK_RESET)
5579    {
5580      TI_DBG1(("ossaLocalPhyControlCB: AGSA_PHY_LINK_RESET, status 0x%x\n", status));
5581    }
5582    else
5583    {
5584      TI_DBG1(("ossaLocalPhyControlCB: AGSA_PHY_HARD_RESET, status 0x%x\n", status));
5585    }
5586#ifdef INITIATOR_DRIVER
5587    if (agContext != agNULL)
5588    {
5589      currentTaskTag = (tiIORequest_t *)agContext->osData;
5590      if (status == OSSA_SUCCESS)
5591      {
5592        if (currentTaskTag != agNULL)
5593        {
5594          TI_DBG2(("ossaLocalPhyControlCB: callback to OS layer with success\n"));
5595          TargetDeviceData = (tdsaDeviceData_t *)currentTaskTag->tdData;
5596          pSatDevData = (satDeviceData_t *)&(TargetDeviceData->satDevData);
5597          agDevHandle = TargetDeviceData->agDevHandle;
5598          TI_DBG2(("ossaLocalPhyControlCB: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
5599          TI_DBG2(("ossaLocalPhyControlCB: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
5600          pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
5601
5602          if (TargetDeviceData->TRflag == agTRUE)
5603          {
5604            saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, TargetDeviceData), agDevHandle, SA_DS_OPERATIONAL);
5605            TargetDeviceData->TRflag = agFALSE;
5606            ostiInitiatorEvent(tiRoot,
5607                               TargetDeviceData->tdPortContext->tiPortalContext,
5608                               &(TargetDeviceData->tiDeviceHandle),
5609                               tiIntrEventTypeTransportRecovery,
5610                               tiRecOK,
5611                               agNULL
5612                              );
5613          }
5614          else
5615          {
5616            agDevHandle = TargetDeviceData->agDevHandle;
5617            if (agDevHandle == agNULL)
5618            {
5619              TI_DBG1(("ossaLocalPhyControlCB: wrong, agDevHandle is NULL\n"));
5620            }
5621            /* move this to OSSA_HW_EVENT_PORT_RESET_COMPLETE in ossaHwCB() */
5622            agContextDevice = &(TargetDeviceData->agDeviceResetContext);
5623            agContextDevice->osData = currentTaskTag;
5624
5625#ifdef REMOVED
5626            ostiInitiatorEvent( tiRoot,
5627                                NULL,
5628                                NULL,
5629                                tiIntrEventTypeTaskManagement,
5630                                tiTMOK,
5631                                currentTaskTag );
5632#endif
5633          }
5634        }
5635      }
5636      else
5637      {
5638        if (currentTaskTag != agNULL)
5639        {
5640          TI_DBG1(("ossaLocalPhyControlCB: callback to OS layer with failure\n"));
5641          TargetDeviceData = (tdsaDeviceData_t *)currentTaskTag->tdData;
5642          pSatDevData = (satDeviceData_t *)&(TargetDeviceData->satDevData);
5643          TI_DBG1(("ossaLocalPhyControlCB: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
5644          TI_DBG1(("ossaLocalPhyControlCB: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
5645          if (TargetDeviceData->TRflag == agTRUE)
5646          {
5647            TargetDeviceData->TRflag = agFALSE;
5648            ostiInitiatorEvent(tiRoot,
5649                               TargetDeviceData->tdPortContext->tiPortalContext,
5650                               &(TargetDeviceData->tiDeviceHandle),
5651                               tiIntrEventTypeTransportRecovery,
5652                               tiRecFailed ,
5653                               agNULL
5654                              );
5655          }
5656          else
5657          {
5658            ostiInitiatorEvent( tiRoot,
5659                                NULL,
5660                                NULL,
5661                                tiIntrEventTypeTaskManagement,
5662                                tiTMFailed,
5663                                currentTaskTag );
5664          }
5665        }
5666      }
5667    }
5668#endif
5669    break;
5670#ifdef REMOVED
5671  case AGSA_PHY_GET_ERROR_COUNTS:
5672
5673    TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_GET_ERROR_COUNTS, status 0x%x\n", status));
5674    if(parm !=agNULL )
5675    {
5676      agPhyErrCounters = (agsaPhyErrCounters_t *)parm;
5677      TI_DBG2(("ossaLocalPhyControlCB: invalidDword %d\n", agPhyErrCounters->invalidDword));
5678      TI_DBG2(("ossaLocalPhyControlCB: runningDisparityError %d\n", agPhyErrCounters->runningDisparityError));
5679      TI_DBG2(("ossaLocalPhyControlCB: lostOfDwordSynch %d\n", agPhyErrCounters->lossOfDwordSynch));
5680      TI_DBG2(("ossaLocalPhyControlCB: phyResetProblem %d\n", agPhyErrCounters->phyResetProblem));
5681      TI_DBG2(("ossaLocalPhyControlCB: elasticityBufferOverflow %d\n", agPhyErrCounters->elasticityBufferOverflow));
5682      TI_DBG2(("ossaLocalPhyControlCB: receivedErrorPrimitive %d\n", agPhyErrCounters->receivedErrorPrimitive));
5683    }
5684    break;
5685  case AGSA_PHY_CLEAR_ERROR_COUNTS:
5686    TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_CLEAR_ERROR_COUNTS, status 0x%x\n", status));
5687    break;
5688#endif
5689  case AGSA_PHY_NOTIFY_ENABLE_SPINUP:
5690    TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_NOTIFY_ENABLE_SPINUP, status 0x%x\n", status));
5691    break;
5692  case AGSA_PHY_BROADCAST_ASYNCH_EVENT:
5693    TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_BROADCAST_ASYNCH_EVENT, status 0x%x\n", status));
5694    if (tIsSPC12SATA(agRoot))
5695    {
5696      TI_DBG1(("ossaLocalPhyControlCB: BROADCAST_ASYNCH_EVENT received for SATA Controller\n"));
5697      break;
5698    }
5699    break;
5700  case AGSA_PHY_COMINIT_OOB :
5701    TI_DBG2(("ossaLocalPhyControlCB: AGSA_PHY_COMINIT_OOB, status 0x%x\n", status));
5702    break;
5703  default:
5704    TI_DBG1(("ossaLocalPhyControlCB: UNKNOWN default case. phyOperation %d status 0x%x\n", phyOperation, status));
5705    break;
5706  }
5707  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yb");
5708  return;
5709}
5710
5711GLOBAL void   ossaGetPhyProfileCB(
5712                      agsaRoot_t    *agRoot,
5713                      agsaContext_t *agContext,
5714                      bit32         status,
5715                      bit32         ppc,
5716                      bit32         phyID,
5717                      void          *parm )
5718{
5719
5720  tdsaRootOsData_t  *osData        = (tdsaRootOsData_t *)agRoot->osData;
5721  tiRoot_t          *tiRoot        = (tiRoot_t *)osData->tiRoot;
5722  tdsaRoot_t        *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
5723  tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
5724#ifdef CCFLAGS_PHYCONTROL_COUNTS
5725  agsaPhyAnalogSettingsPage_t *analog;
5726#endif /* CCFLAGS_PHYCONTROL_COUNTS   */
5727  tdPhyCount_t      *PhyBlob = agNULL;
5728
5729  agsaPhyBWCountersPage_t       *agBWCounters;
5730  agsaPhyErrCountersPage_t      *agPhyErrCounters;
5731  TI_DBG1(("ossaGetPhyProfileCB: agContext %p parm %p\n", agContext, parm));
5732/*
5733  if(  tdsaAllShared->tdFWControlEx.inProgress )
5734  {
5735    tdsaAllShared->tdFWControlEx.inProgress = 0;
5736    PhyBlob = (tdPhyCount_t  *)tdsaAllShared->tdFWControlEx.usrAddr;
5737  }
5738*/
5739  switch(ppc)
5740  {
5741    case  AGSA_SAS_PHY_BW_COUNTERS_PAGE:
5742      TI_DBG1(("ossaGetPhyProfileCB: AGSA_SAS_PHY_BW_COUNTERS_PAGE, status 0x%x phyID %d\n", status, phyID));
5743      if(parm !=agNULL )
5744      {
5745        agBWCounters = (agsaPhyBWCountersPage_t *)parm;
5746        TI_DBG1(("ossaGetPhyProfileCB: RX %d TX %d\n", agBWCounters->RXBWCounter,agBWCounters->TXBWCounter));
5747        if(PhyBlob !=agNULL )
5748        {
5749          PhyBlob->InvalidDword = 0;
5750          PhyBlob->runningDisparityError = 0;
5751          PhyBlob->codeViolation = 0;
5752          PhyBlob->phyResetProblem = 0;
5753          PhyBlob->inboundCRCError = 0;
5754          PhyBlob->BW_rx = agBWCounters->RXBWCounter;
5755          PhyBlob->BW_tx = agBWCounters->TXBWCounter;
5756        }
5757
5758      }
5759      break;
5760    case AGSA_SAS_PHY_ERR_COUNTERS_PAGE:
5761      if(  tdsaAllShared->tdFWControlEx.inProgress )
5762      {
5763  	  tdsaAllShared->tdFWControlEx.inProgress = 0;
5764  	  PhyBlob = (tdPhyCount_t  *)tdsaAllShared->tdFWControlEx.usrAddr;
5765      }
5766      TI_DBG1(("ossaGetPhyProfileCB: AGSA_SAS_PHY_ERR_COUNTERS_PAGE, status 0x%x phyID %d\n", status, phyID));
5767      if(parm !=agNULL )
5768      {
5769        agPhyErrCounters = (agsaPhyErrCountersPage_t *)parm;
5770        if(PhyBlob !=agNULL )
5771        {
5772
5773          PhyBlob->InvalidDword          = agPhyErrCounters->invalidDword;
5774          PhyBlob->runningDisparityError = agPhyErrCounters->runningDisparityError;
5775          PhyBlob->LossOfSyncDW          = agPhyErrCounters->lossOfDwordSynch;
5776          PhyBlob->codeViolation         = agPhyErrCounters->codeViolation;
5777          PhyBlob->phyResetProblem       = agPhyErrCounters->phyResetProblem;
5778          PhyBlob->inboundCRCError       = agPhyErrCounters->inboundCRCError;
5779          PhyBlob->BW_rx = 0;
5780          PhyBlob->BW_tx = 0;
5781
5782          TI_DBG2(("ossaGetPhyProfileCB: invalidDword          %d\n", agPhyErrCounters->invalidDword));
5783          TI_DBG2(("ossaGetPhyProfileCB: runningDisparityError %d\n", agPhyErrCounters->runningDisparityError));
5784          TI_DBG2(("ossaGetPhyProfileCB: lostOfDwordSynch      %d\n", agPhyErrCounters->lossOfDwordSynch));
5785          TI_DBG2(("ossaGetPhyProfileCB: phyResetProblem       %d\n", agPhyErrCounters->phyResetProblem));
5786          TI_DBG2(("ossaGetPhyProfileCB: inboundCRCError       %d\n", agPhyErrCounters->inboundCRCError));
5787        }
5788      }
5789      break;
5790    case AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE:
5791      TI_DBG1(("ossaGetPhyProfileCB: AGSA_SAS_PHY_ERR_COUNTERS_CLR_PAGE status 0x%x phyID %d\n", status, phyID));
5792      break;
5793    case AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE:
5794      TI_DBG1(("ossaGetPhyProfileCB:AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE status 0x%x phyID %d\n", status, phyID));
5795#ifdef CCFLAGS_PHYCONTROL_COUNTS
5796      if(parm !=agNULL )
5797      {
5798        analog = (agsaPhyAnalogSettingsPage_t *)parm;
5799        TI_DBG1(("ossaGetPhyProfileCB: 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
5800          analog->Dword0, analog->Dword1, analog->Dword2, analog->Dword3, analog->Dword4,
5801          analog->Dword5, analog->Dword6, analog->Dword7, analog->Dword8, analog->Dword9));
5802        tdsaAllShared->analog[phyID].spaRegister0 = analog->Dword0;
5803        tdsaAllShared->analog[phyID].spaRegister1 = analog->Dword1;
5804        tdsaAllShared->analog[phyID].spaRegister2 = analog->Dword2;
5805        tdsaAllShared->analog[phyID].spaRegister3 = analog->Dword3;
5806        tdsaAllShared->analog[phyID].spaRegister4 = analog->Dword4;
5807        saSetPhyProfile( agRoot,agContext,tdsaRotateQnumber(tiRoot, agNULL), AGSA_SAS_PHY_ANALOG_SETTINGS_PAGE,sizeof(agsaPhyAnalogSetupRegisters_t),&tdsaAllShared->analog[phyID],phyID);
5808      }
5809#endif /* CCFLAGS_PHYCONTROL_COUNTS   */
5810     break;
5811    case AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE:
5812    {
5813      TI_DBG1(("ossaGetPhyProfileCB:AGSA_SAS_PHY_OPEN_REJECT_RETRY_BACKOFF_THRESHOLD_PAGE status 0x%x phyID %d\n", status, phyID));
5814      if( parm !=agNULL )
5815      {
5816#ifdef TD_DEBUG_ENABLE
5817        agsaSASPhyOpenRejectRetryBackOffThresholdPage_t *Backoff =
5818          (agsaSASPhyOpenRejectRetryBackOffThresholdPage_t *)parm;
5819#endif
5820        TI_DBG2(("ossaGetPhyProfileCB: DW0 0x%X DW1 0x%X DW2 0x%X DW3 0x%X\n",
5821                 Backoff->Dword0,Backoff->Dword1,
5822                 Backoff->Dword2,Backoff->Dword3));
5823       }
5824      break;
5825    }
5826
5827    case AGSA_SAS_PHY_GENERAL_STATUS_PAGE:
5828    {
5829      agsaSASPhyGeneralStatusPage_t * GenStatus = NULL;
5830
5831      TI_DBG1(("ossaGetPhyProfileCB: AGSA_SAS_PHY_GENERAL_STATUS_PAGE status 0x%x phyID %d\n",
5832               status, phyID));
5833      if( parm !=agNULL )
5834      {
5835          GenStatus=
5836          (agsaSASPhyGeneralStatusPage_t *)parm;
5837        TI_DBG2(("ossaGetPhyProfileCB: "
5838                 "AGSA_SAS_PHY_GENERAL_STATUS_PAGE status %d DW0 0x%x DW1 0x%x\n",
5839                 status, GenStatus->Dword0, GenStatus->Dword1));
5840      }
5841      ostiGetPhyGeneralStatusRsp(tiRoot, GenStatus, phyID);
5842//      break;
5843      return ;
5844    }
5845
5846    default:
5847      TI_DBG1(("ossaGetPhyProfileCB: UNKNOWN default case. phyOperation %d status 0x%x\n", ppc, status));
5848      break;
5849
5850  }
5851
5852  ostiGetPhyProfileIOCTLRsp(tiRoot, status);
5853
5854}
5855
5856
5857GLOBAL void ossaSetPhyProfileCB(
5858                     agsaRoot_t    *agRoot,
5859                     agsaContext_t *agContext,
5860                     bit32         status,
5861                     bit32         ppc,
5862                     bit32         phyID,
5863                     void          *parm )
5864{
5865  TI_DBG1(("ossaSetPhyProfileCB:agContext %p status 0x%x ppc %d phyID %d parm %p\n",agContext, status, ppc, phyID,parm));
5866}
5867
5868
5869/*****************************************************************************/
5870/*! \brief ossaGetDeviceHandlesCB
5871 *
5872 *
5873 *  Purpose: This routine is called by lower layer to corresponding to
5874 *           saGetDeviceHandles()
5875 *
5876 *  \param   agRoot:       Pointer to chip/driver Instance.
5877 *  \param   agContext:    Context of the get device handle request originally passed into
5878 *                         saGetDeviceHandles().
5879 *  \param   agPortContext:Pointer to this instance of a port context
5880 *  \param   agDev:        Array containing pointers to the device handles
5881
5882 *  \param   validDevs     Number of valid device handles
5883 *
5884 *
5885 *  \return None.
5886 *
5887 *  \note - The scope is shared target and initiator.
5888 *          For details, refer to SAS/SATA Low-Level API Specification
5889 */
5890/*****************************************************************************/
5891osGLOBAL void ossaGetDeviceHandlesCB(
5892                       agsaRoot_t           *agRoot,
5893                       agsaContext_t        *agContext,
5894                       agsaPortContext_t    *agPortContext,
5895                       agsaDevHandle_t      *agDev[],
5896                       bit32                validDevs
5897                       )
5898{
5899  TI_DBG2(("ossaGetDeviceHandlesCB: start\n"));
5900  TI_DBG2(("ossaGetDeviceHandlesCB: validDevs %d\n", validDevs));
5901  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yc");
5902#ifdef TO_DO
5903  for (i = 0 ; i < validDevs ; i++)
5904  {
5905    agDev[i];
5906  }
5907#endif
5908  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yc");
5909  return;
5910}
5911
5912/*****************************************************************************/
5913/*! \brief ossaGetDeviceInfoCB
5914 *
5915 *
5916 *  Purpose: This routine is called by lower layer to corresponding to
5917 *           saGetDeviceInfo()
5918 *
5919 *  \param   agRoot:       Pointer to chip/driver Instance.
5920 *  \param   agDevHandle:  Handle of the device
5921 *  \param   status:       status
5922 *  \param   agInfo:       Pointer to the structure that describes device information
5923 *
5924 *
5925 *  \return None.
5926 *
5927 *  \note - The scope is shared target and initiator.
5928 *          For details, refer to SAS/SATA Low-Level API Specification
5929 */
5930/*****************************************************************************/
5931osGLOBAL void ossaGetDeviceInfoCB(
5932                    agsaRoot_t        *agRoot,
5933                    agsaContext_t     *agContext,
5934                    agsaDevHandle_t   *agDevHandle,
5935                    bit32             status,
5936                    void              *agInfo
5937                    )
5938{
5939
5940#ifdef TD_DEBUG_ENABLE
5941  agsaDeviceInfo_t       *agDeviceInfo;
5942  agsaSASDeviceInfo_t    *agSASDeviceInfo;
5943  agsaSATADeviceInfo_t   *agSATADeviceInfo;
5944#endif
5945  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yd");
5946
5947  TI_DBG1(("ossaGetDeviceInfoCB: start agContext %p\n",agContext));
5948  switch (status)
5949  {
5950  case OSSA_DEV_INFO_INVALID_HANDLE:
5951    TI_DBG1(("ossaGetDeviceInfoCB: OSSA_DEV_INFO_INVALID_HANDLE\n"));
5952    /*ostiGetDeviceInfoIOCTLRsp(tiRoot, status, agNULL);*/
5953    break;
5954  case OSSA_DEV_INFO_NO_EXTENDED_INFO:
5955#ifdef TD_DEBUG_ENABLE
5956    agDeviceInfo = (agsaDeviceInfo_t *)agInfo;
5957#endif
5958    TI_DBG1(("ossaGetDeviceInfoCB: OSSA_DEV_INFO_NO_EXTENDED_INFO\n"));
5959    TI_DBG1(("ossaGetDeviceInfoCB: sasAddressHi 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSHI(agDeviceInfo)));
5960    TI_DBG1(("ossaGetDeviceInfoCB: sasAddressLo 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSLO(agDeviceInfo)));
5961    TI_DBG1(("ossaGetDeviceInfoCB: devType_S_Rate 0x%08x\n", agDeviceInfo->devType_S_Rate));
5962    TI_DBG1(("ossaGetDeviceInfoCB: firstBurstSize 0x%08x\n", agDeviceInfo->firstBurstSize));
5963
5964    /*ostiPortEvent (tiRoot, tiGetDevInfo, tiSuccess,(void *)agContext );*/
5965    /*ostiGetDeviceInfoIOCTLRsp(tiRoot, status, agDeviceInfo);*/
5966    break;
5967  case OSSA_DEV_INFO_SAS_EXTENDED_INFO:
5968#ifdef TD_DEBUG_ENABLE
5969    agSASDeviceInfo = (agsaSASDeviceInfo_t *)agInfo;
5970#endif
5971    TI_DBG2(("ossaGetDeviceInfoCB: OSSA_DEV_INFO_SAS_EXTENDED_INFO\n"));
5972    TI_DBG2(("ossaGetDeviceInfoCB: sasAddressHi 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSHI(&agSASDeviceInfo->commonDevInfo)));
5973    TI_DBG2(("ossaGetDeviceInfoCB: sasAddressLo 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSLO(&agSASDeviceInfo->commonDevInfo)));
5974    TI_DBG2(("ossaGetDeviceInfoCB: initiator_ssp_stp_smp %d\n", agSASDeviceInfo->initiator_ssp_stp_smp));
5975    TI_DBG2(("ossaGetDeviceInfoCB: target_ssp_stp_smp %d\n", agSASDeviceInfo->target_ssp_stp_smp));
5976    TI_DBG2(("ossaGetDeviceInfoCB: numOfPhys %d\n", agSASDeviceInfo->numOfPhys));
5977    TI_DBG2(("ossaGetDeviceInfoCB: phyIdentifier %d\n", agSASDeviceInfo->phyIdentifier));
5978
5979    break;
5980  case OSSA_DEV_INFO_SATA_EXTENDED_INFO:
5981#ifdef TD_DEBUG_ENABLE
5982    agSATADeviceInfo = (agsaSATADeviceInfo_t *)agInfo;
5983#endif
5984    TI_DBG2(("ossaGetDeviceInfoCB: OSSA_DEV_INFO_SATA_EXTENDED_INFO\n"));
5985    TI_DBG2(("ossaGetDeviceInfoCB: sasAddressHi 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSHI(&agSATADeviceInfo->commonDevInfo)));
5986    TI_DBG2(("ossaGetDeviceInfoCB: sasAddressLo 0x%08x\n", SA_DEVINFO_GET_SAS_ADDRESSLO(&agSATADeviceInfo->commonDevInfo)));
5987    TI_DBG2(("ossaGetDeviceInfoCB: connection %d\n", agSATADeviceInfo->connection));
5988    TI_DBG2(("ossaGetDeviceInfoCB: portMultiplierField %d\n", agSATADeviceInfo->portMultiplierField));
5989    TI_DBG2(("ossaGetDeviceInfoCB: stpPhyIdentifier %d\n", agSATADeviceInfo->stpPhyIdentifier));
5990#ifdef TD_DEBUG_ENABLE
5991    tdhexdump("ossaGetDeviceInfoCB: signature", (bit8 *)agSATADeviceInfo->signature, 8);
5992#endif
5993     break;
5994  default:
5995    TI_DBG2(("ossaGetDeviceInfoCB: error default case, status is %d\n", status));
5996    break;
5997  }
5998  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yd");
5999  return;
6000}
6001
6002/*****************************************************************************/
6003/*! \brief ossaDeviceRegistrationCB
6004 *
6005 *
6006 *  Purpose: This routine is called by lower layer to corresponding to
6007 *           saRegisterNewDevice()
6008 *
6009 *  \param   agRoot:       Pointer to chip/driver Instance.
6010 *  \param   agContext:    Context of the get device handle request originally
6011 *                         passed into saRegisterNewDevice().
6012 *  \param   status:       status
6013 *  \param   agDevHandle:  Pointer to the assigned device handle for the
6014 *                         registered device.
6015 *
6016 *
6017 *  \return None.
6018 *
6019 */
6020/*****************************************************************************/
6021osGLOBAL void ossaDeviceRegistrationCB(
6022                         agsaRoot_t        *agRoot,
6023                         agsaContext_t     *agContext,
6024                         bit32             status,
6025                         agsaDevHandle_t   *agDevHandle,
6026                         bit32             deviceID
6027                         )
6028{
6029#ifdef INITIATOR_DRIVER
6030  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
6031  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
6032  tdsaRoot_t           *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
6033  tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
6034  bit32                Indenom = tdsaAllShared->QueueConfig.numInboundQueues;
6035  bit32                Outdenom = tdsaAllShared->QueueConfig.numOutboundQueues;
6036  tdsaDeviceData_t     *oneDeviceData = (tdsaDeviceData_t *)agContext->osData;
6037  tdsaPortContext_t    *onePortContext = oneDeviceData->tdPortContext;
6038  tiPortalContext_t    *tiPortalContext = onePortContext->tiPortalContext;
6039#ifdef FDS_DM
6040  dmRoot_t             *dmRoot = &(tdsaAllShared->dmRoot);
6041  dmPortContext_t      *dmPortContext = &(onePortContext->dmPortContext);
6042  dmDeviceInfo_t       dmDeviceInfo;
6043  bit32                DMstatus = DM_RC_FAILURE;
6044  bit16                ext = 0;
6045  bit32                expanderType = 1;
6046#endif
6047
6048#if defined(FDS_DM) && !defined(FDS_SM)
6049  bit32                IDstatus;
6050#endif
6051
6052#ifdef FDS_SM
6053  smRoot_t             *smRoot = &(tdsaAllShared->smRoot);
6054  bit32                SMstatus = SM_RC_FAILURE;
6055#endif
6056  smTraceFuncEnter(hpDBG_VERY_LOUD,"Ye");
6057  TI_DBG3(("ossaDeviceRegistrationCB: start status 0x%x\n",status));
6058  TI_DBG3(("ossaDeviceRegistrationCB: device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
6059  TI_DBG3(("ossaDeviceRegistrationCB: device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
6060  TI_DBG3(("ossaDeviceRegistrationCB: did 0x%x\n", oneDeviceData->id));
6061  TI_DBG3(("ossaDeviceRegistrationCB: deviceID 0x%x\n", deviceID));
6062  TI_DBG3(("ossaDeviceRegistrationCB: agDevHandle %p %p %p\n",agDevHandle,agDevHandle->osData,agDevHandle->sdkData ));
6063
6064  /* transient period caused by tdssReportRemovals(), device was in the middle
6065    of registration but port is invalidated
6066  */
6067  if (oneDeviceData->valid == agFALSE && oneDeviceData->valid2 == agFALSE
6068      && oneDeviceData->DeviceType == TD_DEFAULT_DEVICE)
6069  {
6070    if (status == OSSA_SUCCESS)
6071    {
6072      TI_DBG2(("ossaDeviceRegistrationCB: transient, calling saDeregisterDeviceHandle, did %d\n", oneDeviceData->id));
6073      oneDeviceData->agDevHandle = agDevHandle;
6074      agDevHandle->osData = oneDeviceData;
6075      if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6076      {
6077        if (oneDeviceData->satDevData.IDDeviceValid == agFALSE)
6078        {
6079          saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, 0);
6080        }
6081        else
6082        {
6083          saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
6084        }
6085      }
6086      else
6087      {
6088        saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
6089      }
6090    }
6091    else if (status == OSSA_FAILURE_PORT_NOT_VALID_STATE || status == OSSA_ERR_PORT_STATE_NOT_VALID)
6092    {
6093      /* do nothing */
6094      TI_DBG2(("ossaDeviceRegistrationCB: transient, do nothing did %d\n", oneDeviceData->id));
6095    }
6096    return;
6097  }
6098
6099  if (agDevHandle == agNULL)
6100  {
6101    TI_DBG3(("ossaDeviceRegistrationCB: agDevHandle is NULL\n"));
6102  }
6103  else
6104  {
6105    TI_DBG3(("ossaDeviceRegistrationCB: agDevHandle is NOT NULL\n"));
6106  }
6107
6108  switch (status)
6109  {
6110  case OSSA_SUCCESS:
6111    TI_DBG3(("ossaDeviceRegistrationCB: success\n"));
6112    TI_DBG2(("ossaDeviceRegistrationCB: Success did %d FW did 0x%x\n", oneDeviceData->id, deviceID));
6113    TI_DBG2(("ossaDeviceRegistrationCB: Success pid %d\n", onePortContext->id));
6114    if (agDevHandle == agNULL)
6115    {
6116      TI_DBG1(("ossaDeviceRegistrationCB: agDevHandle is NULL, wrong!\n"));
6117      return;
6118    }
6119    oneDeviceData->agDevHandle = agDevHandle;
6120    agDevHandle->osData = oneDeviceData;
6121    oneDeviceData->registered = agTRUE;
6122    oneDeviceData->InQID = oneDeviceData->id % Indenom;
6123    oneDeviceData->OutQID = oneDeviceData->id % Outdenom;
6124    onePortContext->RegisteredDevNums++;
6125
6126    TI_DBG3(("ossaDeviceRegistrationCB: direct %d STP target %d target_ssp_stp_smp %d\n", oneDeviceData->directlyAttached, DEVICE_IS_STP_TARGET(oneDeviceData), oneDeviceData->target_ssp_stp_smp));
6127    TI_DBG3(("ossaDeviceRegistrationCB: pid %d registeredNumDevice %d\n", onePortContext->id, onePortContext->RegisteredDevNums));
6128    TI_DBG3(("ossaDeviceRegistrationCB: pid %d Count %d\n", onePortContext->id, onePortContext->Count));
6129
6130#ifdef FDS_DM
6131    /* if device is an expander, register it to DM */
6132    if (onePortContext->valid == agTRUE)
6133    {
6134      if (DEVICE_IS_SMP_TARGET(oneDeviceData))
6135      {
6136        TI_DBG1(("ossaDeviceRegistrationCB: calling dmRegisterDevice\n"));
6137        TI_DBG1(("ossaDeviceRegistrationCB: device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
6138        TI_DBG1(("ossaDeviceRegistrationCB: device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
6139        /* set up dmDeviceInfo */
6140        osti_memset(&dmDeviceInfo, 0, sizeof(dmDeviceInfo_t));
6141        DEVINFO_PUT_SAS_ADDRESSLO(&dmDeviceInfo, oneDeviceData->SASAddressID.sasAddressLo);
6142        DEVINFO_PUT_SAS_ADDRESSHI(&dmDeviceInfo, oneDeviceData->SASAddressID.sasAddressHi);
6143        dmDeviceInfo.initiator_ssp_stp_smp = oneDeviceData->initiator_ssp_stp_smp;
6144        dmDeviceInfo.target_ssp_stp_smp = oneDeviceData->target_ssp_stp_smp;
6145        dmDeviceInfo.devType_S_Rate = oneDeviceData->agDeviceInfo.devType_S_Rate;
6146        if (oneDeviceData->directlyAttached == agTRUE)
6147        {
6148          /* setting SMP bit */
6149          ext = (bit16)(ext | 0x100);
6150          expanderType = SA_IDFRM_GET_DEVICETTYPE(&onePortContext->sasIDframe);
6151          ext = (bit16)( ext | (expanderType << 9));
6152          /* setting MCN field to 0xF */
6153          ext = (bit16)(ext | (bit16)(0xF << 11));
6154          TI_DBG1(("ossaDeviceRegistrationCB: directlyAttached ext 0x%x\n", ext));
6155          dmDeviceInfo.ext = ext;
6156        }
6157        DMstatus = dmRegisterDevice(dmRoot, dmPortContext, &dmDeviceInfo, oneDeviceData->agDevHandle);
6158        if (DMstatus != DM_RC_SUCCESS)
6159        {
6160          TI_DBG1(("ossaDeviceRegistrationCB: dmRegisterDevice failed!!! 0x%x\n", DMstatus));
6161        }
6162      }
6163    }
6164#endif /* FDS_DM */
6165#ifdef FDS_SM
6166    /* if device is SATA, register it to SM */
6167    if (onePortContext->valid == agTRUE)
6168    {
6169      if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6170      {
6171        TI_DBG1(("ossaDeviceRegistrationCB: calling smRegisterDevice\n"));
6172        if (oneDeviceData->directlyAttached == agTRUE)
6173        {
6174          SMstatus = smRegisterDevice(smRoot,
6175                                      agDevHandle,
6176                                      &(oneDeviceData->smDeviceHandle),
6177                                      agNULL,
6178                                      (bit32)oneDeviceData->phyID,
6179                                      oneDeviceData->satDevData.satDeviceType);
6180        }
6181        else
6182        {
6183          if (oneDeviceData->ExpDevice == agNULL)
6184          {
6185            TI_DBG1(("ossaDeviceRegistrationCB: oneDeviceData->ExpDevice NULL!!!\n"));
6186            return;
6187          }
6188          if (oneDeviceData->ExpDevice->agDevHandle == agNULL)
6189          {
6190            TI_DBG1(("ossaDeviceRegistrationCB: oneDeviceData->ExpDevice->agDevHandle NULL!!!\n"));
6191          }
6192          SMstatus = smRegisterDevice(smRoot,
6193                                      agDevHandle,
6194                                      &(oneDeviceData->smDeviceHandle),
6195                                      oneDeviceData->ExpDevice->agDevHandle,
6196                                      (bit32)oneDeviceData->phyID,
6197                                      oneDeviceData->satDevData.satDeviceType);
6198        }
6199        if (SMstatus != SM_RC_SUCCESS)
6200        {
6201          TI_DBG1(("ossaDeviceRegistrationCB: smRegisterDevice failed!!! 0x%x\n", DMstatus));
6202        }
6203      }
6204    }
6205#endif /* FDS_SM */
6206    /* special case for directly attached targets */
6207    if (oneDeviceData->directlyAttached == agTRUE)
6208    {
6209      TI_DBG3(("ossaDeviceRegistrationCB: directly attached did %d\n", oneDeviceData->id));
6210      if (oneDeviceData->DeviceType == TD_SAS_DEVICE)
6211      {
6212        TI_DBG3(("ossaDeviceRegistrationCB: SAS target\n"));
6213        if (onePortContext->valid == agTRUE)
6214        {
6215          if (onePortContext->PortRecoverPhyID != 0xFF)
6216          {
6217            oneDeviceData->phyID = (bit8)onePortContext->PortRecoverPhyID;
6218            onePortContext->PortRecoverPhyID = 0xFF;
6219            TI_DBG3(("ossaDeviceRegistrationCB: PortRecoverPhyID %d\n", oneDeviceData->phyID));
6220          }
6221          /* link up and discovery ready event */
6222          if (onePortContext->DiscoveryRdyGiven == agFALSE)
6223          {
6224            TI_DBG2(("ossaDeviceRegistrationCB: link up and discovery ready\n"));
6225            TI_DBG3(("ossaDeviceRegistrationCB: phyID %d pid %d\n", oneDeviceData->phyID, onePortContext->id));
6226            TI_DBG3(("ossaDeviceRegistrationCB: tiPortalContext %p\n", tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext));
6227            TI_DBG3(("ossaDeviceRegistrationCB: onePortContext->tiPortalContext %p\n", onePortContext->tiPortalContext));
6228            onePortContext->DiscoveryRdyGiven = agTRUE;
6229            if (onePortContext->DiscoveryState != ITD_DSTATE_NOT_STARTED)
6230            {
6231              TI_DBG1(("ossaDeviceRegistrationCB: wrong discovery state 0x%x\n", onePortContext->DiscoveryState));
6232            }
6233            /* notifying link up */
6234            ostiPortEvent (
6235                           tiRoot,
6236                           tiPortLinkUp,
6237                           tiSuccess,
6238                           (void *)onePortContext->tiPortalContext
6239                           );
6240#ifdef INITIATOR_DRIVER
6241            /* triggers discovery */
6242            ostiPortEvent(
6243                          tiRoot,
6244                          tiPortDiscoveryReady,
6245                          tiSuccess,
6246                          (void *)onePortContext->tiPortalContext
6247                          );
6248#endif
6249          }
6250        }
6251        else
6252        {
6253          TI_DBG2(("ossaDeviceRegistrationCB: abort call\n"));
6254          /* abort all followed by deregistration of sas target */
6255          tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
6256        }
6257      }
6258      else
6259      {
6260        TI_DBG2(("ossaDeviceRegistrationCB: SATA target\n"));
6261        if (onePortContext->valid == agTRUE)
6262        {
6263          if (oneDeviceData->satDevData.IDDeviceValid == agFALSE)
6264          {
6265#ifdef FDS_SM
6266            /* send identify device data */
6267            tdIDStart(tiRoot, agRoot, smRoot, oneDeviceData, onePortContext);
6268
6269#else
6270            /* send identify device data */
6271            tdssSubAddSATAToSharedcontext(tiRoot, oneDeviceData);
6272#endif
6273          }
6274        }
6275        else
6276        {
6277          TI_DBG2(("ossaDeviceRegistrationCB: abort call\n"));
6278          /* abort all followed by deregistration of sas target */
6279          tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
6280        }
6281      }
6282    }
6283    else /* behind the expander */
6284    {
6285#if defined(FDS_DM) && defined(FDS_SM)
6286      /* send ID to SATA targets
6287         needs go allocate tdIORequestBody_t for smIORequest
6288      */
6289
6290      if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6291          &&
6292          oneDeviceData->satDevData.IDDeviceValid == agFALSE)
6293      {
6294        tdIDStart(tiRoot, agRoot, smRoot, oneDeviceData, onePortContext);
6295      }
6296
6297#elif defined(FDS_DM) /* worked with DM */
6298      if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6299          &&
6300          oneDeviceData->satDevData.IDDeviceValid == agFALSE)
6301      {
6302         IDstatus = tdsaDiscoveryStartIDDev(tiRoot,
6303                                         agNULL,
6304                                         &(oneDeviceData->tiDeviceHandle),
6305                                         agNULL,
6306                                         oneDeviceData);
6307
6308        if (IDstatus != tiSuccess)
6309        {
6310          /* identify device data is not valid */
6311          TI_DBG1(("ossaDeviceRegistrationCB: fail or busy %d\n", IDstatus));
6312          oneDeviceData->satDevData.IDDeviceValid = agFALSE;
6313        }
6314      }
6315#endif
6316
6317
6318   }
6319    /* after discovery is finished */
6320    if (onePortContext->DiscoveryState == ITD_DSTATE_COMPLETED)
6321    {
6322      TI_DBG2(("ossaDeviceRegistrationCB: calling new device arrival\n"));
6323      if (DEVICE_IS_SSP_TARGET(oneDeviceData))
6324      {
6325        /* in case registration is finished after discovery is finished */
6326#ifdef AGTIAPI_CTL
6327        if (tdsaAllShared->SASConnectTimeLimit)
6328          tdsaCTLSet(tiRoot, onePortContext, tiIntrEventTypeDeviceChange,
6329                     tiDeviceArrival);
6330        else
6331#endif
6332          ostiInitiatorEvent(
6333                             tiRoot,
6334                             tiPortalContext,
6335                             agNULL,
6336                             tiIntrEventTypeDeviceChange,
6337                             tiDeviceArrival,
6338                             agNULL
6339                             );
6340      }
6341      else if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6342                &&
6343                oneDeviceData->satDevData.IDDeviceValid == agTRUE )
6344      {
6345        /* in case registration is finished after discovery is finished */
6346        ostiInitiatorEvent(
6347                           tiRoot,
6348                           tiPortalContext,
6349                           agNULL,
6350                           tiIntrEventTypeDeviceChange,
6351                           tiDeviceArrival,
6352                           agNULL
6353                           );
6354      }
6355    }
6356    break;
6357  case OSSA_FAILURE_OUT_OF_RESOURCE: /* fall through */
6358  case OSSA_ERR_DEVICE_HANDLE_UNAVAILABLE:
6359    TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_OUT_OF_RESOURCE or OSSA_ERR_DEVICE_HANDLE_UNAVAILABLE\n"));
6360    oneDeviceData->registered = agFALSE;
6361    break;
6362  case OSSA_FAILURE_DEVICE_ALREADY_REGISTERED: /* fall through */
6363  case OSSA_ERR_DEVICE_ALREADY_REGISTERED:
6364    /* do nothing */
6365    TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_DEVICE_ALREADY_REGISTERED or OSSA_ERR_DEVICE_ALREADY_REGISTERED\n"));
6366    break;
6367  case OSSA_FAILURE_INVALID_PHY_ID: /* fall through */
6368  case OSSA_ERR_PHY_ID_INVALID:
6369    TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_INVALID_PHY_ID or OSSA_ERR_PHY_ID_INVALID\n"));
6370    oneDeviceData->registered = agFALSE;
6371    break;
6372  case OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED: /* fall through */
6373  case OSSA_ERR_PHY_ID_ALREADY_REGISTERED:
6374    /* do nothing */
6375    TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_PHY_ID_ALREADY_REGISTERED or OSSA_ERR_PHY_ID_ALREADY_REGISTERED\n"));
6376    break;
6377  case OSSA_FAILURE_PORT_ID_OUT_OF_RANGE: /* fall through */
6378  case OSSA_ERR_PORT_INVALID:
6379    TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_PORT_ID_OUT_OF_RANGE or OSSA_ERR_PORT_INVALID\n"));
6380    oneDeviceData->registered = agFALSE;
6381    break;
6382  case OSSA_FAILURE_PORT_NOT_VALID_STATE: /* fall through */
6383  case OSSA_ERR_PORT_STATE_NOT_VALID:
6384    TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_PORT_NOT_VALID_STATE or OSSA_ERR_PORT_STATE_NOT_VALID\n"));
6385    TI_DBG2(("ossaDeviceRegistrationCB: did %d pid %d\n", oneDeviceData->id, onePortContext->id));
6386    oneDeviceData->registered = agFALSE;
6387    /* transient period between link up and link down/port recovery */
6388    onePortContext->Transient = agTRUE;
6389    if (onePortContext->valid == agTRUE && (oneDeviceData->valid == agTRUE || oneDeviceData->valid2 == agTRUE))
6390    {
6391      TI_DBG1(("ossaDeviceRegistrationCB: retries regisration\n"));
6392#ifdef REMOVED
6393      //temp; setting MCN to tdsaAllShared->MCN
6394      oneDeviceData->agDeviceInfo.flag = oneDeviceData->agDeviceInfo.flag | (tdsaAllShared->MCN << 16);
6395      //end temp
6396#endif
6397      saRegisterNewDevice( /* ossaDeviceRegistrationCB */
6398                          agRoot,
6399                          &oneDeviceData->agContext,
6400                          0,
6401                          &oneDeviceData->agDeviceInfo,
6402                          onePortContext->agPortContext,
6403                          0
6404                         );
6405    }
6406    else if (oneDeviceData->directlyAttached == agTRUE && DEVICE_IS_SATA_DEVICE(oneDeviceData))
6407    {
6408      TI_DBG1(("ossaDeviceRegistrationCB: directly attached SATA, put back into free list\n"));
6409      tdsaDeviceDataReInit(tiRoot, oneDeviceData);
6410      tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
6411      TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
6412      tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
6413    }
6414    break;
6415  case OSSA_FAILURE_DEVICE_TYPE_NOT_VALID: /* fall through */
6416  case OSSA_ERR_DEVICE_TYPE_NOT_VALID:
6417    TI_DBG1(("ossaDeviceRegistrationCB: OSSA_FAILURE_DEVICE_TYPE_NOT_VALID or OSSA_ERR_DEVICE_TYPE_NOT_VALID\n"));
6418    oneDeviceData->registered = agFALSE;
6419    break;
6420  default:
6421    TI_DBG1(("ossaDeviceRegistrationCB: wrong. default status is %d\n", status));
6422    break;
6423
6424
6425    }
6426  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Ye");
6427  return;
6428#endif
6429}
6430
6431/*****************************************************************************/
6432/*! \brief ossaDeregisterDeviceHandleCB
6433 *
6434 *
6435 *  Purpose: This routine is called by lower layer to corresponding to
6436 *           saDeregisterDeviceHandle()
6437 *
6438 *  \param   agRoot:       Pointer to chip/driver Instance.
6439 *  \param   agDevHandle:  Pointer to the assigned device handle for the
6440 *                         registered device.
6441 *  \param   status:       status
6442 *
6443 *
6444 *  \return None.
6445 *
6446 */
6447/*****************************************************************************/
6448osGLOBAL void ossaDeregisterDeviceHandleCB(
6449                             agsaRoot_t          *agRoot,
6450                             agsaContext_t       *agContext,
6451                             agsaDevHandle_t     *agDevHandle,
6452                             bit32               status
6453                             )
6454{
6455  tdsaRootOsData_t     *osData = (tdsaRootOsData_t *)agRoot->osData;
6456  tiRoot_t             *tiRoot = (tiRoot_t *)osData->tiRoot;
6457  tdsaRoot_t           *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
6458  tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
6459  tdsaDeviceData_t     *oneDeviceData = agNULL;
6460  tdsaPortContext_t    *onePortContext = agNULL;
6461  agsaEventSource_t    *eventSource;
6462  bit32                HwAckSatus;
6463  bit32                PhyID;
6464#ifdef FDS_DM
6465  dmRoot_t             *dmRoot = &(tdsaAllShared->dmRoot);
6466  dmPortContext_t      *dmPortContext = agNULL;
6467  dmPortInfo_t         dmPortInfo;
6468  bit32                DMstatus = DM_RC_FAILURE;
6469#endif
6470#ifdef FDS_SM
6471  smRoot_t             *smRoot = &(tdsaAllShared->smRoot);
6472#endif
6473
6474  TI_DBG3(("ossaDeregisterDeviceHandleCB: start\n"));
6475  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yf");
6476
6477  if (status == OSSA_ERR_DEVICE_HANDLE_INVALID)
6478  {
6479    /* there is no device handle to process */
6480    TI_DBG2(("ossaDeregisterDeviceHandleCB: OSSA_ERR_DEVICE_HANDLE_INVALID\n"));
6481    return;
6482  }
6483
6484  oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
6485  onePortContext = oneDeviceData->tdPortContext;
6486#ifdef FDS_DM
6487  dmPortContext = &(onePortContext->dmPortContext);
6488#endif
6489
6490  if (oneDeviceData->valid == agFALSE && oneDeviceData->valid2 == agFALSE &&
6491      oneDeviceData->DeviceType == TD_DEFAULT_DEVICE && onePortContext->valid == agTRUE)
6492  {
6493    TI_DBG2(("ossaDeregisterDeviceHandleCB: transient did %d\n", oneDeviceData->id));
6494    return;
6495  }
6496
6497  if (onePortContext != agNULL)
6498  {
6499    TI_DBG2(("ossaDeregisterDeviceHandleCB: pid %d registeredNumDevice %d\n", onePortContext->id, onePortContext->RegisteredDevNums));
6500  }
6501
6502  switch (status)
6503  {
6504  case OSSA_SUCCESS:
6505    TI_DBG3(("ossaDeregisterDeviceHandleCB: Success\n"));
6506    if (onePortContext == agNULL)
6507    {
6508      TI_DBG1(("ossaDeregisterDeviceHandleCB: onePortContext is NULL, wrong!\n"));
6509      return;
6510    }
6511    /* port is going down */
6512    if (onePortContext->valid == agFALSE)
6513    {
6514      if (!(oneDeviceData->valid == agFALSE && oneDeviceData->valid2 == agFALSE && oneDeviceData->DeviceType == TD_DEFAULT_DEVICE))
6515      {
6516        /* remove oneDevice from MainLink */
6517        TI_DBG2(("ossaDeregisterDeviceHandleCB: delete from MainLink\n"));
6518#ifdef FDS_SM
6519        if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6520        {
6521          TI_DBG1(("ossaDeregisterDeviceHandleCB: did %d calling smDeregisterDevice\n", oneDeviceData->id));
6522          smDeregisterDevice(smRoot, oneDeviceData->agDevHandle, &(oneDeviceData->smDeviceHandle));
6523        }
6524#endif
6525        tdsaDeviceDataReInit(tiRoot, oneDeviceData);
6526        osti_memset(&(oneDeviceData->satDevData.satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t));
6527
6528        tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
6529        TDLIST_DEQUEUE_THIS(&(oneDeviceData->MainLink));
6530        TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
6531        tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
6532      }
6533      /* for portcontext */
6534      PhyID = onePortContext->eventPhyID;
6535      TI_DBG3(("ossaDeregisterDeviceHandleCB: PhyID %d\n", PhyID));
6536      onePortContext->RegisteredDevNums--;
6537      /*
6538        check if valid in tdsaAllShared and the last registered device in a portcontext;
6539        if so, call saHwEventAck()
6540       */
6541      if (tdsaAllShared->eventSource[PhyID].EventValid == agTRUE &&
6542          onePortContext->RegisteredDevNums == 0 &&
6543          PhyID != 0xFF
6544          )
6545      {
6546        TI_DBG2(("ossaDeregisterDeviceHandleCB: calling saHwEventAck\n"));
6547        eventSource = &(tdsaAllShared->eventSource[PhyID].Source);
6548        HwAckSatus = saHwEventAck(
6549                                  agRoot,
6550                                  agNULL, /* agContext */
6551                                  0,
6552                                  eventSource, /* agsaEventSource_t */
6553                                  0,
6554                                  0
6555                                  );
6556        if ( HwAckSatus != AGSA_RC_SUCCESS)
6557        {
6558          TI_DBG1(("ossaDeregisterDeviceHandleCB: failing in saHwEventAck; status %d\n", HwAckSatus));
6559        }
6560
6561        /* toggle */
6562        tdsaAllShared->eventSource[PhyID].EventValid = agFALSE;
6563
6564#ifdef FDS_DM
6565        if (onePortContext->UseDM == agTRUE)
6566        {
6567          TI_DBG1(("ossaDeregisterDeviceHandleCB: calling dmDestroyPort\n"));
6568          /* setup dmPortInfo */
6569          PORTINFO_PUT_SAS_REMOTE_ADDRESSLO(&dmPortInfo, onePortContext->sasRemoteAddressLo);
6570          PORTINFO_PUT_SAS_REMOTE_ADDRESSHI(&dmPortInfo, onePortContext->sasRemoteAddressHi);
6571          PORTINFO_PUT_SAS_LOCAL_ADDRESSLO(&dmPortInfo, onePortContext->sasLocalAddressLo);
6572          PORTINFO_PUT_SAS_LOCAL_ADDRESSHI(&dmPortInfo, onePortContext->sasLocalAddressHi);
6573          DMstatus = dmDestroyPort(dmRoot, dmPortContext, &dmPortInfo);
6574          if (DMstatus != DM_RC_SUCCESS)
6575          {
6576             TI_DBG1(("ossaDeregisterDeviceHandleCB: dmDestroyPort failed!!! 0x%x\n", DMstatus));
6577          }
6578        }
6579#endif
6580        tdsaPortContextReInit(tiRoot, onePortContext);
6581        /*
6582          put all devices belonging to the onePortContext
6583          back to the free link
6584        */
6585
6586        tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
6587        TDLIST_DEQUEUE_THIS(&(onePortContext->MainLink));
6588        TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->FreeLink), &(tdsaAllShared->FreePortContextList));
6589        tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
6590      }
6591      else if (tdsaAllShared->eventSource[PhyID].EventValid == NO_ACK &&
6592               onePortContext->RegisteredDevNums == 0
6593              )
6594      {
6595        TI_DBG2(("ossaDeregisterDeviceHandleCB: NO ACK case\n"));
6596#ifdef FDS_DM
6597        if (onePortContext->UseDM == agTRUE)
6598        {
6599          TI_DBG1(("ossaDeregisterDeviceHandleCB: calling dmDestroyPort\n"));
6600          /* setup dmPortInfo */
6601          PORTINFO_PUT_SAS_REMOTE_ADDRESSLO(&dmPortInfo, onePortContext->sasRemoteAddressLo);
6602          PORTINFO_PUT_SAS_REMOTE_ADDRESSHI(&dmPortInfo, onePortContext->sasRemoteAddressHi);
6603          PORTINFO_PUT_SAS_LOCAL_ADDRESSLO(&dmPortInfo, onePortContext->sasLocalAddressLo);
6604          PORTINFO_PUT_SAS_LOCAL_ADDRESSHI(&dmPortInfo, onePortContext->sasLocalAddressHi);
6605          DMstatus = dmDestroyPort(dmRoot, dmPortContext, &dmPortInfo);
6606          if (DMstatus != DM_RC_SUCCESS)
6607          {
6608            TI_DBG1(("ossaDeregisterDeviceHandleCB: dmDestroyPort failed!!! 0x%x\n", DMstatus));
6609          }
6610        }
6611#endif
6612        tdsaPortContextReInit(tiRoot, onePortContext);
6613        /*
6614          put all devices belonging to the onePortContext
6615          back to the free link
6616        */
6617
6618        tdsaSingleThreadedEnter(tiRoot, TD_PORT_LOCK);
6619        TDLIST_DEQUEUE_THIS(&(onePortContext->MainLink));
6620        TDLIST_ENQUEUE_AT_TAIL(&(onePortContext->FreeLink), &(tdsaAllShared->FreePortContextList));
6621        tdsaSingleThreadedLeave(tiRoot, TD_PORT_LOCK);
6622      }
6623      else
6624      {
6625        if (PhyID < TD_MAX_NUM_PHYS)
6626        {
6627          TI_DBG3(("ossaDeregisterDeviceHandleCB: pid %d eventvalid %d registeredNumDevice %d\n", onePortContext->id, tdsaAllShared->eventSource[PhyID].EventValid , onePortContext->RegisteredDevNums));
6628        }
6629        else
6630        {
6631          TI_DBG3(("ossaDeregisterDeviceHandleCB: pid %d registeredNumDevice %d wrong phyid %d\n", onePortContext->id, onePortContext->RegisteredDevNums, PhyID));
6632        }
6633      }
6634    }
6635    else
6636    {
6637      PhyID = onePortContext->eventPhyID;
6638      TI_DBG3(("ossaDeregisterDeviceHandleCB: PhyID %d\n", PhyID));
6639      onePortContext->RegisteredDevNums--;
6640#ifdef FDS_SM
6641      oneDeviceData->satDevData.IDDeviceValid = agFALSE;
6642      if (DEVICE_IS_SATA_DEVICE(oneDeviceData) || DEVICE_IS_STP_TARGET(oneDeviceData))
6643      {
6644        smDeregisterDevice(smRoot, oneDeviceData->agDevHandle, &(oneDeviceData->smDeviceHandle));
6645      }
6646#endif
6647      /*
6648        check if valid in tdsaAllShared and the last registered device in a portcontext;
6649        if so, call saHwEventAck()
6650      */
6651      if (tdsaAllShared->eventSource[PhyID].EventValid == agTRUE &&
6652          onePortContext->RegisteredDevNums == 0 &&
6653          PhyID != 0xFF
6654          )
6655      {
6656        TI_DBG2(("ossaDeregisterDeviceHandleCB: calling saHwEventAck\n"));
6657        eventSource = &(tdsaAllShared->eventSource[PhyID].Source);
6658        HwAckSatus = saHwEventAck(
6659                                  agRoot,
6660                                  agNULL, /* agContext */
6661                                  0,
6662                                  eventSource, /* agsaEventSource_t */
6663                                  0,
6664                                  0
6665                                  );
6666        if ( HwAckSatus != AGSA_RC_SUCCESS)
6667        {
6668          TI_DBG1(("ossaDeregisterDeviceHandleCB: failing in saHwEventAck; status %d\n", HwAckSatus));
6669        }
6670
6671        /* toggle */
6672        tdsaAllShared->eventSource[PhyID].EventValid = agFALSE;
6673      }
6674#ifdef INITIATOR_DRIVER
6675      else if (onePortContext->RegisteredDevNums == 1)
6676      {
6677        TI_DBG1(("ossaDeregisterDeviceHandleCB: all devices have been deregistered except directly attached EXP\n"));
6678        /* qqqqq If broadcast has been seen, call incremental discovery*/
6679        if (onePortContext->DiscFailNSeenBC == agTRUE)
6680        {
6681          TI_DBG1(("ossaDeregisterDeviceHandleCB: calling dmDiscover, incremental, pid %d\n", onePortContext->id));
6682          dmDiscover(dmRoot, dmPortContext, DM_DISCOVERY_OPTION_INCREMENTAL_START);
6683          onePortContext->DiscFailNSeenBC = agFALSE;
6684        }
6685        else
6686        {
6687          TI_DBG1(("ossaDeregisterDeviceHandleCB: not calling dmDiscover\n"));
6688          /* qqqqq needs to change discovery state to onePortContext->DMDiscoveryState == dmDiscCompleted
6689             in dmQueryDiscovery
6690             change the discovery state from dmDiscFailed to dmDiscCompleted
6691          */
6692          dmResetFailedDiscovery(dmRoot, dmPortContext);
6693
6694        }
6695      }
6696#endif
6697      else
6698      {
6699        if (PhyID < TD_MAX_NUM_PHYS)
6700        {
6701          TI_DBG3(("ossaDeregisterDeviceHandleCB: pid %d eventvalid %d registeredNumDevice %d\n", onePortContext->id, tdsaAllShared->eventSource[PhyID].EventValid , onePortContext->RegisteredDevNums));
6702        }
6703        else
6704        {
6705          TI_DBG3(("ossaDeregisterDeviceHandleCB: pid %d registeredNumDevice %d wrong phyid %d\n", onePortContext->id, onePortContext->RegisteredDevNums, PhyID));
6706        }
6707      }
6708    }
6709    break;
6710  case OSSA_INVALID_HANDLE:
6711    TI_DBG1(("ossaDeregisterDeviceHandleCB: OSSA_INVALID_HANDLE\n"));
6712    break;
6713#ifdef REMOVED
6714  case OSSA_FAILURE_DEVICE_DIRECT_ATTACH:
6715    TI_DBG1(("ossaDeregisterDeviceHandleCB: OSSA_FAILURE_DEVICE_DIRECT_ATTACH\n"));
6716    break;
6717#endif
6718  case OSSA_ERR_DEVICE_HANDLE_INVALID:
6719    TI_DBG1(("ossaDeregisterDeviceHandleCB: OSSA_ERR_DEVICE_HANDLE_INVALID\n"));
6720    break;
6721  case OSSA_ERR_DEVICE_BUSY:
6722    TI_DBG1(("ossaDeregisterDeviceHandleCB: OSSA_ERR_DEVICE_BUSY\n"));
6723    break;
6724  default:
6725    TI_DBG1(("ossaDeregisterDeviceHandleCB: unknown status 0x%x\n", status));
6726    break;
6727  }
6728
6729  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yf");
6730  return;
6731}
6732
6733/*****************************************************************************/
6734/*! \brief ossaDeviceHandleRemovedEvent
6735 *
6736 *
6737 *  Purpose: This routine is called by lower layer to notify the device removal
6738 *
6739 *
6740 *  \param   agRoot:       Pointer to chip/driver Instance.
6741 *  \param   agDevHandle:  Pointer to the assigned device handle for the
6742 *                         registered device.
6743 *  \param   agPortContext:Pointer to this instance of port context.
6744 *
6745 *
6746 *  \return None.
6747 *
6748 */
6749/*****************************************************************************/
6750osGLOBAL void ossaDeviceHandleRemovedEvent (
6751                                agsaRoot_t        *agRoot,
6752                                agsaDevHandle_t   *agDevHandle,
6753                                agsaPortContext_t *agPortContext
6754                                )
6755{
6756#ifdef NOT_YET
6757  tdsaRootOsData_t  *osData = (tdsaRootOsData_t *)agRoot->osData;
6758  tiRoot_t          *tiRoot = (tiRoot_t *)osData->tiRoot;
6759#endif
6760  tdsaPortContext_t *onePortContext = agNULL;
6761  tdsaDeviceData_t  *oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
6762
6763  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yg");
6764  TI_DBG2(("ossaDeviceHandleRemovedEvent: start\n"));
6765  if (oneDeviceData == agNULL)
6766  {
6767    TI_DBG1(("ossaDeviceHandleRemovedEvent: Wrong! oneDeviceData is NULL\n"));
6768    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yg");
6769    return;
6770  }
6771  TI_DBG2(("ossaDeviceHandleRemovedEvent: did %d\n", oneDeviceData->id));
6772  oneDeviceData->registered = agFALSE;
6773  onePortContext  = (tdsaPortContext_t *)agPortContext->osData;
6774  if (onePortContext == agNULL)
6775  {
6776    TI_DBG1(("ossaDeviceHandleRemovedEvent: Wrong! onePortContext is NULL\n"));
6777    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "Yg");
6778    return;
6779  }
6780  TI_DBG2(("ossaDeviceHandleRemovedEvent: pid %d\n", onePortContext->id));
6781  onePortContext->RegisteredDevNums--;
6782#ifdef NOT_YET
6783  ostiInitiatorEvent(
6784                     tiRoot,
6785                     onePortContext->tiPortalContext,
6786                     agNULL,
6787                     tiIntrEventTypeDeviceChange,
6788                     tiDeviceRemoval,
6789                     agNULL
6790                     );
6791#endif
6792
6793  smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "Yg");
6794  return;
6795}
6796
6797#ifdef SPC_ENABLE_PROFILE
6798/*****************************************************************************/
6799/*! \brief ossaFwProfileCB
6800 *
6801 *
6802 *  Purpose: This routine is called by lower layer to corresponding to
6803 *           saFwProfile()
6804 *
6805 *  \param   agRoot:       Pointer to chip/driver Instance.
6806 *  \param   agContext:    Context of the operation originally passed
6807 *                         into saFwProfile()
6808 *  \param   status:       status
6809 *
6810 *
6811 *  \return None.
6812 *
6813 */
6814/*****************************************************************************/
6815osGLOBAL void ossaFwProfileCB(
6816                    agsaRoot_t          *agRoot,
6817                    agsaContext_t       *agContext,
6818                    bit32                status,
6819                    bit32                len)
6820{
6821  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
6822  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
6823
6824  TI_DBG2(("ossaFwProfileCB: start\n"));
6825
6826  switch (status)
6827  {
6828    case AGSA_RC_SUCCESS:
6829    {
6830      TI_DBG2(("ossaFwProfileCB: SUCCESS\n"));
6831      break;
6832    }
6833    case AGSA_RC_FAILURE:
6834    {
6835      TI_DBG1(("ossaFwProfileCB: FAIL\n"));
6836      break;
6837    }
6838    default:
6839    {
6840      TI_DBG1(("ossaFwProfileCB: !!! default, status %d\n", status));
6841      break;
6842    }
6843  }
6844
6845  ostiFWProfileIOCTLRsp(tiRoot, status, len);
6846  return;
6847}
6848#endif
6849/*****************************************************************************/
6850/*! \brief ossaFwFlashUpdateCB
6851 *
6852 *
6853 *  Purpose: This routine is called by lower layer to corresponding to
6854 *           saFwFlashUpdate()
6855 *
6856 *  \param   agRoot:       Pointer to chip/driver Instance.
6857 *  \param   agContext:    Context of the operation originally passed
6858 *                         into saFwFlashUpdate()
6859 *  \param   status:       status
6860 *
6861 *
6862 *  \return None.
6863 *
6864 */
6865/*****************************************************************************/
6866osGLOBAL void ossaFwFlashUpdateCB(
6867                    agsaRoot_t          *agRoot,
6868                    agsaContext_t       *agContext,
6869                    bit32               status
6870                    )
6871{
6872  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
6873  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
6874
6875  TI_DBG2(("ossaFwFlashUpdateCB: start\n"));
6876
6877  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yh");
6878  switch (status)
6879  {
6880  case OSSA_FLASH_UPDATE_COMPLETE_PENDING_REBOOT:
6881  {
6882    TI_DBG2(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_COMPLETE_PENDING_REBOOT\n"));
6883    break;
6884  }
6885  case OSSA_FLASH_UPDATE_IN_PROGRESS:
6886  {
6887    TI_DBG2(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_IN_PROGRESS\n"));
6888    break;
6889  }
6890  case OSSA_FLASH_UPDATE_HDR_ERR:
6891  {
6892    TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_HDR_ERR\n"));
6893    break;
6894  }
6895  case OSSA_FLASH_UPDATE_OFFSET_ERR:
6896  {
6897    TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_OFFSET_ERR\n"));
6898    break;
6899  }
6900  case OSSA_FLASH_UPDATE_CRC_ERR:
6901  {
6902    TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_CRC_ERR\n"));
6903    break;
6904  }
6905  case OSSA_FLASH_UPDATE_LENGTH_ERR:
6906  {
6907    TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_LENGTH_ERR\n"));
6908    break;
6909  }
6910  case OSSA_FLASH_UPDATE_HW_ERR:
6911  {
6912    TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_HW_ERR\n"));
6913    break;
6914  }
6915  case OSSA_FLASH_UPDATE_DNLD_NOT_SUPPORTED:
6916  {
6917    TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_DNLD_NOT_SUPPORTED\n"));
6918    break;
6919  }
6920  case OSSA_FLASH_UPDATE_DISABLED:
6921  {
6922    TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_DISABLED\n"));
6923    break;
6924  }
6925  case OSSA_FLASH_FWDNLD_DEVICE_UNSUPPORT:
6926  {
6927    TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_FWDNLD_DEVICE_UNSUPPORT\n"));
6928    break;
6929  }
6930  case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE:
6931  {
6932    TI_DBG1(("ossaFwFlashUpdateCB: OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE\n"));
6933    break;
6934  }
6935  case OSSA_FLASH_UPDATE_HMAC_ERR:
6936  {
6937    TI_DBG1(("ossaFwFlashUpdateCB: OSSA_FLASH_UPDATE_HMAC_ERR\n"));
6938    break;
6939  }
6940
6941  default:
6942  {
6943    TI_DBG1(("ossaFwFlashUpdateCB: !!! default, status 0x%X\n", status));
6944    break;
6945  }
6946  }
6947
6948  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yh");
6949  ostiCOMMgntIOCTLRsp(tiRoot, status);
6950  return;
6951
6952}
6953
6954
6955GLOBAL void   ossaFlashExtExecuteCB(
6956                      agsaRoot_t               *agRoot,
6957                      agsaContext_t            *agContext,
6958                      bit32                    status,
6959                      bit32                    command,
6960                      agsaFlashExtResponse_t  *agFlashExtRsp)
6961{
6962    TI_DBG1(("ossaFlashExtExecuteCB: command  0x%X status 0x%X\n",command, status));
6963
6964}
6965
6966
6967
6968/*****************************************************************************/
6969/*! \brief ossaGetNVMDResponseCB
6970 *
6971 *
6972 *  Purpose: This routine is called by lower layer to corresponding to
6973 *           saGetNVMDCommand()
6974 *
6975 *  \param   agRoot:           Pointer to chip/driver Instance.
6976 *  \param   agContext:        Context of the operation originally passed
6977 *                             into saGetVPDCommand()
6978 *  \param   status:           status
6979 *  \param   indirectPayload:  The value passed in agsaNVMDData_t when
6980 *                             calling saGetNVMDCommand()
6981 *  \param   agInfoLen:        the length of VPD information
6982 *  \param   agFrameHandle:    handler of VPD information
6983 *
6984 *
6985 *  \return None.
6986 *
6987 */
6988/*****************************************************************************/
6989osGLOBAL void ossaGetNVMDResponseCB(
6990                      agsaRoot_t                    *agRoot,
6991                      agsaContext_t                 *agContext,
6992                      bit32                         status,
6993                      bit8                          indirectPayload,
6994                      bit32                         agInfoLen,
6995                      agsaFrameHandle_t             agFrameHandle
6996)
6997{
6998  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
6999  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
7000  TI_DBG2(("ossaGetNVMDResponseCB: start\n"));
7001  TI_DBG2(("ossaGetNVMDResponseCB: agInfoLen %d\n", agInfoLen));
7002  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yi");
7003
7004  if (status == OSSA_SUCCESS)
7005  {
7006    TI_DBG2(("ossaGetNVMDResponseCB: Success status\n"));
7007    if (indirectPayload == 0 && agInfoLen != 0)
7008    {
7009      TI_DBG2(("ossaGetNVMDResponseCB: direct\n"));
7010      tdhexdump("ossaGetNVMDResponseCB", (bit8 *)agFrameHandle, agInfoLen);
7011    }
7012  }
7013  else
7014  {
7015    TI_DBG1(("ossaGetNVMDResponseCB: Status 0x%x\n", status));
7016  }
7017
7018  if (indirectPayload == 0)
7019  {
7020    TI_DBG2(("ossaGetNVMDResponseCB: direct\n"));
7021  }
7022  else
7023  {
7024    TI_DBG2(("ossaGetNVMDResponseCB: indirect\n"));
7025  }
7026
7027  ostiGetNVMDIOCTLRsp(tiRoot, status);
7028  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yi");
7029  return;
7030}
7031
7032
7033/*****************************************************************************/
7034/*! \brief ossaSetNVMDResponseCB
7035 *
7036 *
7037 *  Purpose: This routine is called by lower layer to corresponding to
7038 *           saSetNVMDCommand()
7039 *
7040 *  \param   agRoot:       Pointer to chip/driver Instance.
7041 *  \param   agContext:    Context of the operation originally passed
7042 *                         into saSetVPDCommand()
7043 *  \param   status:       status
7044 *
7045 *
7046 *  \return None.
7047 *
7048 */
7049/*****************************************************************************/
7050osGLOBAL void ossaSetNVMDResponseCB(
7051                      agsaRoot_t            *agRoot,
7052                      agsaContext_t         *agContext,
7053                      bit32                 status
7054                      )
7055{
7056  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
7057  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
7058  TI_DBG2(("ossaSetNVMDResponseCB: start\n"));
7059  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yj");
7060  if (status == OSSA_SUCCESS)
7061  {
7062    TI_DBG2(("ossaSetNVMDResponseCB: success\n"));
7063  }
7064  else
7065  {
7066    TI_DBG1(("ossaSetNVMDResponseCB: fail or undefined staus %d\n", status));
7067  }
7068  ostiSetNVMDIOCTLRsp(tiRoot, status);
7069  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yj");
7070  return;
7071}
7072
7073
7074#ifdef REMOVED
7075/*****************************************************************************/
7076/*! \brief ossaGetVPDResponseCB
7077 *
7078 *
7079 *  Purpose: This routine is called by lower layer to corresponding to
7080 *           saGetVPDCommand()
7081 *
7082 *  \param   agRoot:       Pointer to chip/driver Instance.
7083 *  \param   agContext:    Context of the operation originally passed
7084 *                         into saGetVPDCommand()
7085 *  \param   status:       status
7086 *  \param   agInfoLen:    the length of VPD information
7087 *  \param   agFrameHandle:handler of VPD information
7088 *
7089 *
7090 *  \return None.
7091 *
7092 */
7093/*****************************************************************************/
7094osGLOBAL void ossaGetVPDResponseCB(
7095                     agsaRoot_t         *agRoot,
7096                     agsaContext_t      *agContext,
7097                     bit32              status,
7098                     bit8               indirectMode,
7099                     bit32              agInfoLen,
7100                     agsaFrameHandle_t  agFrameHandle
7101                     )
7102{
7103  bit8 VPDData[48];
7104
7105  TI_DBG2(("ossaGetVPDResponseCB: start\n"));
7106
7107  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yk");
7108  if (status == OSSA_SUCCESS)
7109  {
7110    TI_DBG2(("ossaGetVPDResponseCB: agInfoLen %d\n", agInfoLen));
7111    osti_memset(VPDData, 0, 48);
7112    /* We can read only in case of Direct */
7113    saFrameReadBlock(agRoot, agFrameHandle, 0, VPDData, agInfoLen);
7114    tdhexdump("ossaGetVPDResponseCB", (bit8 *)VPDData, agInfoLen);
7115    /*
7116      callback osti....
7117    */
7118  }
7119  else
7120  {
7121    TI_DBG1(("ossaGetVPDResponseCB: fail or undefined staus %d\n", status));
7122  }
7123  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yk");
7124  return;
7125}
7126
7127
7128/*****************************************************************************/
7129/*! \brief ossaSetVPDResponseCB
7130 *
7131 *
7132 *  Purpose: This routine is called by lower layer to corresponding to
7133 *           saSetVPDCommand()
7134 *
7135 *  \param   agRoot:       Pointer to chip/driver Instance.
7136 *  \param   agContext:    Context of the operation originally passed
7137 *                         into saSetVPDCommand()
7138 *  \param   status:       status
7139 *
7140 *
7141 *  \return None.
7142 *
7143 */
7144/*****************************************************************************/
7145osGLOBAL void ossaSetVPDResponseCB(
7146                     agsaRoot_t         *agRoot,
7147                     agsaContext_t      *agContext,
7148                     bit32              status
7149                     )
7150{
7151  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
7152  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
7153
7154  TI_DBG2(("ossaSetVPDResponseCB: start\n"));
7155  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yl");
7156
7157  if (status == OSSA_SUCCESS)
7158  {
7159    TI_DBG2(("ossaSetVPDResponseCB: success\n"));
7160    ostiCOMMgntVPDSetIOCTLRsp(tiRoot, 0);
7161    /*
7162      callback osti.....
7163    */
7164
7165#ifdef VPD_TESTING
7166    /* temporary to test saSetVPDCommand() and saGetVPDCommand */
7167    tdsaVPDGet(tiRoot);
7168#endif
7169
7170  }
7171  else
7172  {
7173    TI_DBG1(("ossaSetVPDResponseCB: fail or undefined staus %d\n", status));
7174  }
7175  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yl");
7176  return;
7177}
7178#endif
7179
7180/*****************************************************************************/
7181/*! \brief ossaEchoCB
7182 *
7183 *
7184 *  Purpose: This routine is called by lower layer to corresponding to
7185 *           saEchoCommand()
7186 *
7187 *  \param   agRoot:        Pointer to chip/driver Instance.
7188 *  \param   agContext:     Context of the operation originally passed
7189 *                          into saEchoCommand()
7190 *  \param   echoPayload:   Pointer to the echo payload
7191 *
7192 *
7193 *  \return None.
7194 *
7195 */
7196/*****************************************************************************/
7197osGLOBAL void ossaEchoCB(
7198            agsaRoot_t      *agRoot,
7199            agsaContext_t   *agContext,
7200            void            *echoPayload
7201          )
7202{
7203#ifdef ECHO_TESTING
7204  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
7205  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
7206  bit8                payload[56];
7207#endif
7208
7209  TI_DBG2(("ossaEchoCB: start\n"));
7210  smTraceFuncEnter(hpDBG_VERY_LOUD,"Ym");
7211
7212  /* dumping received echo payload is 56 bytes */
7213  tdhexdump("ossaEchoCB: echoPayload", (bit8 *)(echoPayload), 56);
7214
7215#ifdef ECHO_TESTING
7216  /* temporary to test saEchoCommand() */
7217
7218  /* new echo payload */
7219  osti_memset(payload,0, sizeof(payload));
7220
7221  payload[0] = gEcho;
7222  payload[55] = gEcho;
7223
7224  TI_DBG2(("ossaEchoCB: gEcho %d\n", gEcho));
7225
7226  saEchoCommand(agRoot, agNULL, tdsaRotateQnumber(tiRoot, agNULL), (void *)&payload);
7227
7228  if (gEcho == 0xFF)
7229  {
7230    gEcho = 0;
7231  }
7232  else
7233  {
7234    gEcho++;
7235  }
7236#endif
7237
7238  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Ym");
7239  return;
7240}
7241
7242/*****************************************************************************/
7243/*! \brief ossaGpioResponseCB
7244 *
7245 *
7246 *  Purpose: This routine is called by lower layer to corresponding to
7247 *           saGpioEventSetup(), saGpioPinSetup(), saGpioRead(), or
7248 *           saGpioWrite()
7249 *
7250 *  \param   agRoot:              Pointer to chip/driver Instance.
7251 *  \param   agContext:           Context of the operation originally passed
7252 *                                in.
7253 *  \param   status:              GPIO operation completion status
7254 *  \param   gpioReadValue:       a bit map containing the corresponding
7255 *                                value for each GPIO pin.
7256 *  \param   gpioPinSetupInfo:    Pointer to agsaGpioPinSetupInfo_t structure
7257 *                                describing the GPIO pin setup
7258 *  \param   gpioEventSetupInfo   Pointer to agsaGpioEventSetupInfo_t structure
7259 *                                describing the GPIO event setups
7260 *
7261 *
7262 *  \return None.
7263 *
7264 */
7265/*****************************************************************************/
7266osGLOBAL void ossaGpioResponseCB(
7267                   agsaRoot_t               *agRoot,
7268                   agsaContext_t            *agContext,
7269                   bit32                    status,
7270                   bit32                    gpioReadValue,
7271                   agsaGpioPinSetupInfo_t   *gpioPinSetupInfo,
7272                   agsaGpioEventSetupInfo_t *gpioEventSetupInfo
7273                   )
7274{
7275  TI_DBG2(("ossaGpioResponseCB: start\n"));
7276  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yn");
7277  if (status == OSSA_SUCCESS)
7278  {
7279    TI_DBG2(("ossaGpioResponseCB: Success\n"));
7280    /* printing gpioReadValue, agsaGpioPinSetupInfo_t and agsaGpioEventSetupInfo_t */
7281    TI_DBG2(("ossaGpioResponseCB: gpioReadValue 0x%x\n", gpioReadValue));
7282    TI_DBG2(("ossaGpioResponseCB: PinSetupInfo gpioInputEnabled 0x%x\n", gpioPinSetupInfo->gpioInputEnabled));
7283    TI_DBG2(("ossaGpioResponseCB: PinSetupInfo gpioTypePart1 0x%x\n", gpioPinSetupInfo->gpioTypePart1));
7284    TI_DBG2(("ossaGpioResponseCB: PinSetupInfo gpioTypePart2 0x%x\n", gpioPinSetupInfo->gpioTypePart2));
7285    TI_DBG2(("ossaGpioResponseCB: EventSetupInfo gpioEventLevel 0x%x\n", gpioEventSetupInfo->gpioEventLevel));
7286    TI_DBG2(("ossaGpioResponseCB: EventSetupInfo gpioEventRisingEdge 0x%x\n", gpioEventSetupInfo->gpioEventRisingEdge));
7287    TI_DBG2(("ossaGpioResponseCB: EventSetupInfo gpioEventFallingEdge 0x%x\n", gpioEventSetupInfo->gpioEventFallingEdge));
7288  }
7289  else
7290  {
7291    TI_DBG1(("ossaGpioResponseCB: Failure\n"));
7292  }
7293  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yn");
7294  return;
7295}
7296
7297/*****************************************************************************/
7298/*! \brief ossaGpioEvent
7299 *
7300 *
7301 *  Purpose: This routine is called by lower layer to corresponding to
7302 *           saGpioEventSetup(), saGpioPinSetup(), saGpioRead(), or
7303 *           saGpioWrite()
7304 *
7305 *  \param   agRoot:              Pointer to chip/driver Instance.
7306 *  \param   gpioEvent:           a bit map that indicates which GPIO
7307 *                                input pins have generated the event.
7308 *
7309 *
7310 *  \return None.
7311 *
7312 */
7313/*****************************************************************************/
7314osGLOBAL void ossaGpioEvent(
7315              agsaRoot_t    *agRoot,
7316              bit32         gpioEvent
7317              )
7318{
7319  TI_DBG2(("ossaGpioEvent: start\n"));
7320  TI_DBG2(("ossaGpioEvent: gpioEvent 0x%x\n", gpioEvent));
7321  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yo");
7322  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yo");
7323  return;
7324}
7325
7326
7327/*****************************************************************************/
7328/*! \brief ossaSASDiagExecuteCB
7329 *
7330 *
7331 *  Purpose: This routine is called by lower layer to corresponding to
7332 *           saSASDiagExecute()
7333 *
7334 *  \param   agRoot:              Pointer to chip/driver Instance.
7335 *  \param   agContext:           Context of the operation originally passed
7336 *                                in.
7337 *  \param   status:              Diagnostic operation completion status
7338 *  \param   command:             SAS diagnostic command field in agsaSASDiagExecute_t
7339 *                                structure passed in saSASDiagExecute().
7340 *  \param   reportData:          Report Diagnostic Data
7341 *
7342 *
7343 *  \return None.
7344 *
7345 */
7346/*****************************************************************************/
7347osGLOBAL void ossaSASDiagExecuteCB(
7348                      agsaRoot_t      *agRoot,
7349                      agsaContext_t   *agContext,
7350                      bit32           status,
7351                      bit32           command,
7352                      bit32           reportData)
7353{
7354  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yq");
7355  TI_DBG2(("ossaSASDiagExecuteCB: start\n"));
7356  TI_DBG2(("ossaSASDiagExecuteCB: status %d\n", status));
7357  TI_DBG2(("ossaSASDiagExecuteCB: command %d\n", command));
7358  TI_DBG2(("ossaSASDiagExecuteCB: reportData %d\n", reportData));
7359
7360  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yq");
7361  return;
7362
7363}
7364
7365
7366/*****************************************************************************/
7367/*! \brief ossaSASDiagStartEndCB
7368 *
7369 *
7370 *  Purpose: This routine is called by lower layer to corresponding to
7371 *           saSASDiagExecute()
7372 *
7373 *  \param   agRoot:              Pointer to chip/driver Instance.
7374 *  \param   agContext:           Context of the operation originally passed
7375 *                                in.
7376 *  \param   status:              Diagnostic operation completion status
7377 *
7378 *
7379 *  \return None.
7380 *
7381 */
7382/*****************************************************************************/
7383osGLOBAL void ossaSASDiagStartEndCB(
7384                      agsaRoot_t        *agRoot,
7385                      agsaContext_t     *agContext,
7386                      bit32             status)
7387{
7388  TI_DBG2(("ossaSASDiagStartEndCB: start\n"));
7389  TI_DBG2(("ossaSASDiagStartEndCB: status %d\n", status));
7390  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yr");
7391  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yr");
7392  return;
7393}
7394
7395/*****************************************************************************/
7396/*! \brief ossaReconfigSASParamsCB
7397 *
7398 *
7399 *  Purpose: This routine is called by lower layer to corresponding to
7400 *           saReconfigSASParams()
7401 *
7402 *  \param   agRoot:              Pointer to chip/driver Instance.
7403 *  \param   agContext:           Context of the operation originally passed
7404 *                                in saReconfigSASParams().
7405 *  \param   status:              saReconfigSASParams() completion status
7406 *  \param   agSASConfig:         Pointer to the data structure agsaSASReconfig_t
7407 *
7408 *
7409 *  \return None.
7410 *
7411 */
7412/*****************************************************************************/
7413osGLOBAL void   ossaReconfigSASParamsCB(
7414                        agsaRoot_t        *agRoot,
7415                        agsaContext_t     *agContext,
7416                        bit32             status,
7417                        agsaSASReconfig_t *agSASConfig)
7418{
7419  TI_DBG2(("ossaReconfigSASParamsCB: status %d\n", status));
7420  return;
7421}
7422
7423GLOBAL void ossaPCIeDiagExecuteCB(
7424            agsaRoot_t             *agRoot,
7425            agsaContext_t         *agContext,
7426            bit32                  status,
7427            bit32                  command,
7428            agsaPCIeDiagResponse_t *resp )
7429{
7430  TI_DBG2(("ossaPCIeDiagExecuteCB: status %d\n", status));
7431  TI_DBG2(("ossaPCIeDiagExecuteCB: ERR_BLKH 0x%X\n",resp->ERR_BLKH ));
7432  TI_DBG2(("ossaPCIeDiagExecuteCB: ERR_BLKL 0x%X\n",resp->ERR_BLKL ));
7433  TI_DBG2(("ossaPCIeDiagExecuteCB: DWord8 0x%X\n",resp->DWord8 ));
7434  TI_DBG2(("ossaPCIeDiagExecuteCB: DWord9 0x%X\n",resp->DWord9 ));
7435  TI_DBG2(("ossaPCIeDiagExecuteCB: DWord10 0x%X\n",resp->DWord10 ));
7436  TI_DBG2(("ossaPCIeDiagExecuteCB: DWord11 0x%X\n",resp->DWord11 ));
7437  TI_DBG2(("ossaPCIeDiagExecuteCB: DIF_ERR 0x%X\n",resp->DIF_ERR ));
7438
7439  return;
7440}
7441
7442
7443#ifndef BIOS
7444GLOBAL void ossaSGpioCB(
7445                    agsaRoot_t              *agRoot,
7446                    agsaContext_t           *agContext,
7447                    agsaSGpioReqResponse_t  *pSgpioResponse
7448                    )
7449{
7450  tdsaRootOsData_t  *osData = (tdsaRootOsData_t *)agRoot->osData;
7451  tiRoot_t          *tiRoot = (tiRoot_t *)osData->tiRoot;
7452
7453  TI_DBG2(("ossaSGpioCB:  smpFrameType: 0x%02x \n", pSgpioResponse->smpFrameType));
7454 // printf("SS:ossaSGpioCB:  smpFrameType: 0x%02x \n", pSgpioResponse->smpFrameType);
7455  TI_DBG2(("ossaSGpioCB:  function: 0x%02x \n", pSgpioResponse->function));
7456  TI_DBG2(("ossaSGpioCB:  functionResult: 0x%02x \n", pSgpioResponse->functionResult));
7457  //printf("SS:ossaSGpioCB:  functionResult: 0x%02x \n", pSgpioResponse->functionResult);
7458
7459  tdhexdump("ossaSGpioCB Response", (bit8 *)pSgpioResponse, sizeof(agsaSGpioReqResponse_t));
7460  ostiSgpioIoctlRsp(tiRoot, pSgpioResponse);
7461}
7462
7463#endif /* BIOS */
7464
7465/*****************************************************************************/
7466/*! \brief ossaLogDebugString
7467 *
7468 *
7469 *  Purpose: This routine is called by lower layer to log.
7470 *
7471 *  \param   agRoot:              Pointer to chip/driver Instance.
7472 *  \param   level:               Detail of information desired.
7473 *  \param   string:              Pointer to the character string.
7474 *  \param   ptr1:                First pointer value.
7475 *  \param   ptr2:                Second pointer value.
7476 *  \param   value1:              First 32-bit value related to the specific information.
7477 *  \param   value2:              Second 32-bit value related to the specific information.
7478 *
7479 *  \return None.
7480 *
7481 */
7482/*****************************************************************************/
7483GLOBAL void ossaLogDebugString(
7484                         agsaRoot_t   *agRoot,
7485                         bit32        level,
7486                         char         *string,
7487                         void         *ptr1,
7488                         void         *ptr2,
7489                         bit32        value1,
7490                         bit32        value2
7491                         )
7492{
7493#if defined(SALLSDK_DEBUG)
7494  TIDEBUG_MSG(gLLDebugLevel, level, ("%s %p %p %d %d\n", string, ptr1, ptr2, value1, value2));
7495#endif
7496  return;
7497}
7498
7499/*****************************************************************************/
7500/*! \brief ossaHwEventAckCB
7501 *
7502 *
7503 *  Purpose: This routine is called by lower layer to corresponding to
7504 *           saHwEventAck(()
7505 *
7506 *  \param   agRoot:              Pointer to chip/driver Instance.
7507 *  \param   agContext:           Context of the operation originally passed
7508 *                                in.
7509 *  \param   status:              Status
7510 *
7511 *
7512 *  \return None.
7513 *
7514 */
7515/*****************************************************************************/
7516GLOBAL void ossaHwEventAckCB(
7517                             agsaRoot_t         *agRoot,
7518                             agsaContext_t      *agContext,
7519                             bit32              status
7520                             )
7521{
7522  TI_DBG3(("ossaHwEventAckCB: start\n"));
7523  smTraceFuncEnter(hpDBG_VERY_LOUD,"Ys");
7524  if (status == tiSuccess)
7525  {
7526    TI_DBG3(("ossaHwEventAckCB: SUCCESS status\n"));
7527  }
7528  else
7529  {
7530    TI_DBG1(("ossaHwEventAckCB: FAIL status 0x%X\n", status));
7531    TI_DBG1(("ossaHwEventAckCB: invalid event status bit0 %d\n", status & 0x01));
7532    TI_DBG1(("ossaHwEventAckCB: invalid phyid status bit1 %d\n", (status & 0x02) >> 1 ));
7533    TI_DBG1(("ossaHwEventAckCB: invalid portcontext status bit2 %d\n", (status & 0x04) >> 2));
7534    TI_DBG1(("ossaHwEventAckCB: invalid param0 status bit3 %d\n", (status & 0x08) >> 3));
7535  }
7536
7537  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Ys");
7538  return;
7539}
7540
7541/*****************************************************************************/
7542/*! \brief ossaGetTimeStampCB
7543 *
7544 *
7545 *  Purpose: This routine is called by lower layer to corresponding to
7546 *           saGetTimeStamp()
7547 *
7548 *  \param   agRoot:              Pointer to chip/driver Instance.
7549 *  \param   agContext:           Context of the operation originally passed
7550 *                                in.
7551 *  \param   timeStampLower:      The controller lower 32-bit of internal time
7552 *                                stamp associated with event log.
7553 *  \param   timeStampUpper:      The controller upper 32-bit of internal time
7554 *                                stamp associated with event log.
7555 *
7556 *
7557 *  \return None.
7558 *
7559 */
7560/*****************************************************************************/
7561GLOBAL void ossaGetTimeStampCB(
7562                         agsaRoot_t    *agRoot,
7563                         agsaContext_t *agContext,
7564                         bit32         timeStampLower,
7565                         bit32         timeStampUpper
7566                         )
7567{
7568  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yt");
7569  TI_DBG4(("ossaGetTimeStampCB: start\n"));
7570  TI_DBG4(("ossaGetTimeStampCB: timeStampUpper 0x%x timeStampLower 0x%x\n", timeStampUpper, timeStampLower));
7571  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yt");
7572  return;
7573}
7574
7575
7576/*****************************************************************************/
7577/*! \brief ossaSMPAbortCB
7578 *
7579 *
7580 *  Purpose: This routine is called by lower layer to corresponding to
7581 *           saSMPAbort()
7582 *
7583 *  \param   agRoot:              Pointer to chip/driver Instance.
7584 *  \param   agIORequest:         This is the agIORequest parameter passed in
7585 *                                saSMPAbort()
7586 *  \param   status:              Status of abort
7587 *
7588 *  \return None.
7589 *
7590 */
7591/*****************************************************************************/
7592GLOBAL void ossaSMPAbortCB(
7593                           agsaRoot_t           *agRoot,
7594                           agsaIORequest_t      *agIORequest,
7595                           bit32                flag,
7596                           bit32                status)
7597{
7598  tdsaRootOsData_t        *osData = (tdsaRootOsData_t *)agRoot->osData;
7599  tiRoot_t                *tiRoot = (tiRoot_t *)osData->tiRoot;
7600  tdIORequestBody_t       *tdAbortIORequestBody = agNULL;
7601  tdsaDeviceData_t        *oneDeviceData        = agNULL;
7602  tiDeviceHandle_t        *tiDeviceHandle       = agNULL;
7603
7604  TI_DBG4(("ossaSMPAbortCB: start\n"));
7605  TI_DBG4(("ossaSMPAbortCB: flag %d\n", flag));
7606  TI_DBG4(("ossaSMPAbortCB: status %d\n", status));
7607  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yu");
7608
7609  tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
7610  if (tdAbortIORequestBody == agNULL)
7611  {
7612    TI_DBG1(("ossaSMPAbortCB: tdAbortIORequestBody is NULL warning!!!!\n"));
7613    return;
7614  }
7615
7616  if (flag == 2)
7617  {
7618    /* abort per port */
7619    TI_DBG2(("ossaSMPAbortCB: abort per port\n"));
7620  }
7621  else if (flag == 1)
7622  {
7623    TI_DBG2(("ossaSMPAbortCB: abort all\n"));
7624
7625    tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle;
7626    if (tiDeviceHandle == agNULL)
7627    {
7628      TI_DBG1(("ossaSMPAbortCB: tiDeviceHandle is NULL warning!!!!\n"));
7629      ostiFreeMemory(
7630               tiRoot,
7631               tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7632               sizeof(tdIORequestBody_t)
7633               );
7634      return;
7635    }
7636
7637    oneDeviceData  = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
7638    if (oneDeviceData == agNULL)
7639    {
7640      TI_DBG1(("ossaSMPAbortCB: oneDeviceData is NULL warning!!!!\n"));
7641      ostiFreeMemory(
7642               tiRoot,
7643               tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7644               sizeof(tdIORequestBody_t)
7645               );
7646      return;
7647    }
7648
7649    if (status == OSSA_IO_SUCCESS)
7650    {
7651      TI_DBG2(("ossaSMPAbortCB: OSSA_IO_SUCCESS\n"));
7652      /* clean up TD layer's IORequestBody */
7653      TI_DBG3(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
7654      saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
7655      TI_DBG2(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
7656      ostiFreeMemory(
7657                     tiRoot,
7658                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7659                     sizeof(tdIORequestBody_t)
7660                     );
7661
7662    }
7663    else if (status == OSSA_IO_NOT_VALID)
7664    {
7665      TI_DBG1(("ossaSMPAbortCB: OSSA_IO_NOT_VALID\n"));
7666      /* clean up TD layer's IORequestBody */
7667      TI_DBG1(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
7668      saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
7669      TI_DBG1(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
7670      ostiFreeMemory(
7671                     tiRoot,
7672                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7673                     sizeof(tdIORequestBody_t)
7674                     );
7675    }
7676    else if (status == OSSA_IO_NO_DEVICE)
7677    {
7678      TI_DBG1(("ossaSMPAbortCB: OSSA_IO_NO_DEVICE\n"));
7679      /* clean up TD layer's IORequestBody */
7680      TI_DBG1(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
7681      saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
7682      TI_DBG1(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
7683      ostiFreeMemory(
7684                     tiRoot,
7685                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7686                     sizeof(tdIORequestBody_t)
7687                     );
7688    }
7689    else if (status == OSSA_IO_ABORT_IN_PROGRESS)
7690    {
7691      TI_DBG1(("ossaSMPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
7692      /* clean up TD layer's IORequestBody */
7693      TI_DBG1(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
7694      saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
7695      TI_DBG1(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
7696      ostiFreeMemory(
7697                     tiRoot,
7698                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7699                     sizeof(tdIORequestBody_t)
7700                     );
7701    }
7702#ifdef REMOVED
7703    else if (status == OSSA_IO_ABORT_DELAYED)
7704    {
7705      TI_DBG1(("ossaSMPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
7706      /* clean up TD layer's IORequestBody */
7707      TI_DBG1(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
7708      saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
7709      TI_DBG1(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
7710      ostiFreeMemory(
7711                     tiRoot,
7712                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7713                     sizeof(tdIORequestBody_t)
7714                     );
7715    }
7716#endif
7717    else
7718    {
7719      TI_DBG1(("ossaSMPAbortCB: other status %d\n", status));
7720      /* clean up TD layer's IORequestBody */
7721      TI_DBG1(("ossaSMPAbortCB: calling saDeregisterDeviceHandle\n"));
7722      saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
7723      TI_DBG1(("ossaSMPAbortCB: did %d\n", oneDeviceData->id));
7724      ostiFreeMemory(
7725                     tiRoot,
7726                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7727                     sizeof(tdIORequestBody_t)
7728                     );
7729    }
7730  }
7731  else if (flag == 0)
7732  {
7733    TI_DBG2(("ossaSMPAbortCB: abort one\n"));
7734    if (status == OSSA_IO_SUCCESS)
7735    {
7736      TI_DBG2(("ossaSMPAbortCB: OSSA_IO_SUCCESS\n"));
7737      ostiFreeMemory(
7738                     tiRoot,
7739                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7740                     sizeof(tdIORequestBody_t)
7741                     );
7742
7743    }
7744    else if (status == OSSA_IO_NOT_VALID)
7745    {
7746      TI_DBG1(("ossaSMPAbortCB: OSSA_IO_NOT_VALID\n"));
7747      ostiFreeMemory(
7748                     tiRoot,
7749                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7750                     sizeof(tdIORequestBody_t)
7751                     );
7752    }
7753    else if (status == OSSA_IO_NO_DEVICE)
7754    {
7755      TI_DBG1(("ossaSMPAbortCB: OSSA_IO_NO_DEVICE\n"));
7756      ostiFreeMemory(
7757                     tiRoot,
7758                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7759                     sizeof(tdIORequestBody_t)
7760                     );
7761    }
7762    else if (status == OSSA_IO_ABORT_IN_PROGRESS)
7763    {
7764      TI_DBG1(("ossaSMPAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n"));
7765      ostiFreeMemory(
7766                     tiRoot,
7767                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7768                     sizeof(tdIORequestBody_t)
7769                     );
7770    }
7771#ifdef REMOVED
7772    else if (status == OSSA_IO_ABORT_DELAYED)
7773    {
7774      TI_DBG1(("ossaSMPAbortCB: OSSA_IO_ABORT_DELAYED\n"));
7775      ostiFreeMemory(
7776                     tiRoot,
7777                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7778                     sizeof(tdIORequestBody_t)
7779                     );
7780    }
7781#endif
7782    else
7783    {
7784      TI_DBG1(("ossaSMPAbortCB: other status %d\n", status));
7785      ostiFreeMemory(
7786                     tiRoot,
7787                     tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
7788                     sizeof(tdIORequestBody_t)
7789                     );
7790    }
7791  }
7792  else
7793  {
7794    TI_DBG1(("ossaSMPAbortCB: wrong flag %d\n", flag));
7795  }
7796
7797
7798  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yu");
7799  return;
7800}
7801
7802/*****************************************************************************/
7803/*! \brief ossaGeneralEvent
7804 *
7805 *
7806 *  Purpose: This is the event notification for debugging purposes sent to
7807 *           inform the OS layer of some general error related to a specific
7808 *           inbound operation.
7809 *
7810 *  \param   agRoot:              Pointer to chip/driver Instance.
7811 *  \param   status:              Status associated with this event
7812 *  \param   msg:                 Pointer to controller specific command
7813 *                                massage that caused the error
7814 *
7815 *  \return None.
7816 *
7817 */
7818/*****************************************************************************/
7819GLOBAL void ossaGeneralEvent(
7820                             agsaRoot_t    *agRoot,
7821                             bit32         status,
7822                             agsaContext_t *agContext,
7823                             bit32         *msg)
7824{
7825  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
7826  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
7827
7828  TI_DBG1(("ossaGeneralEvent: start\n"));
7829  TI_DBG1(("ossaGeneralEvent: status %d\n", status));
7830
7831  if(msg)
7832  {
7833    TI_DBG1(("ossaGeneralEvent: *msg %X\n", *msg));
7834  }
7835
7836  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yv");
7837  ostiGenEventIOCTLRsp(tiRoot, status);
7838  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yv");
7839  return;
7840}
7841
7842GLOBAL void   ossaGetForensicDataCB (
7843        agsaRoot_t         *agRoot,
7844        agsaContext_t      *agContext,
7845        bit32              status,
7846        agsaForensicData_t *forensicData)
7847{
7848  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
7849  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
7850
7851  ostiGetForensicDataIOCTLRsp(tiRoot, status, forensicData);
7852  return;
7853}
7854
7855
7856#ifdef INITIATOR_DRIVER
7857
7858GLOBAL void ossaGetIOErrorStatsCB (
7859                      agsaRoot_t               *agRoot,
7860                      agsaContext_t            *agContext,
7861                      bit32                     status,
7862                      agsaIOErrorEventStats_t  *stats)
7863
7864{
7865  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
7866  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
7867
7868  ostiGetIoErrorStatsIOCTLRsp(tiRoot, status, stats);
7869}
7870#else
7871GLOBAL void ossaGetIOErrorStatsCB (
7872                      agsaRoot_t               *agRoot,
7873                      agsaContext_t            *agContext,
7874                      bit32                     status,
7875                      agsaIOErrorEventStats_t  *stats)
7876
7877{
7878
7879}
7880
7881#endif
7882
7883GLOBAL void ossaGetIOEventStatsCB (
7884                      agsaRoot_t               *agRoot,
7885                      agsaContext_t            *agContext,
7886                      bit32                     status,
7887                      agsaIOErrorEventStats_t  *stats)
7888
7889{
7890  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
7891  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
7892
7893  ostiGetIoEventStatsIOCTLRsp(tiRoot, status, stats);
7894}
7895
7896
7897/*****************************************************************************/
7898/*! \brief ossaGetRegisterDumpCB
7899 *
7900 *
7901 *  Purpose: ossaGetRegisterDumpCB() is the response callback function
7902 *           called by the LL Layer to indicate a response to
7903 *           saGetRegisterDump()
7904 *
7905 *  \param   agRoot:              Pointer to chip/driver Instance.
7906 *  \param   agContext:           Context of the operation originally
7907 *                                passed into saGetRegisterDump()
7908 *  \param   status:              status
7909 *
7910 *  \return None.
7911 *
7912 */
7913/*****************************************************************************/
7914GLOBAL void ossaGetRegisterDumpCB(
7915                                  agsaRoot_t    *agRoot,
7916                                  agsaContext_t *agContext,
7917                                  bit32         status
7918)
7919{
7920  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
7921  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
7922
7923  TI_DBG4(("ossaGetRegisterDumpCB: start\n"));
7924  TI_DBG4(("ossaGetRegisterDumpCB: status %d\n", status));
7925  smTraceFuncEnter(hpDBG_VERY_LOUD,"Yw");
7926
7927  ostiRegDumpIOCTLRsp(tiRoot, status);
7928  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "Yw");
7929  return;
7930}
7931
7932/*****************************************************************************/
7933/*! \brief ossaSetDeviceStateCB
7934 *
7935 *
7936 *  Purpose: ossaSetDeviceStateCB() is the response callback function
7937 *           called by the LL Layer to indicate a response to
7938 *           saSetDeviceState()
7939 *
7940 *  \param   agRoot:              Pointer to chip/driver Instance.
7941 *  \param   agContext:           Context of the operation originally
7942 *                                passed into saGetRegisterDump()
7943 *  \param   agDevHandle          Pointer to the device handle of the device
7944 *  \param   status:              status
7945 *  \param   newDeviceState:      newly set device status
7946 *  \param   previousDeviceState: old device status
7947 *
7948 *  \return None.
7949 *
7950 */
7951/*****************************************************************************/
7952GLOBAL void ossaSetDeviceStateCB(
7953                                 agsaRoot_t         *agRoot,
7954                                 agsaContext_t      *agContext,
7955                                 agsaDevHandle_t    *agDevHandle,
7956                                 bit32              status,
7957                                 bit32              newDeviceState,
7958                                 bit32              previousDeviceState
7959                                 )
7960{
7961  tdsaDeviceData_t            *oneDeviceData = agNULL;
7962
7963  TI_DBG2(("ossaSetDeviceStateCB: start\n"));
7964  TI_DBG2(("ossaSetDeviceStateCB: status %d\n", status));
7965  TI_DBG2(("ossaSetDeviceStateCB: newDeviceState %d\n", newDeviceState));
7966  TI_DBG2(("ossaSetDeviceStateCB: previousDeviceState %d\n", previousDeviceState));
7967
7968  if (agDevHandle == agNULL)
7969  {
7970    TI_DBG4(("ossaSetDeviceStateCB: agDevHandle is NULL\n"));
7971    return;
7972  }
7973
7974  oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
7975
7976  if (oneDeviceData == agNULL)
7977  {
7978    TI_DBG1(("ossaSetDeviceStateCB: wrong; oneDeviceData is NULL\n"));
7979  }
7980  else
7981  {
7982    TI_DBG2(("ossaSetDeviceStateCB: did %d\n", oneDeviceData->id));
7983  }
7984
7985  return;
7986}
7987
7988/*****************************************************************************/
7989/*! \brief ossaGetDeviceStateCB
7990 *
7991 *
7992 *  Purpose: ossaGetDeviceStateCB() is the response callback function
7993 *           called by the LL Layer to indicate a response to
7994 *           saGetDeviceState()
7995 *
7996 *  \param   agRoot:              Pointer to chip/driver Instance.
7997 *  \param   agContext:           Context of the operation originally
7998 *                                passed into saGetRegisterDump()
7999 *  \param   agDevHandle          Pointer to the device handle of the device
8000 *  \param   status:              status
8001 *  \param   deviceState:         device status
8002 *
8003 *  \return None.
8004 *
8005 */
8006/*****************************************************************************/
8007GLOBAL void ossaGetDeviceStateCB(
8008                                 agsaRoot_t         *agRoot,
8009                                 agsaContext_t      *agContext,
8010                                 agsaDevHandle_t    *agDevHandle,
8011                                 bit32              status,
8012                                 bit32              deviceState
8013                                 )
8014{
8015  TI_DBG4(("ossaGetDeviceStateCB: start\n"));
8016  TI_DBG4(("ossaGetDeviceStateCB: status %d\n", status));
8017  TI_DBG4(("ossaGetDeviceStateCB: deviceState %d\n", deviceState));
8018
8019  return;
8020}
8021
8022#ifdef INITIATOR_DRIVER
8023/*****************************************************************************/
8024/*! \brief ossaIniSetDeviceInfoCB
8025 *
8026 *
8027 *  Purpose: ossaIniSetDeviceInfoCB() is the response callback function
8028 *           called by the LL Layer to indicate a response to
8029 *           saSetDeviceInfo()
8030 *
8031 *  \param   agRoot:              Pointer to chip/driver Instance.
8032 *  \param   agContext:           Context of the operation originally
8033 *                                passed into saSetDeviceInfo()
8034 *  \param   agDevHandle          Pointer to the device handle of the device
8035 *  \param   status:              status
8036 *  \param   option:              option parameter passed in saSetDeviceInfo()
8037 *  \param   param:               param parameter passed in saSetDeviceInfo()
8038 *
8039 *  \return None.
8040 *
8041 */
8042/*****************************************************************************/
8043osGLOBAL void
8044ossaIniSetDeviceInfoCB(
8045                        agsaRoot_t        *agRoot,
8046                        agsaContext_t     *agContext,
8047                        agsaDevHandle_t   *agDevHandle,
8048                        bit32             status,
8049                        bit32             option,
8050                        bit32             param
8051                      )
8052{
8053  tdsaRootOsData_t       *osData = (tdsaRootOsData_t *)agRoot->osData;
8054  tiRoot_t               *tiRoot = (tiRoot_t *)osData->tiRoot;
8055  tdsaRoot_t             *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
8056  tdsaContext_t          *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8057  itdsaIni_t             *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
8058  bit32                  intContext = osData->IntContext;
8059  tdIORequestBody_t      *tdIORequestBody = agNULL;
8060  agsaIORequest_t        *agIORequest = agNULL;
8061  bit32                  saStatus = AGSA_RC_FAILURE;
8062  bit8                   devType_S_Rate;
8063  tdsaDeviceData_t       *oneDeviceData = agNULL;
8064
8065  TI_DBG4(("ossaIniSetDeviceInfoCB: start\n"));
8066  TI_DBG4(("ossaIniSetDeviceInfoCB: status 0x%x\n", status));
8067  TI_DBG4(("ossaIniSetDeviceInfoCB: option 0x%x\n", option));
8068  TI_DBG4(("ossaIniSetDeviceInfoCB: param 0x%x\n", param));
8069
8070  if (status != OSSA_SUCCESS)
8071  {
8072    TI_DBG1(("ossaIniSetDeviceInfoCB: status %d\n", status));
8073    TI_DBG1(("ossaIniSetDeviceInfoCB: option 0x%x\n", option));
8074    TI_DBG1(("ossaIniSetDeviceInfoCB: param 0x%x\n", param));
8075    if (option == 32) /* set connection rate */
8076    {
8077      TI_DBG1(("ossaIniSetDeviceInfoCB: IO failure\n"));
8078      agIORequest = (agsaIORequest_t *)agContext->osData;
8079      tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
8080      ostiInitiatorIOCompleted(
8081                               tiRoot,
8082                               tdIORequestBody->tiIORequest,
8083                               tiIOFailed,
8084                               tiDetailOtherError,
8085                               agNULL,
8086                               intContext
8087                               );
8088    }
8089  }
8090  if (agDevHandle == agNULL)
8091  {
8092    TI_DBG4(("ossaIniSetDeviceInfoCB: agDevHandle is NULL\n"));
8093    return;
8094  }
8095  oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
8096  if (oneDeviceData == agNULL)
8097  {
8098    TI_DBG1(("ossaIniSetDeviceInfoCB: wrong; oneDeviceData is NULL\n"));
8099    return;
8100  }
8101  else
8102  {
8103    TI_DBG4(("ossaIniSetDeviceInfoCB: did %d\n", oneDeviceData->id));
8104  }
8105
8106  /* retry IOs */
8107  if (option == 32) /* set connection rate */
8108  {
8109    TI_DBG1(("ossaIniSetDeviceInfoCB: set connection rate option\n"));
8110    agIORequest = (agsaIORequest_t *)agContext->osData;
8111    tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
8112    devType_S_Rate = oneDeviceData->agDeviceInfo.devType_S_Rate;
8113    devType_S_Rate = (devType_S_Rate & 0xF0) | (param >> 28);
8114    oneDeviceData->agDeviceInfo.devType_S_Rate =  devType_S_Rate;
8115    TI_DBG1(("ossaIniSetDeviceInfoCB: new rate is 0x%x\n", DEVINFO_GET_LINKRATE(&oneDeviceData->agDeviceInfo)));
8116    if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
8117        oneDeviceData->tdPortContext != agNULL )
8118    {
8119      saStatus = saSSPStart(agRoot,
8120                            agIORequest,
8121                            tdsaRotateQnumber(tiRoot, oneDeviceData),
8122                            agDevHandle,
8123                            tdIORequestBody->agRequestType,
8124                            &(tdIORequestBody->transport.SAS.agSASRequestBody),
8125                            agNULL,
8126                            &ossaSSPCompleted);
8127      if (saStatus == AGSA_RC_SUCCESS)
8128      {
8129        TI_DBG1(("ossaIniSetDeviceInfoCB: retried\n"));
8130        Initiator->NumIOsActive++;
8131        tdIORequestBody->ioStarted = agTRUE;
8132        tdIORequestBody->ioCompleted = agFALSE;
8133        return;
8134      }
8135      else
8136      {
8137        TI_DBG1(("ossaIniSetDeviceInfoCB: retry failed\n"));
8138        tdIORequestBody->ioStarted = agFALSE;
8139        tdIORequestBody->ioCompleted = agTRUE;
8140        ostiInitiatorIOCompleted(
8141                                 tiRoot,
8142                                 tdIORequestBody->tiIORequest,
8143                                 tiIOFailed,
8144                                 tiDetailOtherError,
8145                                 agNULL,
8146                                 intContext
8147                                 );
8148       }
8149    }
8150  }
8151  return;
8152}
8153#endif
8154/*****************************************************************************/
8155/*! \brief ossaSetDeviceInfoCB
8156 *
8157 *
8158 *  Purpose: ossaSetDeviceInfoCB() is the response callback function
8159 *           called by the LL Layer to indicate a response to
8160 *           saSetDeviceInfo()
8161 *
8162 *  \param   agRoot:              Pointer to chip/driver Instance.
8163 *  \param   agContext:           Context of the operation originally
8164 *                                passed into saSetDeviceInfo()
8165 *  \param   agDevHandle          Pointer to the device handle of the device
8166 *  \param   status:              status
8167 *  \param   option:              option parameter passed in saSetDeviceInfo()
8168 *  \param   param:               param parameter passed in saSetDeviceInfo()
8169 *
8170 *  \return None.
8171 *
8172 */
8173/*****************************************************************************/
8174GLOBAL void ossaSetDeviceInfoCB(
8175                                 agsaRoot_t         *agRoot,
8176                                 agsaContext_t      *agContext,
8177                                 agsaDevHandle_t    *agDevHandle,
8178                                 bit32              status,
8179                                 bit32              option,
8180                                 bit32              param
8181                                )
8182{
8183  tdsaDeviceData_t       *oneDeviceData = agNULL;
8184
8185  TI_DBG4(("ossaSetDeviceInfoCB: start\n"));
8186  TI_DBG4(("ossaSetDeviceInfoCB: status 0x%x\n", status));
8187  TI_DBG4(("ossaSetDeviceInfoCB: option 0x%x\n", option));
8188  TI_DBG4(("ossaSetDeviceInfoCB: param 0x%x\n", param));
8189
8190  if (status != OSSA_SUCCESS)
8191  {
8192    TI_DBG1(("ossaSetDeviceInfoCB: status %d\n", status));
8193    TI_DBG1(("ossaSetDeviceInfoCB: option 0x%x\n", option));
8194    TI_DBG1(("ossaSetDeviceInfoCB: param 0x%x\n", param));
8195  }
8196
8197  if (agDevHandle == agNULL)
8198  {
8199    TI_DBG4(("ossaSetDeviceInfoCB: agDevHandle is NULL\n"));
8200    return;
8201  }
8202
8203  oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
8204
8205  if (oneDeviceData == agNULL)
8206  {
8207    TI_DBG1(("ossaSetDeviceInfoCB: wrong; oneDeviceData is NULL\n"));
8208  }
8209  else
8210  {
8211    TI_DBG4(("ossaSetDeviceInfoCB: did %d\n", oneDeviceData->id));
8212  }
8213
8214  return;
8215}
8216
8217/*****************************************************************************/
8218/*! \brief ossaGetDFEDataCB
8219 *
8220 *
8221 *  Purpose: ossaGetDFEDataCB() is the response callback function
8222 *           called by the LL Layer to indicate a response to
8223 *           saGetDFEData()
8224 *
8225 *  \param   agRoot:              Pointer to chip/driver Instance.
8226 *  \param   agContext:           Context of the operation originally
8227 *                                passed into saGetDFEData()
8228 *  \param   status:              status
8229 *  \param   agInfoLen:           length in bytes of DFE data captured and transferred
8230 *
8231 *  \return None.
8232 *
8233 */
8234/*****************************************************************************/
8235GLOBAL void ossaGetDFEDataCB(
8236                             agsaRoot_t     *agRoot,
8237                             agsaContext_t  *agContext,
8238                             bit32   status,
8239                             bit32   agInfoLen)
8240{
8241  TI_DBG1(("ossaGetDFEDataCB: start\n"));
8242  TI_DBG1(("ossaGetDFEDataCB: status 0x%x agInfoLen 0x%x\n", status, agInfoLen));
8243  return;
8244}
8245
8246/*****************************************************************************/
8247/*! \brief ossaVhistCaptureCB
8248 *
8249 *
8250 *  Purpose: ossaVhistCaptureCB() is the response callback function
8251 *           called by the LL Layer to indicate a response to
8252 *           saGetDFEData()
8253 *
8254 *  \param   agRoot:              Pointer to chip/driver Instance.
8255 *  \param   agContext:           Context of the operation originally
8256 *                                passed into ()
8257 *  \param   status:              status
8258 *  \param   len:           length in bytes of Vis data captured and transferred
8259 *
8260 *  \return None.
8261 *
8262 */
8263/*****************************************************************************/
8264
8265void ossaVhistCaptureCB(
8266        agsaRoot_t    *agRoot,
8267        agsaContext_t *agContext,
8268        bit32         status,
8269        bit32         len)
8270{
8271  TI_DBG1(("ossaVhistCaptureCB: start\n"));
8272  TI_DBG1(("ossaVhistCaptureCB: status 0x%x agInfoLen 0x%x\n", status,len ));
8273  return;
8274}
8275
8276GLOBAL void ossaOperatorManagementCB(
8277                  agsaRoot_t    *agRoot,
8278                  agsaContext_t *agContext,
8279                  bit32          status,
8280                  bit32          eq
8281                  )
8282{
8283  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
8284  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
8285  tiEncryptPort_t      encryptEventData;
8286
8287  TI_DBG1(("ossaOperatorManagementCB: status 0x%x eq 0x%x\n", status, eq));
8288
8289  osti_memset(&encryptEventData, 0, sizeof(tiEncryptPort_t));
8290  encryptEventData.encryptEvent = tiEncryptOperatorManagement;
8291  encryptEventData.subEvent = eq;
8292  encryptEventData.pData = agNULL;
8293
8294  ostiPortEvent(tiRoot,
8295              tiEncryptOperation,
8296              status,
8297              &encryptEventData);
8298}
8299
8300GLOBAL void ossaEncryptSelftestExecuteCB (
8301                        agsaRoot_t    *agRoot,
8302                        agsaContext_t *agContext,
8303                        bit32          status,
8304                        bit32          type,
8305                        bit32          length,
8306                        void          *TestResult
8307                        )
8308{
8309  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
8310  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
8311  tiEncryptPort_t      encryptEventData;
8312
8313  TI_DBG1(("ossaEncryptSelftestExecuteCB: status 0x%x type 0x%x length 0x%x\n", status, type, length));
8314
8315  osti_memset(&encryptEventData, 0, sizeof(tiEncryptPort_t));
8316  encryptEventData.encryptEvent = tiEncryptSelfTest;
8317  encryptEventData.subEvent = type;
8318  encryptEventData.pData = (void*)TestResult;
8319
8320  ostiPortEvent(tiRoot,
8321              tiEncryptOperation,
8322              status,
8323              &encryptEventData);
8324}
8325
8326GLOBAL void ossaGetOperatorCB(
8327               agsaRoot_t    *agRoot,
8328               agsaContext_t *agContext,
8329               bit32          status,
8330               bit32          option,
8331               bit32          num,
8332               bit32          role,
8333               agsaID_t      *id
8334               )
8335{
8336
8337  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
8338  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
8339  tiEncryptPort_t      encryptEventData;
8340
8341  TI_DBG1(("ossaGetOperatorCB: status 0x%x option 0x%x num 0x%x role 0x%x\n",
8342                status, option, num, role));
8343  TI_DBG1(("ossaGetOperatorCB: agContext %p id %p\n",agContext,id));
8344  osti_memset(&encryptEventData, 0, sizeof(tiEncryptPort_t));
8345  encryptEventData.encryptEvent = tiEncryptGetOperator;
8346  encryptEventData.subEvent = option;
8347  encryptEventData.pData = agNULL;
8348
8349  switch(status)
8350  {
8351    case OSSA_IO_SUCCESS:
8352      TI_DBG1(("ossaGetOperatorCB: OSSA_IO_SUCCESS option 0x%x\n", option));
8353      if(option == 1)
8354      {
8355        TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[0], id->ID[1], id->ID[2], id->ID[3]));
8356        TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[4], id->ID[5], id->ID[6], id->ID[7]));
8357        TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[8], id->ID[9], id->ID[10],id->ID[11]));
8358        TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[12],id->ID[13],id->ID[14],id->ID[15]));
8359        TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[16],id->ID[17],id->ID[18],id->ID[19]));
8360        TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[20],id->ID[21],id->ID[22],id->ID[23]));
8361        TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x 0x%02x\n",id->ID[24],id->ID[25],id->ID[26],id->ID[27]));
8362        TI_DBG2(("ossaGetOperatorCB: 0x%02x 0x%02x 0x%02x\n",       id->ID[28],id->ID[29],id->ID[30]));
8363      }else if(option == 2)
8364      {
8365        TI_DBG1(("ossaGetOperatorCB: number operators 0x%02x\n", num ));
8366      }
8367
8368      encryptEventData.pData = id;
8369      break;
8370    case OSSA_MPI_ENC_ERR_UNSUPPORTED_OPTION:
8371      TI_DBG1(("ossaGetOperatorCB: OSSA_MPI_ENC_ERR_UNSUPPORTED_OPTION 0x%x\n",option));
8372      break;
8373    case OSSA_MPI_ENC_ERR_ID_TRANSFER_FAILURE:
8374      TI_DBG1(("ossaGetOperatorCB: OSSA_MPI_ENC_ERR_ID_TRANSFER_FAILURE 0x%x\n",option));
8375      break;
8376    default:
8377      TI_DBG1(("ossaGetOperatorCB: Unknown status 0x%x\n",status));
8378  }
8379  ostiPortEvent(tiRoot,
8380              tiEncryptOperation,
8381              status,
8382              &encryptEventData);
8383
8384}
8385
8386GLOBAL void ossaSetOperatorCB(
8387              agsaRoot_t    *agRoot,
8388              agsaContext_t *agContext,
8389              bit32          status,
8390              bit32          eq
8391              )
8392{
8393  tdsaRootOsData_t    *osData = (tdsaRootOsData_t *)agRoot->osData;
8394  tiRoot_t            *tiRoot = (tiRoot_t *)osData->tiRoot;
8395  tiEncryptPort_t      encryptEventData;
8396
8397  TI_DBG1(("ossaSetOperatorCB: agContext %p status 0x%x eq 0x%x\n",agContext, status, eq));
8398
8399  osti_memset(&encryptEventData, 0, sizeof(tiEncryptPort_t));
8400  encryptEventData.encryptEvent = tiEncryptSetOperator;
8401  encryptEventData.subEvent = 0;
8402  switch(status)
8403  {
8404    case OSSA_IO_SUCCESS:
8405      TI_DBG1(("ossaSetOperatorCB: OSSA_IO_SUCCESS\n"));
8406      encryptEventData.pData = agNULL;
8407      break;
8408    case OSSA_MPI_ENC_ERR_CONTROLLER_NOT_IDLE:
8409      TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_ERR_CONTROLLER_NOT_IDLE\n"));
8410      break;
8411    case OSSA_MPI_ENC_OPERATOR_AUTH_FAILURE:
8412      TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_OPERATOR_AUTH_FAILURE error qualifier 0x%x\n",eq));
8413      break;
8414    case OSSA_MPI_ENC_OPERATOR_OPERATOR_ALREADY_LOGGED_IN:
8415      TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_OPERATOR_OPERATOR_ALREADY_LOGGED_IN\n"));
8416      break;
8417    case OSSA_MPI_ENC_OPERATOR_ILLEGAL_PARAMETER:
8418      TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_OPERATOR_ILLEGAL_PARAMETER\n"));
8419      break;
8420    case OSSA_MPI_ENC_ERR_UNSUPPORTED_OPTION:
8421      TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_ERR_UNSUPPORTED_OPTION\n"));
8422      break;
8423    case OSSA_MPI_ENC_ERR_ID_TRANSFER_FAILURE:
8424      TI_DBG1(("ossaSetOperatorCB: OSSA_MPI_ENC_ERR_ID_TRANSFER_FAILURE\n"));
8425      break;
8426    default:
8427      TI_DBG1(("ossaGetOperatorCB: Unknown status 0x%x\n",status));
8428  }
8429  ostiPortEvent(tiRoot,
8430              tiEncryptOperation,
8431              status,
8432              &encryptEventData);
8433}
8434
8435GLOBAL void ossaDIFEncryptionOffloadStartCB(
8436                             agsaRoot_t     *agRoot,
8437                             agsaContext_t  *agContext,
8438                             bit32   status,
8439                             agsaOffloadDifDetails_t *agsaOffloadDifDetails)
8440{
8441  TI_DBG1(("ossaDIFEncryptionOffloadStartCB: start\n"));
8442  TI_DBG1(("ossaDIFEncryptionOffloadStartCB: status 0x%x agsaOffloadDifDetails=%p\n", status, agsaOffloadDifDetails));
8443  return;
8444}
8445
8446GLOBAL bit32 ossaTimeStamp( agsaRoot_t     *agRoot )
8447{
8448  tdsaRootOsData_t    *osData= agNULL;
8449  tiRoot_t            *tiRoot= agNULL;
8450  if(agRoot)
8451  {
8452    osData = (tdsaRootOsData_t *)agRoot->osData;
8453  }
8454  if(osData)
8455  {
8456    tiRoot = (tiRoot_t *)osData->tiRoot;
8457  }
8458  return(ostiTimeStamp(tiRoot));
8459}
8460
8461GLOBAL bit64 ossaTimeStamp64( agsaRoot_t     *agRoot)
8462{
8463  tdsaRootOsData_t    *osData= agNULL;
8464  tiRoot_t            *tiRoot= agNULL;
8465  if(agRoot)
8466  {
8467    osData = (tdsaRootOsData_t *)agRoot->osData;
8468  }
8469  if(osData)
8470  {
8471    tiRoot = (tiRoot_t *)osData->tiRoot;
8472  }
8473  return(ostiTimeStamp64(tiRoot));
8474}
8475
8476#ifdef FDS_SM
8477osGLOBAL void
8478tdIDStartTimer(tiRoot_t                 *tiRoot,
8479                  smIORequest_t            *smIORequest,
8480                  tdsaDeviceData_t         *oneDeviceData
8481                  )
8482{
8483  tdsaRoot_t                  *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
8484  tdsaContext_t               *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8485  itdsaIni_t                  *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
8486
8487  TI_DBG1(("tdIDStartTimer: start\n"));
8488
8489  tdsaSingleThreadedEnter(tiRoot, TD_TIMER_LOCK);
8490  if (oneDeviceData->tdIDTimer.timerRunning == agTRUE)
8491  {
8492    tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
8493    tdsaKillTimer(
8494                  tiRoot,
8495                  &oneDeviceData->tdIDTimer
8496                  );
8497  }
8498  else
8499  {
8500    tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
8501  }
8502
8503  tdsaSetTimerRequest(
8504                      tiRoot,
8505                      &oneDeviceData->tdIDTimer,
8506                      SATA_ID_DEVICE_DATA_TIMER_VALUE/Initiator->OperatingOption.UsecsPerTick,
8507                      tdIDStartTimerCB,
8508                      smIORequest,
8509                      oneDeviceData,
8510                      agNULL
8511                     );
8512
8513  tdsaAddTimer(
8514               tiRoot,
8515               &Initiator->timerlist,
8516               &oneDeviceData->tdIDTimer
8517              );
8518  TI_DBG1(("tdIDStartTimer: end\n"));
8519  return;
8520}
8521
8522osGLOBAL void
8523tdIDStartTimerCB(
8524                  tiRoot_t    * tiRoot,
8525                  void        * timerData1,
8526                  void        * timerData2,
8527                  void        * timerData3
8528                )
8529{
8530  tdsaRoot_t         *tdsaRoot      = (tdsaRoot_t *) tiRoot->tdData;
8531  tdsaContext_t      *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8532  smIORequest_t      *smIORequest;
8533  tdsaDeviceData_t   *oneDeviceData;
8534  smRoot_t           *smRoot;
8535  tdIORequestBody_t  *tdIORequestBody;
8536  smDeviceHandle_t   *smDeviceHandle;
8537  tdsaPortContext_t  *onePortContext;
8538#ifdef REMOVED
8539  agsaRoot_t         *agRoot;
8540  bit32               IDstatus;
8541//#endif
8542//#ifdef REMOVED
8543  agsaIORequest_t    *agAbortIORequest = agNULL;
8544  tdIORequestBody_t  *tdAbortIORequestBody = agNULL;
8545  bit32               PhysUpper32;
8546  bit32               PhysLower32;
8547  bit32               memAllocStatus;
8548  void               *osMemHandle;
8549#endif // REMOVED
8550#ifdef  TD_DEBUG_ENABLE
8551  bit32               status = AGSA_RC_FAILURE;
8552#endif
8553
8554  TI_DBG1(("tdIDStartTimerCB start\n"));
8555  smIORequest = (smIORequest_t *)timerData1;
8556  oneDeviceData = (tdsaDeviceData_t *)timerData2;
8557  smRoot = &(tdsaAllShared->smRoot);
8558#ifdef REMOVED
8559  agRoot = oneDeviceData->agRoot;
8560#endif // REMOVED
8561
8562  if (smIORequest == agNULL)
8563  {
8564    TI_DBG1(("tdIDStartTimerCB: smIORequest == agNULL !!!!!!\n"));
8565    return;
8566  }
8567
8568  if (oneDeviceData == agNULL)
8569  {
8570    TI_DBG1(("tdIDStartTimerCB: oneDeviceData == agNULL !!!!!!\n"));
8571    return;
8572  }
8573
8574  if (oneDeviceData->satDevData.IDPending == agFALSE || oneDeviceData->satDevData.IDDeviceValid == agTRUE)
8575  {
8576     /*the Identify Device command already normally completed, just return*/
8577     return;
8578  }
8579
8580  tdIORequestBody = (tdIORequestBody_t *)smIORequest->tdData;
8581  smDeviceHandle = (smDeviceHandle_t *)&(oneDeviceData->smDeviceHandle);
8582  onePortContext = oneDeviceData->tdPortContext;
8583  if (tdIORequestBody == agNULL)
8584  {
8585    TI_DBG1(("tdIDStartTimerCB: tdIORequestBody == agNULL !!!!!!\n"));
8586    return;
8587  }
8588
8589  if (smDeviceHandle == agNULL)
8590  {
8591    TI_DBG1(("tdIDStartTimerCB: smDeviceHandle == agNULL !!!!!!\n"));
8592    return;
8593  }
8594
8595  if (onePortContext == agNULL)
8596  {
8597    TI_DBG1(("tdIDStartTimerCB: onePortContext == agNULL !!!!!!\n"));
8598    return;
8599  }
8600
8601  TI_DBG1(("tdIDStartTimerCB: did %d\n", oneDeviceData->id));
8602  /*
8603   1. smIOabort()
8604   2. in tdsmIDCompletedCB(), retry
8605  */
8606  if (oneDeviceData->valid == agFALSE)
8607  {
8608    TI_DBG1(("tdIDStartTimerCB: invalid device\n"));
8609    return;
8610  }
8611#ifdef  TD_DEBUG_ENABLE
8612  status = smIOAbort( smRoot, smIORequest );
8613#else
8614  smIOAbort( smRoot, smIORequest );
8615#endif
8616
8617#ifdef REMOVED
8618  /* allocating agIORequest for abort itself */
8619  memAllocStatus = ostiAllocMemory(
8620                                   tiRoot,
8621                                   &osMemHandle,
8622                                   (void **)&tdAbortIORequestBody,
8623                                   &PhysUpper32,
8624                                   &PhysLower32,
8625                                   8,
8626                                   sizeof(tdIORequestBody_t),
8627                                   agTRUE
8628                                   );
8629  if (memAllocStatus != tiSuccess)
8630  {
8631    /* let os process IO */
8632    TI_DBG1(("tdIDStartTimerCB: ostiAllocMemory failed...; can't retry ID data \n"));
8633    return;
8634  }
8635  if (tdAbortIORequestBody == agNULL)
8636  {
8637    /* let os process IO */
8638    TI_DBG1(("tdIDStartTimerCB: ostiAllocMemory returned NULL tdAbortIORequestBody; can't retry ID data\n"));
8639    return;
8640  }
8641  /* setup task management structure */
8642  tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
8643  /* setting callback but not used later */
8644  tdAbortIORequestBody->IOCompletionFunc = agNULL;
8645  //tdAbortIORequestBody->IOCompletionFunc = itdssIOAbortedHandler;
8646  tdAbortIORequestBody->tiDevHandle = (tiDeviceHandle_t *)&(oneDeviceData->tiDeviceHandle);
8647  /* initialize agIORequest */
8648  agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
8649  agAbortIORequest->osData = (void *) tdAbortIORequestBody;
8650  agAbortIORequest->sdkData = agNULL; /* LL takes care of this */
8651//#endif
8652//#ifdef REMOVED
8653  status = saSATAAbort(agRoot,
8654                       agAbortIORequest,
8655                       0,
8656                       oneDeviceData->agDevHandle,
8657                       1, /* abort all */
8658                       agNULL,
8659                       ossaSATAIDAbortCB
8660                       );
8661  status = saSATAAbort(agRoot,
8662                       agAbortIORequest,
8663                       0,
8664                       oneDeviceData->agDevHandle,
8665                       0, /* abort one */
8666                       agIORequest,
8667                       ossaSATAIDAbortCB
8668                       );
8669//#endif
8670//#ifdef REMOVED
8671  if (status != AGSA_RC_SUCCESS)
8672  {
8673    TI_DBG1(("tdIDStartTimerCB: saSATAAbort failed; can't retry ID data\n"));
8674  }
8675  if (oneDeviceData->satDevData.IDDeviceValid == agTRUE)
8676  {
8677    TI_DBG1(("tdIDStartTimerCB: IDDeviceValid is valid, no need to retry\n"));
8678    return;
8679  }
8680  if (tdIORequestBody->reTries <= SM_RETRIES)
8681  {
8682    tdIORequestBody->tiIORequest = agNULL; /* not in use */
8683    tdIORequestBody->pid = onePortContext->id;
8684    smIORequest->tdData = tdIORequestBody;
8685    smIORequest->smData = &tdIORequestBody->smIORequestBody;
8686    smDeviceHandle->tdData = oneDeviceData;
8687    IDstatus = smIDStart(smRoot, smIORequest, smDeviceHandle );
8688    if (IDstatus == SM_RC_SUCCESS)
8689    {
8690      TI_DBG1(("tdIDStartTimerCB: being retried!!!\n"));
8691      tdIORequestBody->reTries++;
8692      tdIORequestBody->ioCompleted = agFALSE;
8693      tdIORequestBody->ioStarted = agTRUE;
8694      tdIDStartTimer(tiRoot, smIORequest, oneDeviceData);
8695    }
8696    else
8697    {
8698      /* identify device data is not valid */
8699      TI_DBG1(("tdIDStartTimerCB: smIDStart fail or busy %d!!!\n", IDstatus));
8700      tdIORequestBody->reTries = 0;
8701      tdIORequestBody->ioCompleted = agTRUE;
8702      tdIORequestBody->ioStarted = agFALSE;
8703      ostiFreeMemory( tiRoot,
8704                      tdIORequestBody->osMemHandle,
8705                      sizeof(tdIORequestBody_t)
8706                    );
8707      oneDeviceData->satDevData.IDDeviceValid = agFALSE;
8708      smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
8709      return;
8710    }
8711  }
8712  else
8713  {
8714    /* give up */
8715    TI_DBG1(("tdIDStartTimerCB: retries are over!!!\n"));
8716    if (oneDeviceData->tdIDTimer.timerRunning == agTRUE)
8717    {
8718      tdsaKillTimer( tiRoot, &oneDeviceData->tdIDTimer );
8719    }
8720    tdIORequestBody->reTries = 0;
8721    tdIORequestBody->ioCompleted = agTRUE;
8722    tdIORequestBody->ioStarted = agFALSE;
8723    ostiFreeMemory(
8724                   tiRoot,
8725                   tdIORequestBody->osMemHandle,
8726                   sizeof(tdIORequestBody_t)
8727            );
8728    oneDeviceData->satDevData.IDDeviceValid = agFALSE;
8729
8730    if (oneDeviceData->SMNumOfID <= 0) /* does SMP HARD RESET only upto one time */
8731    {
8732      TI_DBG1(("tdIDStartTimerCB: fail; sending HARD_RESET\n"));
8733      oneDeviceData->SMNumOfID++;
8734      if (oneDeviceData->directlyAttached == agTRUE)
8735      {
8736        saLocalPhyControl(agRoot, agNULL, 0, oneDeviceData->phyID, AGSA_PHY_HARD_RESET, agNULL);
8737      }
8738      else
8739      {
8740        tdsaPhyControlSend(tiRoot,
8741                           oneDeviceData,
8742                           SMP_PHY_CONTROL_HARD_RESET,
8743                           agNULL);
8744      }
8745    }
8746    else
8747    {
8748      /* given up after one time of SMP HARD RESET; */
8749      TI_DBG1(("tdIDStartTimerCB: fail; but giving up sending HARD_RESET!!!\n"));
8750      if (oneDeviceData->directlyAttached == agTRUE)
8751      {
8752        smReportRemovalDirect(tiRoot, agRoot, oneDeviceData);
8753      }
8754      else
8755      {
8756        smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
8757      }
8758    }
8759  }
8760#endif // REMOVED
8761
8762  TI_DBG1(("tdIDStartTimerCB: end, smIOAbort status %d\n", status));
8763  return;
8764}
8765#endif // FDS_SM
8766
8767
8768#if defined(FDS_DM) && defined(FDS_SM)
8769//start here
8770GLOBAL void
8771tdIDStart(
8772           tiRoot_t             *tiRoot,
8773           agsaRoot_t           *agRoot,
8774           smRoot_t             *smRoot,
8775           tdsaDeviceData_t     *oneDeviceData,
8776           tdsaPortContext_t    *onePortContext
8777          )
8778{
8779  tdsaRoot_t           *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
8780  tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
8781  bit32                SMstatus = SM_RC_FAILURE;
8782  tdIORequestBody_t    *tdIORequestBody;
8783  smIORequest_t        *smIORequest;
8784  smDeviceHandle_t     *smDeviceHandle;
8785  bit32                PhysUpper32;
8786  bit32                PhysLower32;
8787  bit32                memAllocStatus;
8788  void                 *osMemHandle;
8789
8790
8791  TI_DBG1(("tdIDStart: start, did %d\n",oneDeviceData->id));
8792
8793  if ( (DEVICE_IS_SATA_DEVICE(oneDeviceData)|| DEVICE_IS_STP_TARGET(oneDeviceData))
8794      &&
8795      oneDeviceData->satDevData.IDDeviceValid == agFALSE
8796      &&
8797      oneDeviceData->satDevData.IDPending == agFALSE
8798      )
8799  {
8800    TI_DBG2(("tdIDStart: in loop, did %d\n", oneDeviceData->id));
8801    /* allocating tdIORequestBody */
8802    memAllocStatus = ostiAllocMemory(
8803                                      tiRoot,
8804                                      &osMemHandle,
8805                                      (void **)&tdIORequestBody,
8806                                      &PhysUpper32,
8807                                      &PhysLower32,
8808                                      8,
8809                                      sizeof(tdIORequestBody_t),
8810                                      agTRUE
8811                                    );
8812    if (memAllocStatus != tiSuccess || tdIORequestBody == agNULL)
8813    {
8814      /* let os process IO */
8815      TI_DBG1(("tdIDStart: ostiAllocMemory failed... or ostiAllocMemory returned NULL tdIORequestBody!!!\n"));
8816      oneDeviceData->satDevData.IDDeviceValid = agFALSE;
8817      if (oneDeviceData->directlyAttached == agTRUE)
8818      {
8819        /* notifying link up */
8820        ostiPortEvent(
8821                       tiRoot,
8822                       tiPortLinkUp,
8823                       tiSuccess,
8824                       (void *)onePortContext->tiPortalContext
8825                     );
8826#ifdef INITIATOR_DRIVER
8827        /* triggers discovery */
8828        ostiPortEvent(
8829                       tiRoot,
8830                       tiPortDiscoveryReady,
8831                       tiSuccess,
8832                       (void *) onePortContext->tiPortalContext
8833                     );
8834#endif
8835      }
8836    }
8837    else
8838    {
8839      /* initialize */
8840      osti_memset(tdIORequestBody, 0, sizeof(tdIORequestBody_t));
8841
8842      tdIORequestBody->osMemHandle = osMemHandle;
8843      TI_DBG2(("tdIDStart: tdIORequestBody %p  tdIORequestBody->osMemHandle %p\n", tdIORequestBody, tdIORequestBody->osMemHandle));
8844
8845      /* not in use */
8846      tdIORequestBody->IOCompletionFunc = agNULL;
8847      tdIORequestBody->tiDevHandle = agNULL;
8848
8849      tdIORequestBody->tiIORequest = agNULL; /* not in use */
8850      tdIORequestBody->pid = onePortContext->id;
8851      tdIORequestBody->reTries = 0;
8852      smIORequest = (smIORequest_t *)&(tdIORequestBody->smIORequest);
8853      smIORequest->tdData = tdIORequestBody;
8854      smIORequest->smData = &tdIORequestBody->smIORequestBody;
8855
8856      smDeviceHandle = (smDeviceHandle_t *)&(oneDeviceData->smDeviceHandle);
8857      smDeviceHandle->tdData = oneDeviceData;
8858
8859      TI_DBG2(("tdIDStart: smIORequest %p\n", smIORequest));
8860
8861      SMstatus = smIDStart(smRoot,
8862                           smIORequest,
8863                           &(oneDeviceData->smDeviceHandle)
8864                           );
8865
8866      if (SMstatus == SM_RC_SUCCESS)
8867      {
8868        if (oneDeviceData->directlyAttached == agTRUE)
8869        {
8870          TI_DBG2(("tdIDStart: successfully sent identify device data\n"));
8871
8872          /* Add the devicedata to the mainlink */
8873          tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
8874          TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->MainLink), &(tdsaAllShared->MainDeviceList));
8875          tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
8876          TI_DBG6(("tdIDStart: one case did %d \n", oneDeviceData->id));
8877        }
8878        oneDeviceData->satDevData.IDPending = agTRUE;
8879        /* start a timer */
8880        tdIDStartTimer(tiRoot, smIORequest, oneDeviceData);
8881      }
8882      else
8883      {
8884        /* failed to send  */
8885        TI_DBG1(("tdIDStart: smIDStart fail or busy %d\n", SMstatus));
8886
8887        /* free up allocated memory */
8888        ostiFreeMemory(
8889                   tiRoot,
8890                   tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
8891                   sizeof(tdIORequestBody_t)
8892                   );
8893
8894        oneDeviceData->satDevData.IDDeviceValid = agFALSE;
8895        if (oneDeviceData->directlyAttached == agTRUE)
8896        {
8897          TI_DBG1(("tdIDStart: failed in sending identify device data\n"));
8898          /* put onedevicedata back to free list */
8899          tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK);
8900          TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList));
8901          tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK);
8902          /* notifying link up */
8903          ostiPortEvent(
8904                         tiRoot,
8905                         tiPortLinkUp,
8906                         tiSuccess,
8907                         (void *)onePortContext->tiPortalContext
8908                       );
8909#ifdef INITIATOR_DRIVER
8910          /* triggers discovery */
8911          ostiPortEvent(
8912                         tiRoot,
8913                         tiPortDiscoveryReady,
8914                         tiSuccess,
8915                         (void *) onePortContext->tiPortalContext
8916                       );
8917#endif
8918        }
8919        else
8920        {
8921          smReportRemoval(tiRoot, agRoot, oneDeviceData, onePortContext);
8922        }
8923      }
8924    }
8925  }
8926  TI_DBG1(("tdIDStart: exit\n"));
8927  return;
8928}
8929
8930#endif
8931
8932#ifdef SALLSDK_OS_IOMB_LOG_ENABLE
8933GLOBAL void ossaLogIomb(agsaRoot_t  *agRoot,
8934                        bit32        queueNum,
8935                        agBOOLEAN      isInbound,
8936                        void        *pMsg,
8937                        bit32        msgLength)
8938{
8939  return;
8940}
8941#endif /* SALLSDK_OS_IOMB_LOG_ENABLE */
8942
8943#ifndef SATA_ENABLE
8944/*
8945 * These callback routines are defined in ossasat.c which are included in the
8946 * compilation if SATA_ENABLED is defined.
8947 */
8948
8949/*****************************************************************************
8950*! \brief ossaDiscoverSataCB
8951*
8952*  Purpose:  This function is called by lower layer to inform TD layer of
8953*            STP/SATA discovery results
8954*
8955*
8956*  \param   agRoot         Pointer to chip/driver Instance.
8957*  \param   agPortContext  Pointer to the port context of TD and Lower layer
8958*  \param   event          event type
8959*  \param   pParm1         Pointer to data associated with event
8960*  \param   pParm2         Pointer to data associated with event
8961*
8962*  \return: none
8963*
8964*  \note -  For details, refer to SAS/SATA Low-Level API Specification
8965*
8966*****************************************************************************/
8967
8968osGLOBAL void ossaDiscoverSataCB( agsaRoot_t        *agRoot,
8969                    agsaPortContext_t *agPortContext,
8970                    bit32             event,
8971                    void              *pParm1,
8972                    void              *pParm2
8973                    )
8974{
8975  return;
8976}
8977
8978
8979/*****************************************************************************
8980*! \brief  ossaSATACompleted
8981*
8982*   This routine is called to complete a SATA request previously issued to the
8983*    LL Layer in saSATAStart()
8984*
8985*  \param   agRoot:      Handles for this instance of SAS/SATA hardware
8986*  \param   agIORequest: Pointer to the LL I/O request context for this I/O.
8987*  \param   agIOStatus:  Status of completed I/O.
8988*  \param   agFirstDword:Pointer to the four bytes of FIS.
8989*  \param   agIOInfoLen: Length in bytes of overrun/underrun residual or FIS
8990*                        length.
8991*  \param   agParam:     Additional info based on status.
8992*
8993*  \return: none
8994*
8995*****************************************************************************/
8996GLOBAL void ossaSATACompleted(
8997                  agsaRoot_t        *agRoot,
8998                  agsaIORequest_t   *agIORequest,
8999                  bit32             agIOStatus,
9000                  void              *agFirstDword,
9001                  bit32             agIOInfoLen,
9002                  void              *agParam
9003                  )
9004{
9005  return;
9006}
9007
9008
9009/*****************************************************************************
9010*! \brief  ossaSATAEvent
9011*
9012*   This routine is called to notify the OS Layer of an event associated with
9013*   SATA port or SATA device
9014*
9015*  \param   agRoot:        Handles for this instance of SAS/SATA hardware
9016*  \param   agIORequest:   Pointer to the LL I/O request context for this I/O.
9017*  \param   agPortContext  Pointer to the port context of TD and Lower layer
9018*  \param   agDevHandle:   Pointer to a device handle
9019*  \param   event:         event type
9020*
9021*  \return: none
9022*
9023*****************************************************************************/
9024osGLOBAL void ossaSATAEvent(
9025                        agsaRoot_t        *agRoot,
9026                        agsaIORequest_t   *agIORequest,
9027                        agsaPortContext_t *agPortContext,
9028                        agsaDevHandle_t   *agDevHandle,
9029                        bit32             event,
9030                        bit32             agIOInfoLen,
9031                        void              *agParam
9032                        )
9033{
9034  return;
9035}
9036
9037
9038/*****************************************************************************
9039*! \brief  ossaSATADeviceResetCB
9040*
9041*   This routine is called to complete a SATA device reset request previously
9042*   issued to the LL Layer in saSATADeviceReset().
9043*
9044*  \param agRoot:      Handles for this instance of SAS/SATA hardware
9045*  \param agDevHandle: Pointer to a device handle
9046*  \param resetStatus: Reset status:
9047*                      OSSA_SUCCESS: The reset operation completed successfully.
9048*                      OSSA_FAILURE: The reset operation failed.
9049*  \param resetparm:  Pointer to the Device-To-Host FIS received from the device.
9050*
9051*  \return: none
9052*
9053*****************************************************************************/
9054osGLOBAL void ossaSATADeviceResetCB(
9055                      agsaRoot_t        *agRoot,
9056                      agsaDevHandle_t   *agDevHandle,
9057                      bit32             resetStatus,
9058                      void              *resetparm)
9059{
9060
9061  return;
9062
9063}
9064
9065/*****************************************************************************
9066*! \brief ossaDiscoverSasCB
9067*
9068*  Purpose:  This function is called by lower layer to inform TD layer of
9069*            SAS discovery results
9070*
9071*
9072*  \param   agRoot         Pointer to chip/driver Instance.
9073*  \param   agPortContext  Pointer to the port context of TD and Lower layer
9074*  \param   event          event type
9075*  \param   pParm1         Pointer to data associated with event
9076*  \param   pParm2         Pointer to data associated with event
9077*
9078*  \return: none
9079*
9080*  \note -  For details, refer to SAS/SATA Low-Level API Specification
9081*
9082*****************************************************************************/
9083osGLOBAL void ossaDiscoverSasCB(agsaRoot_t        *agRoot,
9084                  agsaPortContext_t *agPortContext,
9085                  bit32             event,
9086                  void              *pParm1,
9087                  void              *pParm2
9088                  )
9089{
9090  return;
9091}
9092#endif
9093
9094