xref: /freebsd/sys/dev/pms/RefTisa/tisa/sassata/common/tdioctl.c (revision 02e9120893770924227138ba49df1edb3896112a)
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  * This file contains Management IOCTL APIs
27  *
28  */
29 #include <sys/cdefs.h>
30 #include <dev/pms/config.h>
31 
32 #include <dev/pms/freebsd/driver/common/osenv.h>
33 #include <dev/pms/freebsd/driver/common/ostypes.h>
34 #include <dev/pms/freebsd/driver/common/osdebug.h>
35 
36 #include <dev/pms/RefTisa/sallsdk/api/sa.h>
37 #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
38 #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
39 
40 #include <dev/pms/RefTisa/tisa/api/titypes.h>
41 #include <dev/pms/RefTisa/tisa/api/ostiapi.h>
42 #include <dev/pms/RefTisa/tisa/api/tiapi.h>
43 #include <dev/pms/RefTisa/tisa/api/tiglobal.h>
44 
45 #ifdef FDS_SM
46 #include <dev/pms/RefTisa/sat/api/sm.h>
47 #include <dev/pms/RefTisa/sat/api/smapi.h>
48 #include <dev/pms/RefTisa/sat/api/tdsmapi.h>
49 #endif
50 
51 #ifdef FDS_DM
52 #include <dev/pms/RefTisa/discovery/api/dm.h>
53 #include <dev/pms/RefTisa/discovery/api/dmapi.h>
54 #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
55 #endif
56 
57 #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
58 #include <dev/pms/freebsd/driver/common/osstring.h>
59 #include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
60 #include <dev/pms/RefTisa/sallsdk/spc/mpidebug.h>
61 
62 #ifdef INITIATOR_DRIVER
63 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
64 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
65 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
66 #endif
67 
68 #ifdef TARGET_DRIVER
69 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
70 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
71 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
72 #endif
73 
74 #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
75 #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
76 #include <dev/pms/RefTisa/tisa/sassata/common/tdioctl.h>
77 
78 #include <dev/pms/RefTisa/sallsdk/spc/sadefs.h>
79 #include <dev/pms/RefTisa/sallsdk/spc/spcdefs.h>
80 #include <dev/pms/RefTisa/sallsdk/spc/mpi.h>
81 #include <dev/pms/RefTisa/sallsdk/spc/sallist.h>
82 #include <dev/pms/RefTisa/sallsdk/spc/satypes.h>
83 
84 
85 #define agFieldOffset(baseType,fieldName) \
86             /*lint -e545 */ \
87             ((bit32)((bitptr)(&(((baseType *)0)->fieldName)))) \
88 
89 #ifdef SA_LL_API_TEST
90 osGLOBAL bit32 tdLlApiTestIoctl(tiRoot_t *tiRoot,
91                                 tiIOCTLPayload_t *agIOCTLPayload,
92                                 void *agParam1,
93                                 void *agParam2,
94                                 void *agParam3);
95 #endif /* SA_LL_API_TEST */
96 
97 
98 extern bit32 volatile sgpioResponseSet;
99 
100 #ifdef SPC_ENABLE_PROFILE
101 /*****************************************************************************
102 *
103 * tdipFWProfileIoctl
104 *
105 * Purpose:  This routine is called to process the FW Profile IOCTL function.
106 *           This function is used for both target and initiator.
107 *
108 * Parameters:
109 *   tiRoot:         Pointer to driver instance
110 *   agIOCTLPayload: Pointer to the IOCTL payload.
111 *   agParam1:       Pointer to pass context handle for IOCTL DMA operation
112 *   agParam2:       Pointer to pass context handle for IOCTL DMA operation
113 *   agParam3:       Pointer to pass context handle for IOCTL DMA operation
114 *
115 * Return:
116 *
117 *   IOCTL_CALL_SUCCESS        The requested operation completed successfully.
118 *   IOCTL_CALL_FAIL           Fail to complete the IOCTL request.
119 *                             Detail error code is function specific and
120 *                             defined by the specific IOCTL function.
121 *   IOCTL_CALL_INVALID_CODE   This IOCTL function is not recognized.
122 *
123 *
124 *****************************************************************************/
125 osGLOBAL bit32 tdipFWProfileIoctl(
126                         tiRoot_t            *tiRoot,
127                         tiIOCTLPayload_t    *agIOCTLPayload,
128                         void                *agParam1,
129                         void                *agParam2,
130                         void                *agParam3
131                         )
132 {
133 
134   bit32                status = IOCTL_CALL_SUCCESS;
135   bit32                bufAddrUpper = 0;
136   bit32                bufAddrLower = 0;
137   tdFWProfile_t        *fwProfile;
138 
139   void                 *osMemHandle = agNULL;
140   void                 *buffer = agNULL;
141   agsaFwProfile_t     fwProfileInfo = {0};
142 
143   tdsaRoot_t           *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
144   tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
145   agsaRoot_t           *agRoot = &tdsaAllShared->agRootInt;
146 
147   fwProfile = (tdFWProfile_t *)&agIOCTLPayload->FunctionSpecificArea[0];
148 
149 
150   fwProfileInfo.processor = fwProfile->processor;
151   fwProfileInfo.cmd = fwProfile->cmd;
152   fwProfileInfo.len = fwProfile->len;
153   fwProfileInfo.tcid = fwProfile->tcid;
154   if(fwProfile->cmd == START_CODE_PROFILE)
155   {
156     fwProfileInfo.codeStartAdd = fwProfile->codeStartAdd;
157       fwProfileInfo.codeEndAdd = fwProfile->codeEndAdd;
158   }
159   if((fwProfile->cmd == STOP_TIMER_PROFILE) || (fwProfile->cmd == STOP_CODE_PROFILE))
160   {
161     if(fwProfile->len != 0)
162     {
163       if(ostiAllocMemory( tiRoot,
164               &osMemHandle,
165               (void **)&buffer,
166               &bufAddrUpper,
167               &bufAddrLower,
168               8,
169               fwProfile->len,
170               agFALSE))
171         {
172           return IOCTL_CALL_FAIL;
173         }
174       osti_memset((void *)buffer, 0, fwProfile->len);
175     }
176     fwProfileInfo.agSgl.sgLower = bufAddrLower;
177     fwProfileInfo.agSgl.sgUpper = bufAddrUpper;
178     fwProfileInfo.agSgl.len = fwProfile->len;
179     fwProfileInfo.agSgl.extReserved = 0;
180     tdsaAllShared->tdFWProfileEx.buffer = osMemHandle;
181     tdsaAllShared->tdFWProfileEx.virtAddr = buffer;
182     tdsaAllShared->tdFWProfileEx.len = fwProfile->len;
183   }
184   tdsaAllShared->tdFWProfileEx.tdFWProfile = fwProfile;
185   tdsaAllShared->tdFWProfileEx.param1 = agParam1;
186   tdsaAllShared->tdFWProfileEx.param2 = agParam2;
187   tdsaAllShared->tdFWProfileEx.payload = agIOCTLPayload;
188   tdsaAllShared->tdFWProfileEx.inProgress = 1;
189   status = saFwProfile(agRoot,
190             agNULL,
191             0,
192             &fwProfileInfo
193             );
194   if(status)
195   {
196     if((fwProfile->cmd == STOP_TIMER_PROFILE) || (fwProfile->cmd == STOP_CODE_PROFILE))
197       ostiFreeMemory(tiRoot, osMemHandle, fwProfile->len);
198     status = IOCTL_CALL_FAIL;
199   }
200   else
201     status = IOCTL_CALL_PENDING;
202   return status;
203 }
204 
205 
206 #endif
207 
208 /*****************************************************************************
209 *
210 * tdipFWControlIoctl
211 *
212 * Purpose:  This routine is called to process the FW control IOCTL function.
213 *           This function is used for both target and initiator.
214 *
215 * Parameters:
216 *   tiRoot:         Pointer to driver instance
217 *   agIOCTLPayload: Pointer to the IOCTL payload.
218 *   agParam1:       Pointer to pass context handle for IOCTL DMA operation
219 *   agParam2:       Pointer to pass context handle for IOCTL DMA operation
220 *   agParam3:       Pointer to pass context handle for IOCTL DMA operation
221 *
222 * Return:
223 *
224 *   IOCTL_CALL_SUCCESS        The requested operation completed successfully.
225 *   IOCTL_CALL_FAIL           Fail to complete the IOCTL request.
226 *                             Detail error code is function specific and
227 *                             defined by the specific IOCTL function.
228 *   IOCTL_CALL_PENDING        This request is asynchronous and completed
229 *                             in some other context.
230 *   IOCTL_CALL_INVALID_CODE   This IOCTL function is not recognized.
231 *
232 *
233 *****************************************************************************/
234 osGLOBAL bit32 tdipFWControlIoctl(
235   tiRoot_t            *tiRoot,
236   tiIOCTLPayload_t    *agIOCTLPayload,
237   void                *agParam1,
238   void                *agParam2,
239   void                *agParam3
240   ) {
241 
242   bit32               status = IOCTL_CALL_PENDING;
243   bit32               bufAddrUpper = 0;
244   bit32               bufAddrLower = 0;
245   tdFWControl_t      *fwControl;
246   void               *osMemHandle = agNULL;
247   void               *buffer = agNULL;
248   agsaUpdateFwFlash_t flashUpdateInfo;
249   tdsaRoot_t         *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
250   tdsaContext_t      *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
251   agsaRoot_t         *agRoot = &tdsaAllShared->agRootInt;
252 
253   if( agIOCTLPayload->Length <
254       ( agFieldOffset(tiIOCTLPayload_t, FunctionSpecificArea) +
255         sizeof(tdFWControl_t) ) )  {
256     agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
257     status = IOCTL_CALL_FAIL;
258     return status;
259   }
260   fwControl = (tdFWControl_t *)&agIOCTLPayload->FunctionSpecificArea[0];
261 
262   if(fwControl->len != 0)
263   {
264     if(ostiAllocMemory( tiRoot,
265                         &osMemHandle,
266                         (void **)&buffer,
267                         &bufAddrUpper,
268                         &bufAddrLower,
269                         8,
270                         fwControl->len,
271                         agFALSE) )
272       return IOCTL_CALL_FAIL;
273   }
274   osti_memset( (void *)buffer, 0, fwControl->len );
275   osti_memcpy( (void *)buffer,
276                fwControl->buffer,
277                fwControl->len );
278   flashUpdateInfo.agSgl.sgLower = bufAddrLower;
279   flashUpdateInfo.agSgl.sgUpper = bufAddrUpper;
280   flashUpdateInfo.agSgl.len     = fwControl->len;
281   flashUpdateInfo.agSgl.extReserved  = 0;
282   flashUpdateInfo.currentImageOffset = fwControl->offset;
283   flashUpdateInfo.currentImageLen    = fwControl->len;
284   flashUpdateInfo.totalImageLen      = fwControl->size;
285   switch (agIOCTLPayload->MinorFunction)
286   {
287     case IOCTL_MN_FW_DOWNLOAD_DATA:
288     {
289       TI_DBG6(("tdipFWControlIoctl: calling saFwFlashUpdate\n"));
290       tdsaAllShared->tdFWControlEx.tdFWControl = fwControl;
291       tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
292       tdsaAllShared->tdFWControlEx.param1 = agParam1;
293       tdsaAllShared->tdFWControlEx.param2 = agParam2;
294       tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
295       tdsaAllShared->tdFWControlEx.inProgress = 1;
296       status = saFwFlashUpdate( agRoot,
297                                 agNULL,
298                                 0,
299                                 &flashUpdateInfo );
300       if(status) {
301         status = IOCTL_CALL_FAIL;
302         fwControl->retcode = IOCTL_CALL_TIMEOUT;
303       }
304       else {
305         status = IOCTL_CALL_PENDING;
306       }
307       break;
308     }
309     default:
310       status = IOCTL_CALL_INVALID_CODE;
311       TI_DBG1( ("tdipFWControlIoctl: ERROR: Wrong IOCTL code %d\n",
312                 agIOCTLPayload->MinorFunction) );
313       ostiFreeMemory(tiRoot, osMemHandle, fwControl->len);
314       return status;
315   } /* end IOCTL switch */
316   return status;
317 } /* tdipFWControlIoctl */
318 
319 
320 /*****************************************************************************
321 *
322 * tiCOMMgntIOCTL
323 *
324 * Purpose:  This routine is a TISA API for processing the PMC specific
325 *           IOCTL function.
326 *
327 *           Each IOCTL function is identified by the IOCTL header
328 *           specified in the data payload as the following:
329 *           Field                 Description
330 *           -----                 -----------
331 *           Signature             PMC IOCTL signature.
332 *                                 #define PMC_IOCTL_SIGNATURE   0x1234
333 *           MajorFunction         Major function number.
334 *           MinorFunction         Minor function number.
335 *           Length                Length of this structure in bytes.
336 *           Status                Return status for this IOCTL function.
337 *           FunctionSpecificArea  Variable length function specific area.
338 *
339 * Parameters:
340 *   tiRoot:         Pointer to driver instance
341 *   agIOCTLPayload: Pointer to the IOCTL payload.
342 *   agParam1:       Pointer to pass context handle for IOCTL DMA operation
343 *   agParam2:       Pointer to pass context handle for IOCTL DMA operation
344 *   agParam3:       Pointer to pass context handle for IOCTL DMA operation
345 *
346 * Return:
347 *
348 *   IOCTL_CALL_SUCCESS        The requested operation completed successfully.
349 *   IOCTL_CALL_FAIL           Fail to complete the IOCTL request.
350 *                             Detail error code is function specific and
351 *                             defined by the specific IOCTL function.
352 *   IOCTL_CALL_PENDING        This request is asynchronous and completed
353 *                             in some other context.
354 *   IOCTL_CALL_INVALID_CODE   This IOCTL function is not recognized.
355 *   IOCTL_CALL_INVALID_DEVICE Invalid target or destination device.
356 *
357 * Note:
358 *  Used ostiAllocMemory() OS layer callback function to allocate memory
359 *  for DMA operaion. Then use ostiFreeMemory() to deallocate the memory.
360 *
361 *****************************************************************************/
362 osGLOBAL bit32
363 tiCOMMgntIOCTL(
364                tiRoot_t            *tiRoot,
365                tiIOCTLPayload_t    *agIOCTLPayload,
366                void                *agParam1,
367                void                *agParam2,
368                void                *agParam3
369                )
370 {
371   bit32                     status = IOCTL_CALL_INVALID_CODE;
372   tdsaRoot_t                *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
373   tdsaContext_t             *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
374   agsaRoot_t                *agRoot = &(tdsaAllShared->agRootNonInt);
375   bit32                     EventLogLength = 0;
376   bit32                     EventLogOption;
377   bit32                     ReadLength = 0;
378   bit32                     Offset = 0;
379   bit32                     RequestLength = 0;  /* user request on how much data to pass to application */
380   agsaContext_t		    *agContext = NULL;
381   bit8                      *loc = NULL;
382 
383   TI_DBG3(("tiCOMMgntIOCTL: start\n"));
384 
385   TI_DBG3(("tiCOMMgntIOCTL: tiRoot %p agIOCTLPayload %p agParam1 %p agParam2 %p agParam3 %p\n",
386                             tiRoot,agIOCTLPayload,agParam1,agParam2,agParam3 ));
387 
388   TI_DBG3(("tiCOMMgntIOCTL: Signature %X\ntiCOMMgntIOCTL: MajorFunction 0x%X\ntiCOMMgntIOCTL: MinorFunction 0x%X\ntiCOMMgntIOCTL: Length 0x%X\ntiCOMMgntIOCTL: Status 0x%X\ntiCOMMgntIOCTL: Reserved 0x%X\ntiCOMMgntIOCTL: FunctionSpecificArea 0x%X\n",
389                            agIOCTLPayload->Signature,
390                            agIOCTLPayload->MajorFunction,
391                            agIOCTLPayload->MinorFunction,
392                            agIOCTLPayload->Length,
393                            agIOCTLPayload->Status,
394                            agIOCTLPayload->Reserved,
395                            agIOCTLPayload->FunctionSpecificArea[0] ));
396 
397   /* PMC IOCTL signatures matched ? */
398   if(agIOCTLPayload->Signature != PMC_IOCTL_SIGNATURE)
399   {
400     TI_DBG1(("tiCOMMgntIOCTL:agIOCTLPayload->Signature %x IOCTL_CALL_INVALID_CODE\n",agIOCTLPayload->Signature ));
401     status = IOCTL_CALL_INVALID_CODE;
402     return (status);
403   }
404 
405   switch (agIOCTLPayload->MajorFunction)
406   {
407 //TODO: make the card identification more robust. For now - just to keep going with FW download
408 #ifdef IOCTL_INTERRUPT_TIME_CONFIG
409   case IOCTL_MJ_CARD_PARAMETER:
410   {
411     switch( agIOCTLPayload->MinorFunction )
412     {
413       case  IOCTL_MN_CARD_GET_INTERRUPT_CONFIG:
414       {
415           agsaInterruptConfigPage_t *pInterruptConfig = (agsaInterruptConfigPage_t *)&agIOCTLPayload->FunctionSpecificArea[0];
416           status = saGetControllerConfig(agRoot,
417                                 0,
418                                 AGSA_INTERRUPT_CONFIGURATION_PAGE,
419                                 pInterruptConfig->vectorMask0,
420                                 pInterruptConfig->vectorMask1,
421                                 agParam2);
422           if(status == AGSA_RC_SUCCESS) {
423               status = IOCTL_CALL_PENDING;
424               agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
425           } else {
426               agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
427           }
428           break;
429       }
430       case  IOCTL_MN_CARD_GET_TIMER_CONFIG:
431           status = saGetControllerConfig(agRoot, 0, AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE, 0, 0, agParam2);
432           if(status == AGSA_RC_SUCCESS) {
433               status = IOCTL_CALL_PENDING;
434               agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
435           } else {
436               agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
437           }
438           break;
439     }
440     break;
441   }
442 #endif /* IOCTL_INTERRUPT_TIME_CONFIG */
443   case IOCTL_MJ_INI_DRIVER_IDENTIFY:
444   {
445     status=IOCTL_CALL_SUCCESS;
446     break;
447   }
448   case IOCTL_MJ_GET_DEVICE_LUN:
449 		status = tdsaGetNumOfLUNIOCTL(tiRoot,agIOCTLPayload, agParam1, agParam2, agParam3);
450     	if(status == IOCTL_CALL_SUCCESS)
451         {
452     	  status = IOCTL_CALL_PENDING;
453     	}
454    break;
455 case IOCTL_MJ_SMP_REQUEST:
456 	status = tdsaSendSMPIoctl(tiRoot, agIOCTLPayload,
457              	agParam1,agParam2,agParam3);
458 	break;
459 
460   case IOCTL_MJ_FW_CONTROL:
461   {
462     //ostiIOCTLClearSignal (tiRoot, &agParam1, &agParam2, &agParam3);
463     status = tdipFWControlIoctl( tiRoot, agIOCTLPayload,
464                                    agParam1, agParam2, agParam3);
465 
466     break;
467   }
468 //#ifdef EVENT_LOG_INFO_TESTING
469   /* Reserved field in tiIOCTLPayload_t is used as offset */
470   case IOCTL_MJ_GET_EVENT_LOG1:
471   {
472     switch (agIOCTLPayload->MinorFunction)
473     {
474       case IOCTL_MN_FW_GET_TRACE_BUFFER:
475       {
476         agsaControllerEventLog_t EventLog;
477         saGetControllerEventLogInfo(agRoot, &EventLog);
478         TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_GET_EVENT_LOG1 Length %d\n", agIOCTLPayload->Length));
479         RequestLength = agIOCTLPayload->Length;
480         Offset = agIOCTLPayload->Reserved;
481         EventLogLength = EventLog.eventLog1.totalLength;
482         EventLogOption = EventLog.eventLog1Option;
483         if (EventLogLength <= Offset)
484         {
485           TI_DBG1(("tiCOMMgntIOCTL: 1 out of range Requestlength %d Offset %d event log length %d\n", RequestLength, Offset, EventLogLength));
486           // out of range
487           agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
488           agIOCTLPayload->Length = 0;
489           if(EventLogOption == 0)
490           {
491             agIOCTLPayload->Status = IOCTL_ERR_FW_EVENTLOG_DISABLED;
492           }
493           status=IOCTL_CALL_SUCCESS;
494           return status;
495          }
496         ReadLength = MIN(EventLogLength - Offset, RequestLength);
497         loc = (bit8 *)EventLog.eventLog1.virtPtr + Offset;
498         osti_memcpy(&(agIOCTLPayload->FunctionSpecificArea), loc, ReadLength);
499       //   tdhexdump("IOCTL_MJ_GET_EVENT_LOG1 first 32bytes", (bit8 *)&(agIOCTLPayload->FunctionSpecificArea), 32);
500         agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
501         agIOCTLPayload->Length = (bit16)ReadLength;
502         status=IOCTL_CALL_SUCCESS;
503         break;
504      }
505      case IOCTL_MN_FW_GET_EVENT_FLASH_LOG1:
506      {
507        TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MN_FW_GET_EVENT_FLASH_LOG1\n"));
508        status = tdsaRegDumpGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
509        break;
510      }
511    }
512    break;
513   }
514 
515   case IOCTL_MJ_GET_EVENT_LOG2:
516   {
517     switch (agIOCTLPayload->MinorFunction)
518     {
519       case IOCTL_MN_FW_GET_TRACE_BUFFER:
520       {
521         agsaControllerEventLog_t EventLog;
522         saGetControllerEventLogInfo(agRoot, &EventLog);
523         TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_GET_EVENT_LOG2 Length %d\n", agIOCTLPayload->Length));
524         RequestLength = agIOCTLPayload->Length;
525         Offset = agIOCTLPayload->Reserved;
526         EventLogLength = EventLog.eventLog2.totalLength;
527         EventLogOption = EventLog.eventLog2Option;
528         if (EventLogLength <= Offset)
529         {
530           TI_DBG1(("tiCOMMgntIOCTL: 2 out of range Requestlength %d Offset %d event log length %d\n", RequestLength, Offset, EventLogLength));
531           /* out of range */
532           agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
533           agIOCTLPayload->Length = 0;
534           if(EventLogOption == 0)
535           {
536             agIOCTLPayload->Status = IOCTL_ERR_FW_EVENTLOG_DISABLED;
537           }
538           status=IOCTL_CALL_SUCCESS;
539           return status;
540         }
541         ReadLength = MIN(EventLogLength - Offset, RequestLength);
542         loc = (bit8 *)EventLog.eventLog2.virtPtr + Offset;
543         osti_memcpy(&(agIOCTLPayload->FunctionSpecificArea), loc, ReadLength);
544     //    tdhexdump("IOCTL_MJ_GET_EVENT_LOG2 first 32bytes", (bit8 *)&(agIOCTLPayload->FunctionSpecificArea), 32);
545         agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
546         agIOCTLPayload->Length = (bit16)ReadLength;
547         status=IOCTL_CALL_SUCCESS;
548         break;
549       }
550       case IOCTL_MN_FW_GET_EVENT_FLASH_LOG2:
551       {
552         TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MN_FW_GET_EVENT_FLASH_LOG2\n"));
553         status = tdsaRegDumpGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
554         break;
555       }
556     }
557     break;
558   }
559 
560 
561   case IOCTL_MJ_FW_INFO:
562   {
563     agsaControllerInfo_t ControllerInfo;
564     saGetControllerInfo(agRoot, &ControllerInfo);
565     TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_FW_INFO Length %d\n", agIOCTLPayload->Length));
566     RequestLength = agIOCTLPayload->Length;
567     Offset = agIOCTLPayload->Reserved;
568     if (RequestLength == 0)
569     {
570       TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_FW_INFO: No more Data!\n"));
571       /* out of range */
572       agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
573       agIOCTLPayload->Length = 0;
574       status=IOCTL_CALL_SUCCESS;
575       return status;
576     }
577 
578     osti_memcpy((bit8*)&(agIOCTLPayload->FunctionSpecificArea), (bit8*)&ControllerInfo, sizeof(agsaControllerInfo_t));
579 
580     TI_DBG1(("tiCOMMgntIOCTL:IOCTL_MJ_FW_INFO ControllerInfo signature 0x%X\n",ControllerInfo.signature));
581     TI_DBG1(("tiCOMMgntIOCTL:IOCTL_MJ_FW_INFO ControllerInfo PCILinkRate 0x%X\n",ControllerInfo.PCILinkRate));
582     TI_DBG1(("tiCOMMgntIOCTL:IOCTL_MJ_FW_INFO ControllerInfo PCIWidth 0x%X\n",ControllerInfo.PCIWidth));
583     agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
584     status=IOCTL_CALL_SUCCESS;
585     break;
586 
587   }
588 
589   case IOCTL_MJ_GET_FW_REV:
590   {
591     agsaControllerInfo_t ControllerInfo;
592     saGetControllerInfo(agRoot, &ControllerInfo);
593     TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_FW_REV Length %d\n", agIOCTLPayload->Length));
594     RequestLength = agIOCTLPayload->Length;
595     Offset = agIOCTLPayload->Reserved;
596     if (RequestLength == 0)
597     {
598       TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_GET_FW_REV: No more Data!\n"));
599       /* out of range */
600       agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
601       agIOCTLPayload->Length = 0;
602       status=IOCTL_CALL_SUCCESS;
603       return status;
604     }
605 
606     osti_memcpy((bit8*)&(agIOCTLPayload->FunctionSpecificArea), (bit8*)&ControllerInfo.fwRevision, sizeof(bit32));
607     loc = (bit8 *)&(agIOCTLPayload->FunctionSpecificArea)+ sizeof(bit32);
608     osti_memcpy(loc, (bit8*)&ControllerInfo.sdkRevision, sizeof(bit32));
609 
610     agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
611     status=IOCTL_CALL_SUCCESS;
612     break;
613 
614   }
615 
616 #ifdef SPC_ENABLE_PROFILE
617   case IOCTL_MJ_FW_PROFILE:
618   {
619     TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_FW_PROFILE\n"));
620     status = tdipFWProfileIoctl( tiRoot, agIOCTLPayload,
621                                    agParam1, agParam2, agParam3);
622     break;
623   }
624 #endif /* SPC_ENABLE_PROFILE */
625 
626   case IOCTL_MJ_GET_CORE_DUMP:
627   {
628     TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_GET_CORE_DUMP\n"));
629     if (tiIS_SPC(agRoot))
630     {
631       status = tdsaRegDumpGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
632     }
633     else
634     {
635       agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
636       status = IOCTL_CALL_SUCCESS;
637     }
638     break;
639   }
640 //#endif
641   case IOCTL_MJ_NVMD_SET:
642   {
643     bit8 nvmDev;
644     TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_NVMD_SET\n"));
645     nvmDev = (bit8) agIOCTLPayload->Status;
646     agIOCTLPayload->Status = 0;
647     status = tdsaNVMDSetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, &nvmDev);
648 	break;
649 	}
650 #if 0
651 case IOCTL_MJ_GPIO:
652   {
653     bit32 sVid =0;
654     TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_GPIO\n"));
655 
656     /* Get Subsystem vendor  */
657     sVid = ostiChipConfigReadBit32(tiRoot,0x2C);
658     sVid = sVid & 0xFFFF;
659 
660     /* GPIO is only intended for chip down design
661      * therefore it's only applies to 8H/SPCv product family
662      */
663     if(sVid == 0x9005)
664     return IOCTL_CALL_INVALID_DEVICE;
665 
666     status = tdsaGpioSetup(tiRoot, agContext, agIOCTLPayload, agParam1, agParam2);
667     if(status == IOCTL_CALL_SUCCESS)
668         status = IOCTL_CALL_PENDING; /* Wait for response from the Controller */
669     else
670       return status;
671 
672     break;
673   }
674 #endif
675 
676   case IOCTL_MJ_SGPIO:
677   {
678     TI_DBG6(("tiCOMMgntIOCTL: IOCTL_MJ_SGPIO\n"));
679     status = tdsaSGpioIoctlSetup(tiRoot, agContext, agIOCTLPayload, agParam1, agParam2);
680     break;
681   }
682 
683   case IOCTL_MJ_NVMD_GET:
684   {
685     bit8 nvmDev;
686     TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_NVMD_GET\n"));
687     nvmDev = (bit8) agIOCTLPayload->Status;
688     agIOCTLPayload->Status = 0;
689     status = tdsaNVMDGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, &nvmDev);
690     break;
691   }
692 
693   case IOCTL_MJ_GET_FORENSIC_DATA:
694   {
695     TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_FORENSIC_DATA\n"));
696     status = tdsaForensicDataGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
697     break;
698   }
699   case IOCTL_MJ_GET_DEVICE_INFO:
700   {
701     TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_DEVICE_INFO\n"));
702     status = tdsaDeviceInfoGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
703     break;
704   }
705 
706   case IOCTL_MJ_GET_IO_ERROR_STATISTIC:
707   {
708     TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_IO_ERROR_STATISTIC\n"));
709     status = tdsaIoErrorStatisticGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
710     break;
711   }
712 
713   case IOCTL_MJ_GET_IO_EVENT_STATISTIC:
714   {
715     TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_GET_IO_EVENT_STATISTIC\n"));
716     status = tdsaIoEventStatisticGetIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
717     break;
718   }
719 
720   case IOCTL_MJ_SEND_BIST:
721   {
722     TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_SEND_BIST\n"));
723     status = tdsaSendBISTIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
724     break;
725   }
726 
727 #if 0
728   case IOCTL_MJ_SET_OR_GET_REGISTER:
729   {
730     TI_DBG3(("tiCOMMgntIOCTL: IOCTL_MJ_SET_OR_GET_REGISTER\n"));
731     status = tdsaRegisterIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
732     break;
733   }
734 
735 #endif
736    case IOCTL_MJ_PHY_DETAILS:
737    {
738 	PhyDetails_t  *PhyDetails = (PhyDetails_t*)&agIOCTLPayload->FunctionSpecificArea;
739         agsaRoot_t  *agRoot = &(tdsaAllShared->agRootNonInt);
740         agsaLLRoot_t  *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
741 	bit8  *sasAddressHi;
742 	bit8  *sasAddressLo;
743 	bit8  sas_dev_type;
744 	int i = 0;
745 
746 	tiIniGetDirectSataSasAddr(tiRoot, i , &sasAddressHi, &sasAddressLo);
747 	for( i = 0; i < saRoot->phyCount ; i++)
748         {
749 		PhyDetails[i].attached_phy = saRoot->phys[i].sasIdentify.phyIdentifier;
750 		/* deice types
751  		 * SAS
752  		 * 0x01 - Sas end device
753  		 * 0x02 - Expander device
754  		 * SATA
755  		 * 0x11 - Sata
756  		 * NO DEVICE 0x00
757  		 */
758 		sas_dev_type = (saRoot->phys[i].sasIdentify.deviceType_addressFrameType & 0x70 ) >> 4 ;
759 		if ((saRoot->phys[i].status == 1) && (sas_dev_type == 0)){ //status 1 - Phy Up
760 			//Sata phy
761 			PhyDetails[i].attached_dev_type = SAS_PHY_SATA_DEVICE;//0x11 for sata end device
762 			osti_memcpy(&PhyDetails[i].attached_sasAddressHi, tdsaAllShared->Ports[i].SASID.sasAddressHi, sizeof(bit32));
763 			osti_memcpy(&PhyDetails[i].attached_sasAddressLo, tdsaAllShared->Ports[i].SASID.sasAddressLo, sizeof(bit32));
764 			PhyDetails[i].attached_sasAddressLo[3] += i + 16;
765 		}
766 		else {
767 			PhyDetails[i].attached_dev_type = sas_dev_type;
768 	        	osti_memcpy(&PhyDetails[i].attached_sasAddressHi, saRoot->phys[i].sasIdentify.sasAddressHi, sizeof(bit32));
769 			osti_memcpy(&PhyDetails[i].attached_sasAddressLo, saRoot->phys[i].sasIdentify.sasAddressLo, sizeof(bit32));
770 		}
771 		osti_memcpy(&PhyDetails[i].sasAddressLo,&(tdsaAllShared->Ports[i].SASID.sasAddressLo), sizeof(bit32));
772 		osti_memcpy(&PhyDetails[i].sasAddressHi,&(tdsaAllShared->Ports[i].SASID.sasAddressHi), sizeof(bit32));
773 	}
774 
775 //    	osti_memcpy(&agIoctlPayload->FunctionSpecificArea,&PhyInfo, sizeof(agsaSGpioReqResponse_t));
776 //	printk("Ioctl success\n");
777 	return IOCTL_CALL_SUCCESS;
778    }
779 
780    case IOCTL_MJ_PHY_GENERAL_STATUS:
781  	  {
782 		agsaPhyGeneralState_t     *PhyData=NULL;
783 		bit32					   ret = AGSA_RC_FAILURE;
784   		PhyData = (agsaPhyGeneralState_t*) &agIOCTLPayload->FunctionSpecificArea[0];
785 
786         PhyData->Reserved2 = 0;
787         /* Validate the length */
788         if (agIOCTLPayload->Length < sizeof(agsaPhyGeneralState_t))
789         {
790           status = IOCTL_CALL_FAIL;
791           break;
792         }
793 
794         tdsaAllShared->tdFWControlEx.param1 = agParam1;
795         tdsaAllShared->tdFWControlEx.param2 = agParam2;
796         tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
797         tdsaAllShared->tdFWControlEx.inProgress = 1;
798 	//tdsaAllShared->tdFWControlEx.usrAddr = PhyData;
799 
800     	ret = tdsaGetPhyGeneralStatusIoctl(tiRoot,PhyData);
801     	if(ret == AGSA_RC_FAILURE)
802         {
803     	  status = IOCTL_CALL_FAIL;
804 		  tdsaAllShared->tdFWControlEx.payload = NULL;
805 		  tdsaAllShared->tdFWControlEx.inProgress = 0;
806 		  break;
807     	}
808 		else if(ret == IOCTL_ERR_STATUS_NOT_SUPPORTED)
809 		{
810 
811 		  agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
812 		  status = IOCTL_CALL_SUCCESS;
813 		  break;
814 		}
815 
816     	//status = IOCTL_CALL_PENDING;
817     	status = IOCTL_CALL_PENDING;
818      }
819 
820    break;
821 #if 1
822   case IOCTL_MJ_GET_PHY_PROFILE:
823   {
824     TI_DBG1(("tiCOMMgntIOCTL: IOCTL_MJ_GET_PHY_PROFILE %p %p %p\n",agParam1,agParam2,agParam3));
825     status = tdsaPhyProfileIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, agParam3);
826     break;
827   }
828 #endif
829   case IOCTL_MJ_LL_TRACING:
830   {
831     void * stu = &agIOCTLPayload->FunctionSpecificArea[0];
832     switch(agIOCTLPayload->MinorFunction)
833     {
834 
835       case IOCTL_MN_LL_RESET_TRACE_INDEX:
836       {
837 
838 #ifdef SA_ENABLE_TRACE_FUNCTIONS
839         TSTMTID_TRACE_BUFFER_RESET *llist = (TSTMTID_TRACE_BUFFER_RESET *)stu;
840         hpTraceBufferParms_t  BufferParms;
841         TI_DBG5(("tdReturnIOCTL_Info: hpIOCTL_ResetTraceIndex\n"));
842 
843         BufferParms.TraceCompiled  = 0;
844         BufferParms.TraceWrap      = 0;
845         BufferParms.CurrentTraceIndexWrapCount = 0;
846         BufferParms.BufferSize     = 0;
847         BufferParms.CurrentIndex   = 0;
848         BufferParms.pTrace         = NULL;
849         BufferParms.pTraceIndexWrapCount        = NULL;
850         BufferParms.pTraceMask     = NULL;
851         BufferParms.pCurrentTraceIndex  = NULL;
852 
853         smTraceGetInfo(agRoot,&BufferParms);
854         TI_DBG5(("tdReturnIOCTL_Info: pTrace                %p\n",BufferParms.pTrace));
855         TI_DBG5(("tdReturnIOCTL_Info: pCurrentTraceIndex    %p %X\n",BufferParms.pCurrentTraceIndex,*BufferParms.pCurrentTraceIndex));
856         TI_DBG5(("tdReturnIOCTL_Info: pTraceIndexWrapCount  %p %X\n",BufferParms.pTraceIndexWrapCount,*BufferParms.pTraceIndexWrapCount));
857         TI_DBG5(("tdReturnIOCTL_Info: pTraceMask            %p %X\n",BufferParms.pTraceMask,*BufferParms.pTraceMask));
858 
859         if( llist->Flag != 0)
860         {
861           if( llist->TraceMask != *BufferParms.pTraceMask)
862           {
863             smTraceSetMask(agRoot,  llist->TraceMask );
864           }
865         }
866         if( llist->Reset)
867         {
868 
869           *BufferParms.pCurrentTraceIndex = 0;
870           smResetTraceBuffer(agRoot);
871 
872           *BufferParms.pCurrentTraceIndex = 0;
873           *BufferParms.pTraceIndexWrapCount =0;
874           llist->TraceMask = *BufferParms.pTraceMask;
875         }
876 #endif  /* SA_ENABLE_TRACE_FUNCTIONS  */
877         agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
878         status = IOCTL_CALL_SUCCESS;
879 
880       }
881       break;
882 
883     case IOCTL_MN_LL_GET_TRACE_BUFFER_INFO:
884       {
885         hpTraceBufferParms_t  BufferParms;
886         TSTMTID_TRACE_BUFFER_INFO *llist = (TSTMTID_TRACE_BUFFER_INFO *)stu;
887         TI_DBG5(("tdReturnIOCTL_Info: hpIOCTL_GetTraceBufferInfo\n"));
888 
889 
890         BufferParms.TraceCompiled  = 0;
891         BufferParms.TraceWrap      = 0;
892         BufferParms.CurrentTraceIndexWrapCount = 0;
893         BufferParms.BufferSize     = 0;
894         BufferParms.CurrentIndex   = 0;
895         BufferParms.pTrace         = NULL;
896         BufferParms.pTraceMask     = NULL;
897 #ifdef SA_ENABLE_TRACE_FUNCTIONS
898         smTraceGetInfo(agRoot,&BufferParms);
899 #endif  /* SA_ENABLE_TRACE_FUNCTIONS not enabled */
900         llist->TraceCompiled = BufferParms.TraceCompiled;
901         llist->BufferSize = BufferParms.BufferSize;
902         llist->CurrentIndex = BufferParms.CurrentIndex ;
903         llist->CurrentTraceIndexWrapCount =  BufferParms.CurrentTraceIndexWrapCount;
904         llist->TraceWrap = BufferParms.TraceWrap;
905         if(BufferParms.pTraceMask != NULL)
906         {
907           llist->TraceMask = *BufferParms.pTraceMask;
908         }
909         agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
910         status = IOCTL_CALL_SUCCESS;
911       }
912       break;
913 
914     case IOCTL_MN_LL_GET_TRACE_BUFFER:
915       {
916 #ifdef SA_ENABLE_TRACE_FUNCTIONS
917         TSTMTID_TRACE_BUFFER_FETCH *llist = (TSTMTID_TRACE_BUFFER_FETCH *)stu;
918 
919         hpTraceBufferParms_t  BufferParms;
920         bit32 c= 0;
921 
922         BufferParms.TraceCompiled  = 0;
923         BufferParms.TraceWrap      = 0;
924         BufferParms.CurrentTraceIndexWrapCount = 0;
925         BufferParms.BufferSize     = 0;
926         BufferParms.CurrentIndex   = 0;
927         BufferParms.pTrace         = NULL;
928         smTraceGetInfo(agRoot,&BufferParms);
929 
930         TI_DBG6(("tdReturnIOCTL_Info: hpIOCTL_GetTraceBuffer\n"));
931 
932         if(llist->LowFence != LowFence32Bits)
933         {
934           break;
935         }
936         if(llist->HighFence != HighFence32Bits)
937         {
938           break;
939         }
940 
941         if(llist->BufferOffsetBegin + FetchBufferSIZE > BufferParms.BufferSize  )
942         {
943         }
944 
945         for ( c=0; c < FetchBufferSIZE;c++)
946         {
947           llist->Data[c] = *(BufferParms.pTrace+( c + llist->BufferOffsetBegin));
948         }
949 #endif  /* SA_ENABLE_TRACE_FUNCTIONS not enabled */
950       }
951       agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
952       status = IOCTL_CALL_SUCCESS;
953       break;
954     }
955     break;
956   }
957 
958 #ifdef SA_LL_API_TEST
959   case IOCTL_MJ_LL_API_TEST:
960   {
961     status = tdLlApiTestIoctl( tiRoot, agIOCTLPayload,
962                agParam1,agParam2,agParam3 );
963     break;
964   }
965 
966 #endif /* SA_LL_API_TEST */
967 
968   case IOCTL_MJ_MODE_CTL_PAGE:
969   {
970     /* The SPCv controller has some options accessed via mode pages */
971     tiEncryptDekConfigPage_t *pModePage= (tiEncryptDekConfigPage_t *) &agIOCTLPayload->FunctionSpecificArea[0];
972     bit32 pageLength = 0;
973     bit32 pageCode;
974     bit32 modeOperation;
975 
976     pageCode = pModePage->pageCode & 0xFF;
977     modeOperation = *(bit32 *) agParam2;
978 
979     switch(modeOperation)
980     {
981 
982       case tiModePageSet:
983         switch (pageCode)
984         {
985           case TI_ENCRYPTION_DEK_CONFIG_PAGE:
986             pageLength = sizeof(tiEncryptDekConfigPage_t);
987             break;
988 
989           case TI_ENCRYPTION_CONTROL_PARM_PAGE:
990             pageLength = sizeof(tiEncryptControlParamPage_t);
991             break;
992 
993           case TI_ENCRYPTION_GENERAL_CONFIG_PAGE:
994             /* Pages are currently unsupported */
995             pageLength = 0;
996             break;
997         }
998 
999         status = saSetControllerConfig(agRoot, 0, pageCode, pageLength, pModePage, (agsaContext_t *)agIOCTLPayload);
1000         break;
1001 
1002       case tiModePageGet:
1003         status = saGetControllerConfig(agRoot, 0, pageCode, 0, 0, (agsaContext_t *)agIOCTLPayload);
1004         break;
1005 
1006       default:
1007         agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
1008     }
1009   }
1010     break;
1011 #ifdef PHY_RESTART_TEST
1012     case IOCTL_MJ_PORT_START:
1013     {
1014       bit32 portID, tiStatus;
1015       bit32 *data = (bit32*) &agIOCTLPayload->FunctionSpecificArea[0];
1016       portID = *data;
1017 
1018       tiStatus = tiCOMPortStart(tiRoot, portID, tdsaAllShared->Ports[portID].tiPortalContext, 0);
1019 
1020       if (tiStatus == tiSuccess)
1021       {
1022         agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1023       }
1024       else
1025       {
1026         agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1027       }
1028       status = IOCTL_CALL_SUCCESS;
1029       break;
1030     }
1031 
1032     case IOCTL_MJ_PORT_STOP:
1033     {
1034       bit32 portID, tiStatus;
1035       bit32 *data = (bit32*) &agIOCTLPayload->FunctionSpecificArea[0];
1036       portID =  *data;
1037 
1038       tiStatus = tiCOMPortStop(tiRoot, tdsaAllShared->Ports[portID].tiPortalContext);
1039       if (tiStatus == tiSuccess)
1040       {
1041         agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1042       }
1043       else
1044       {
1045         agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1046       }
1047 
1048       status = IOCTL_CALL_SUCCESS;
1049       break;
1050     }
1051 #endif
1052  case IOCTL_MJ_SEND_TMF:
1053        switch(agIOCTLPayload->MinorFunction)
1054 	{
1055 	     case IOCTL_MN_TMF_DEVICE_RESET:
1056 		status = tdsaSendTMFIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, AG_TARGET_WARM_RESET);
1057 	        break;
1058 	     case IOCTL_MN_TMF_LUN_RESET:
1059 	 	status = tdsaSendTMFIoctl(tiRoot, agIOCTLPayload, agParam1, agParam2, AG_LOGICAL_UNIT_RESET);
1060 		break;
1061 	}
1062 	break;
1063  case IOCTL_MJ_GET_DRIVER_VERSION:
1064         osti_sprintf(agIOCTLPayload->FunctionSpecificArea, "%s", AGTIAPI_DRIVER_VERSION);
1065         agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1066         status=IOCTL_CALL_SUCCESS;
1067 	break;
1068   default:
1069     agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
1070     break;
1071   }
1072 
1073   return status;
1074 }
1075 
1076 #if 0
1077 /*****************************************************************************
1078 *
1079 * tdsaGpioSetup
1080 *
1081 * Purpose:  This routine is called to set Gpio parameters to the controller.
1082 *
1083 * Parameters:
1084 *   tiRoot:         Pointer to driver instance
1085 *   agsaContext_t :
1086 *   tiIOCTLPayload_t :  ioctl header with payload gpio info
1087 *   agParam1,agParam2 :  Generic parameters
1088 *
1089 * Return: status
1090 *
1091 *
1092 *****************************************************************************/
1093 osGLOBAL bit32
1094 tdsaGpioSetup(
1095                 tiRoot_t            *tiRoot,
1096                 agsaContext_t       *agContext,
1097                 tiIOCTLPayload_t    *agIOCTLPayload,
1098                 void                *agParam1,
1099                 void                *agParam2
1100                 )
1101 {
1102 
1103   tdsaTimerRequest_t        *osIoctlTimer;
1104   agsaGpioEventSetupInfo_t  *gpioEventSetupInfo;
1105   agsaGpioWriteSetupInfo_t  *gpioWriteSetupInfo;
1106   agsaGpioPinSetupInfo_t    *gpioPinSetupInfo;
1107   tdsaRoot_t                *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1108   tdsaContext_t             *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1109   agsaRoot_t                *agRoot = &(tdsaAllShared->agRootInt);
1110   bit32                     status = IOCTL_CALL_SUCCESS;
1111 
1112   TI_DBG3(("tdsaGpioSetup: start\n"));
1113 
1114   if(tiRoot == agNULL || agIOCTLPayload == agNULL )
1115   return IOCTL_CALL_FAIL;
1116 
1117   osIoctlTimer = &tdsaAllShared->osIoctlTimer;
1118   tdsaInitTimerRequest(tiRoot, osIoctlTimer);
1119   tdIoctlStartTimer(tiRoot, osIoctlTimer); /* Start the timout handler for both ioctl and controller response */
1120   tdsaAllShared->tdFWControlEx.virtAddr = (bit8 *)osIoctlTimer;
1121 
1122   tdsaAllShared->tdFWControlEx.usrAddr = (bit8 *)&agIOCTLPayload->FunctionSpecificArea[0];
1123   tdsaAllShared->tdFWControlEx.param1 = agParam1;
1124   tdsaAllShared->tdFWControlEx.param2 = agParam2;
1125   tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
1126   tdsaAllShared->tdFWControlEx.inProgress = 1;
1127 
1128     switch (agIOCTLPayload->MinorFunction)
1129     {
1130 
1131      case IOCTL_MN_GPIO_PINSETUP:
1132      {
1133 	 TI_DBG3(("tdsaGpioSetup: IOCTL_MN_GPIO_PINSETUP\n"));
1134          gpioPinSetupInfo =(agsaGpioPinSetupInfo_t *)&agIOCTLPayload->FunctionSpecificArea[0];
1135          status = saGpioPinSetup(agRoot, agContext, 0, gpioPinSetupInfo);
1136 
1137          break;
1138      }
1139      case IOCTL_MN_GPIO_EVENTSETUP:
1140      {
1141 	TI_DBG3(("tdsaGpioSetup: IOCTL_MN_GPIO_EVENTSETUP\n"));
1142         gpioEventSetupInfo = (agsaGpioEventSetupInfo_t  *)&agIOCTLPayload->FunctionSpecificArea[0];
1143         status = saGpioEventSetup(agRoot, agContext, 0, gpioEventSetupInfo);
1144 
1145         break;
1146      }
1147 
1148      case IOCTL_MN_GPIO_READ:
1149      {
1150 	 TI_DBG3(("tdsaGpioSetup: IOCTL_MN_GPIO_READ\n"));
1151          status = saGpioRead(agRoot, agContext, 0);
1152 
1153         break;
1154      }
1155 
1156      case IOCTL_MN_GPIO_WRITE:
1157      {
1158 	 TI_DBG3(("tdsaGpioSetup: IOCTL_MN_GPIO_WRITE\n"));
1159          gpioWriteSetupInfo = (agsaGpioWriteSetupInfo_t *)&agIOCTLPayload->FunctionSpecificArea[0];
1160          status = saGpioWrite(agRoot, agContext, 0, gpioWriteSetupInfo->gpioWritemask, gpioWriteSetupInfo->gpioWriteVal);
1161 
1162          break;
1163      }
1164 
1165      default :
1166          return status;
1167     }
1168 
1169     if(status != AGSA_RC_SUCCESS)
1170     {
1171       status = IOCTL_CALL_FAIL;
1172       agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1173 
1174       tdsaSingleThreadedEnter(tiRoot, TD_TIMER_LOCK);
1175       if (osIoctlTimer->timerRunning == agTRUE)
1176       {
1177          tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
1178          tdsaKillTimer(tiRoot, osIoctlTimer);
1179 
1180       }else{
1181          tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
1182       }
1183     }
1184 
1185     TI_DBG3(("tdsaGpioPinSetup: End\n"));
1186     return status;
1187 
1188 }
1189 #endif
1190 
1191 /*****************************************************************************
1192 *
1193 * ostiGetGpioIOCTLRsp
1194 *
1195 * Purpose:  This routine is called for Get Gpio IOCTL reaponse has been received.
1196 *
1197 * Parameters:
1198 *   tiRoot:         Pointer to driver instance
1199 *   payloadRsp:     Pointer to the FW download IOMB's payload.
1200 *
1201 * Return: none
1202 *
1203 *
1204 *****************************************************************************/
1205 
1206 osGLOBAL void  ostiGetGpioIOCTLRsp(
1207                         tiRoot_t                 *tiRoot,
1208                         bit32                    status,
1209                         bit32                    gpioReadValue,
1210                         agsaGpioPinSetupInfo_t   *gpioPinSetupInfo,
1211                         agsaGpioEventSetupInfo_t *gpioEventSetupInfo
1212                         )
1213 {
1214      tdsaRoot_t                *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1215      tdsaContext_t             *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1216      tiIOCTLPayload_t          *agIoctlPayload ;
1217      agsaGpioReadInfo_t        *gpioReadInfo;
1218 
1219      tdsaTimerRequest_t        *osIoctlTimer;
1220 	 osIoctlTimer = (tdsaTimerRequest_t *)tdsaAllShared->tdFWControlEx.virtAddr;
1221 
1222      TI_DBG2(("ostiGetGpioIOCTLRsp: start, status = %d \n", status));
1223 
1224      agIoctlPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1225 
1226      if(agIoctlPayload == agNULL){
1227         return;
1228       }
1229 
1230      agIoctlPayload->Status =(bit16) status;
1231 
1232      if( (status != IOCTL_CALL_TIMEOUT) && (osIoctlTimer != NULL))
1233      {
1234         tdsaSingleThreadedEnter(tiRoot, TD_TIMER_LOCK);
1235         if (osIoctlTimer->timerRunning == agTRUE)
1236         {
1237            tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
1238            tdsaKillTimer(tiRoot, osIoctlTimer);
1239 
1240         }else{
1241            tdsaSingleThreadedLeave(tiRoot, TD_TIMER_LOCK);
1242         }
1243      }else  {
1244          tdsaAllShared->tdFWControlEx.inProgress = 0;
1245          agIoctlPayload->Status = (bit16)status;
1246          ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
1247                                tdsaAllShared->tdFWControlEx.param2, NULL);
1248         return;
1249      }
1250 
1251      if(status == SUCCESS)
1252        TI_DBG3((" ostiGetGpioIOCTLRsp:Got GPIO response from OUTBuf"));
1253     else {
1254       tdsaAllShared->tdFWControlEx.inProgress = 0;
1255       ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
1256                                tdsaAllShared->tdFWControlEx.param2, NULL);
1257       return;
1258     }
1259 
1260     switch (agIoctlPayload->MinorFunction)
1261      {
1262 
1263      case IOCTL_MN_GPIO_PINSETUP:
1264       {
1265        TI_DBG3((" ostiGetGpioIOCTLRsp:Got GPIO response for IOCTL_MN_GPIO_PINSETUP"));
1266 
1267          break;
1268       }
1269      case IOCTL_MN_GPIO_EVENTSETUP:
1270      {
1271        TI_DBG3((" ostiGetGpioIOCTLRsp:Got GPIO response for IOCTL_MN_GPIO_EVENTSETUP"));
1272 
1273          break;
1274      }
1275 
1276      case IOCTL_MN_GPIO_WRITE:
1277      {
1278        TI_DBG3((" ostiGetGpioIOCTLRsp:Got GPIO response for IOCTL_MN_GPIO_WRITE"));
1279 
1280          break;
1281      }
1282 
1283     case IOCTL_MN_GPIO_READ:
1284     {
1285          gpioReadInfo = ( agsaGpioReadInfo_t *)tdsaAllShared->tdFWControlEx.usrAddr;
1286 
1287          gpioReadInfo->gpioReadValue = gpioReadValue;
1288          gpioReadInfo->gpioInputEnabled = gpioPinSetupInfo->gpioInputEnabled ; /* GPIOIE */
1289          gpioReadInfo->gpioEventLevelChangePart1 = gpioPinSetupInfo->gpioTypePart1; /* GPIEVCHANGE (pins 11-0) */
1290          gpioReadInfo->gpioEventLevelChangePart2 = gpioPinSetupInfo->gpioTypePart2; /* GPIEVCHANGE (pins 23-20) */
1291          gpioReadInfo->gpioEventRisingEdgePart1 = 0xFFF & gpioEventSetupInfo->gpioEventRisingEdge; /* GPIEVRISE (pins 11-0) */
1292          gpioReadInfo->gpioEventRisingEdgePart2 = 0x00F00000 & (gpioEventSetupInfo->gpioEventRisingEdge); /* GPIEVRISE (pins 23-20) */
1293          gpioReadInfo->gpioEventFallingEdgePart1 = 0xFFF & gpioEventSetupInfo->gpioEventFallingEdge; /* GPIEVALL (pins 11-0) */
1294          gpioReadInfo->gpioEventFallingEdgePart2 = 0x00F00000  & gpioEventSetupInfo->gpioEventFallingEdge; /* GPIEVALL (pins 23-20 */
1295 
1296          break;
1297      }
1298 
1299     default :
1300          break;
1301     }
1302 
1303     if(tdsaAllShared->tdFWControlEx.inProgress)
1304     {
1305       tdsaAllShared->tdFWControlEx.inProgress = 0;
1306       ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
1307                               tdsaAllShared->tdFWControlEx.param2, NULL);
1308     }
1309     TI_DBG2(("ostiGetGpioIOCTLRsp: end \n"));
1310 
1311    return ;
1312 }
1313 
1314 /*****************************************************************************
1315 *
1316 * tdsaSGpioIoctlSetup
1317 *
1318 * Purpose:  This routine is called to send SGPIO request to the controller.
1319 *
1320 * Parameters:
1321 *   tiRoot:             Pointer to driver instance
1322 *   agsaContext_t:      Context for this request
1323 *   tiIOCTLPayload_t:   ioctl header with payload sgpio info
1324 *   agParam1,agParam2:  Generic parameters
1325 *
1326 * Return: status
1327 *
1328 *
1329 *****************************************************************************/
1330 osGLOBAL bit32
1331 tdsaSGpioIoctlSetup(
1332                 tiRoot_t            *tiRoot,
1333                 agsaContext_t       *agContext,
1334                 tiIOCTLPayload_t    *agIOCTLPayload,
1335                 void                *agParam1,
1336                 void                *agParam2
1337                 )
1338 {
1339   tdsaRoot_t                *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1340   tdsaContext_t             *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1341   agsaRoot_t                *agRoot = &(tdsaAllShared->agRootInt);
1342   bit32                     status = IOCTL_CALL_FAIL;
1343   agsaSGpioReqResponse_t    *pSGpioReq = (agsaSGpioReqResponse_t *)&agIOCTLPayload->FunctionSpecificArea[0];
1344 
1345   TI_DBG3(("tdsaSGpioIoctlSetup: start\n"));
1346 
1347   agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1348 
1349   do
1350   {
1351     if (tiRoot == agNULL || agIOCTLPayload == agNULL)
1352     {
1353       break;
1354     }
1355 
1356     /* Validate the length */
1357     if (agIOCTLPayload->Length < sizeof(agsaSGpioReqResponse_t))
1358     {
1359       TI_DBG3(("Invalid length\n"));
1360       break;
1361     }
1362 
1363     /* Validate the SMP Frame Type, Function and Register Type fields */
1364     if ((pSGpioReq->smpFrameType != SMP_REQUEST) || \
1365         ((pSGpioReq->function != SMP_READ_GPIO_REGISTER) && (pSGpioReq->function != SMP_WRITE_GPIO_REGISTER)) || \
1366         (pSGpioReq->registerType > AGSA_SGPIO_GENERAL_PURPOSE_TRANSMIT_REG))
1367     {
1368       TI_DBG4(("Invalid Parameter\n"));
1369       break;
1370     }
1371 
1372     /* Specific validation for configuration register type */
1373     if (AGSA_SGPIO_CONFIG_REG == pSGpioReq->registerType)
1374     {
1375       if ((pSGpioReq->registerIndex > 0x01) || \
1376           ((0x00 == pSGpioReq->registerIndex) && (pSGpioReq->registerCount > 0x02)) || \
1377           ((0x01 == pSGpioReq->registerIndex) && (pSGpioReq->registerCount > 0x01)))
1378       {
1379         break;
1380       }
1381     }
1382 
1383     /* Use FW control place in shared structure to keep the necessary information */
1384     tdsaAllShared->tdFWControlEx.param1 = agParam1;
1385     tdsaAllShared->tdFWControlEx.param2 = agParam2;
1386     tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
1387     tdsaAllShared->tdFWControlEx.inProgress = 1;
1388 
1389     status = saSgpio(agRoot, agContext, 0, pSGpioReq);
1390     if (status != AGSA_RC_SUCCESS)
1391     {
1392       break;
1393     }
1394 
1395     status = IOCTL_CALL_PENDING;
1396 
1397   } while (0);
1398 
1399   TI_DBG3(("tdsaGpioPinSetup: End\n"));
1400   return status;
1401 }
1402 
1403 /*****************************************************************************
1404 *
1405 * ostiSgpioIoctlRsp
1406 *
1407 * Purpose:  This routine is called when a SGPIO IOCTL response is received.
1408 *
1409 * Parameters:
1410 *   tiRoot:         Pointer to driver instance
1411 *   pSgpioResponse: Pointer to the SGPIO response
1412 *
1413 * Return: none
1414 *
1415 *
1416 *****************************************************************************/
1417 osGLOBAL void ostiSgpioIoctlRsp(
1418                             tiRoot_t                *tiRoot,
1419                             agsaSGpioReqResponse_t  *pSgpioResponse
1420                             )
1421 {
1422   tdsaRoot_t        *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1423   tdsaContext_t     *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1424   tiIOCTLPayload_t  *agIoctlPayload = agNULL;
1425 
1426   TI_DBG3(("ostiSgpioIoctlRsp: start\n"));
1427 
1428   if (tdsaAllShared->tdFWControlEx.inProgress)
1429   {
1430     agIoctlPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1431     if (agIoctlPayload)
1432     {
1433       tdsaAllShared->tdFWControlEx.payload = NULL;
1434       osti_memcpy(&agIoctlPayload->FunctionSpecificArea[0], pSgpioResponse, sizeof(agsaSGpioReqResponse_t));
1435       agIoctlPayload->Status = IOCTL_ERR_STATUS_OK;
1436       sgpioResponseSet = 1;
1437     }
1438 	tdsaAllShared->sgpioResponseSet = 1;    //Sunitha:Check if needed?
1439 
1440     ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
1441                   tdsaAllShared->tdFWControlEx.param2, agNULL);
1442 
1443     tdsaAllShared->tdFWControlEx.inProgress = 0;
1444   }
1445 
1446   TI_DBG3(("ostiSgpioIoctlRsp: end\n"));
1447 }
1448 /*****************************************************************************
1449 *
1450 * ostiCOMMgntIOCTLRsp
1451 *
1452 * Purpose:  This routine is called when FW control IOCTL reaponse has been received.
1453 *           This function is used for both target and initiator.
1454 *
1455 * Parameters:
1456 *   tiRoot:          Pointer to driver instance
1457 *   payloadRsp:     Pointer to the FW download IOMB's payload.
1458 *
1459 * Return: none
1460 *
1461 *
1462 *
1463 *****************************************************************************/
1464 
1465 osGLOBAL void ostiCOMMgntIOCTLRsp(
1466                         tiRoot_t            *tiRoot,
1467                         bit32               status
1468                         )
1469 {
1470     tdsaRoot_t           *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1471     tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1472 
1473     TI_DBG1(("ostiCOMMgntIOCTLRsp: status 0x%x\n",status));
1474     (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
1475 
1476     ostiFreeMemory(tiRoot,
1477                    tdsaAllShared->tdFWControlEx.buffer,
1478                    tdsaAllShared->tdFWControlEx.tdFWControl->len);
1479 
1480     ostiIOCTLSetSignal(tiRoot,
1481                        tdsaAllShared->tdFWControlEx.param1,
1482                        tdsaAllShared->tdFWControlEx.param2,
1483                        NULL);
1484 }
1485 
1486 
1487 /*****************************************************************************
1488 *
1489 * ostiRegDumpIOCTLRsp
1490 *
1491 * Purpose:  This routine is called when Register Dump from flash IOCTL reaponse has been received.
1492 *           This function is used for both target and initiator.
1493 *
1494 * Parameters:
1495 *   tiRoot:          Pointer to driver instance
1496 *   payloadRsp:     Pointer to the FW download IOMB's payload.
1497 *
1498 * Return: none
1499 *
1500 *
1501 *
1502 *****************************************************************************/
1503 
1504 osGLOBAL void ostiRegDumpIOCTLRsp(
1505                         tiRoot_t            *tiRoot,
1506                         bit32               status
1507                         )
1508 {
1509     tdsaRoot_t           *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1510     tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1511 
1512     TI_DBG1(("ostiRegDumpIOCTLRsp: start\n"));
1513 //    (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
1514     osti_memcpy((void *)(tdsaAllShared->tdFWControlEx.usrAddr),
1515                 (void *)(tdsaAllShared->tdFWControlEx.virtAddr),
1516                 tdsaAllShared->tdFWControlEx.len);
1517 
1518     ostiFreeMemory(tiRoot,
1519                   tdsaAllShared->tdFWControlEx.buffer,
1520                   tdsaAllShared->tdFWControlEx.len);
1521 
1522     ostiIOCTLSetSignal(tiRoot,
1523                        tdsaAllShared->tdFWControlEx.param1,
1524                        tdsaAllShared->tdFWControlEx.param2,
1525                        NULL);
1526 }
1527 
1528 /*****************************************************************************
1529 *
1530 * ostiSetNVMDIOCTLRsp
1531 *
1532 * Purpose:  This routine is called for Set NVMD IOCTL reaponse has been received.
1533 *           This function is used for both target and initiator.
1534 *
1535 * Parameters:
1536 *   tiRoot:          Pointer to driver instance
1537 *   payloadRsp:     Pointer to the FW download IOMB's payload.
1538 *
1539 * Return: none
1540 *
1541 *
1542 *
1543 *****************************************************************************/
1544 
1545 osGLOBAL void ostiSetNVMDIOCTLRsp(
1546                         tiRoot_t            *tiRoot,
1547                         bit32               status
1548                         )
1549 {
1550     tdsaRoot_t           *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1551     tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1552     tiIOCTLPayload_t     *agIOCTLPayload;
1553 
1554     if(status)
1555     {
1556         agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1557         agIOCTLPayload->Status = (bit16)status;
1558     }
1559 
1560     TI_DBG1(("ostiSetNVMDIOCTLRsp: start, status = %d\n", status));
1561 //    (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
1562     ostiFreeMemory(tiRoot,
1563                        tdsaAllShared->tdFWControlEx.buffer,
1564                        tdsaAllShared->tdFWControlEx.len);
1565 
1566     ostiIOCTLSetSignal(tiRoot,
1567                        tdsaAllShared->tdFWControlEx.param1,
1568                        tdsaAllShared->tdFWControlEx.param2,
1569                        NULL);
1570 }
1571 #ifdef SPC_ENABLE_PROFILE
1572 /*****************************************************************************
1573 *
1574 * ostiFWProfileIOCTLRsp
1575 *
1576 * Purpose:  This routine is called for Fw Profile IOCTL reaponse has been received.
1577 *           This function is used for both target and initiator.
1578 *
1579 * Parameters:
1580 *   tiRoot:          Pointer to driver instance
1581 *   status:
1582 *
1583 * Return: none
1584 *
1585 *
1586 *
1587 *****************************************************************************/
1588 
1589 osGLOBAL void ostiFWProfileIOCTLRsp(
1590                         tiRoot_t            *tiRoot,
1591                         bit32               status,
1592             bit32               len)
1593 {
1594     tdsaRoot_t           *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1595     tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1596     tdFWProfile_t        *fwProfile;
1597 
1598     TI_DBG1(("ostiFWProfileIOCTLRsp: start\n"));
1599     fwProfile = (tdFWProfile_t *)tdsaAllShared->tdFWProfileEx.tdFWProfile;
1600   //    (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
1601     if (status == AGSA_RC_SUCCESS)
1602     {
1603       if((fwProfile->cmd == STOP_TIMER_PROFILE) || (fwProfile->cmd == STOP_CODE_PROFILE))
1604         {
1605         osti_memcpy((void *)(fwProfile->buffer),
1606                   (void *)(tdsaAllShared->tdFWProfileEx.virtAddr),
1607                   len);
1608 
1609         ostiFreeMemory(tiRoot,
1610                          tdsaAllShared->tdFWProfileEx.buffer,
1611                          tdsaAllShared->tdFWProfileEx.len);
1612       }
1613     }
1614     fwProfile->status = status;
1615     fwProfile->len = len;
1616     ostiIOCTLSetSignal(tiRoot,
1617                        tdsaAllShared->tdFWProfileEx.param1,
1618                        tdsaAllShared->tdFWProfileEx.param2,
1619                        NULL);
1620 }
1621 #endif
1622 /*****************************************************************************
1623 *
1624 * ostiGetNVMDIOCTLRsp
1625 *
1626 * Purpose:  This routine is called for Get NVMD IOCTL reaponse has been received.
1627 *           This function is used for both target and initiator.
1628 *
1629 * Parameters:
1630 *   tiRoot:          Pointer to driver instance
1631 *   payloadRsp:     Pointer to the FW download IOMB's payload.
1632 *
1633 * Return: none
1634 *
1635 *
1636 *
1637 *****************************************************************************/
1638 
1639 osGLOBAL void ostiGetNVMDIOCTLRsp(
1640                         tiRoot_t            *tiRoot,
1641                         bit32               status
1642                         )
1643 {
1644     tdsaRoot_t           *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1645     tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1646     tiIOCTLPayload_t     *agIOCTLPayload;
1647 
1648     if(status)
1649     {
1650         agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1651         agIOCTLPayload->Status = (bit16)status;
1652     }
1653 
1654     TI_DBG1(("ostiGetNVMDIOCTLRsp: start, status = %d\n", status));
1655     tdsaAllShared->NvmdResponseSet = 1;
1656 
1657     if(tdsaAllShared->tdFWControlEx.param1 != agNULL)
1658     {
1659     osti_memcpy((void *)(tdsaAllShared->tdFWControlEx.usrAddr),
1660                 (void *)(tdsaAllShared->tdFWControlEx.virtAddr),
1661                 tdsaAllShared->tdFWControlEx.len);
1662 
1663     ostiFreeMemory(tiRoot,
1664                    tdsaAllShared->tdFWControlEx.buffer,
1665                    tdsaAllShared->tdFWControlEx.len);
1666 
1667     ostiIOCTLSetSignal(tiRoot,
1668                        tdsaAllShared->tdFWControlEx.param1,
1669                        tdsaAllShared->tdFWControlEx.param2,
1670                        NULL);
1671     }
1672 }
1673 
1674 
1675 /*****************************************************************************
1676 *
1677 * ostiGetPhyProfileIOCTLRsp
1678 *
1679 * Purpose:  This routine is called for phy response has been received.
1680 *           This function is used for both target and initiator.
1681 *
1682 * Parameters:
1683 *   tiRoot:          Pointer to driver instance
1684 *   payloadRsp:     Pointer to the IOMB's payload.
1685 *
1686 * Return: none
1687 *
1688 *
1689 *
1690 *****************************************************************************/
1691 
1692 osGLOBAL void ostiGetPhyProfileIOCTLRsp(
1693                         tiRoot_t            *tiRoot,
1694                         bit32               status
1695                         )
1696 {
1697     tdsaRoot_t           *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1698     tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1699     tiIOCTLPayload_t     *agIOCTLPayload;
1700     tdPhyCount_t     *PhyBlob = agNULL;
1701     if(status)
1702     {
1703       agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1704       agIOCTLPayload->Status = (bit16)status;
1705 
1706       PhyBlob = (tdPhyCount_t*)&agIOCTLPayload->FunctionSpecificArea[0];
1707       if(PhyBlob)
1708       {
1709 //        PhyBlob->Phy |= 0x800;
1710         if(PhyBlob->phyResetProblem == 0 )
1711         {
1712           PhyBlob->phyResetProblem = -1;
1713         }
1714         TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->Phy                   0x%x\n",PhyBlob->Phy));
1715         TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->BW_rx                 0x%x\n",PhyBlob->BW_rx));
1716         TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->BW_tx                 0x%x\n",PhyBlob->BW_tx));
1717         TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->InvalidDword          0x%x\n",PhyBlob->InvalidDword));
1718         TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->runningDisparityError 0x%x\n",PhyBlob->runningDisparityError));
1719         TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->codeViolation         0x%x\n",PhyBlob->codeViolation));
1720         TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->phyResetProblem       0x%x\n",PhyBlob->phyResetProblem));
1721         TI_DBG1(("ostiGetPhyProfileIOCTLRsp: PhyBlob->inboundCRCError       0x%x\n",PhyBlob->inboundCRCError));
1722 
1723       }
1724 
1725 
1726     }
1727 
1728     TI_DBG1(("ostiGetPhyProfileIOCTLRsp: start, status = %d\n", status));
1729     TI_DBG1(("ostiGetPhyProfileIOCTLRsp: start, len = %d %p %p\n", tdsaAllShared->tdFWControlEx.len,tdsaAllShared->tdFWControlEx.usrAddr,tdsaAllShared->tdFWControlEx.virtAddr));
1730 
1731 //    osti_memcpy((void *)(tdsaAllShared->tdFWControlEx.usrAddr),
1732 //                (void *)(tdsaAllShared->tdFWControlEx.virtAddr),
1733 //                 tdsaAllShared->tdFWControlEx.len);
1734 
1735     ostiFreeMemory(tiRoot,
1736                    tdsaAllShared->tdFWControlEx.buffer,
1737                    tdsaAllShared->tdFWControlEx.len);
1738 
1739     ostiIOCTLSetSignal(tiRoot,
1740                        tdsaAllShared->tdFWControlEx.param1,
1741                        tdsaAllShared->tdFWControlEx.param2,
1742                        NULL);
1743 }
1744 
1745 
1746 /*****************************************************************************
1747 *
1748 * ostiGenEventIOCTLRsp
1749 *
1750 * Purpose:  This routine is called when General Event happened while waiting for IOCTL response.
1751 *           This function is used for both target and initiator.
1752 *
1753 * Parameters:
1754 *   tiRoot:          Pointer to driver instance
1755 *   payloadRsp:     Pointer to the FW download IOMB's payload.
1756 *
1757 * Return: none
1758 *
1759 *
1760 *
1761 *****************************************************************************/
1762 
1763 osGLOBAL void ostiGenEventIOCTLRsp(
1764                         tiRoot_t            *tiRoot,
1765                         bit32               status
1766                         )
1767 {
1768     tdsaRoot_t           *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
1769     tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1770     tiIOCTLPayload_t     *agIOCTLPayload;
1771 
1772     TI_DBG1(("ostiGenEventIOCTLRsp: start\n"));
1773 
1774     if(tdsaAllShared->tdFWControlEx.inProgress)  /*Free only if our IOCTL is in progress*/
1775     {
1776       agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1777       agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1778       (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1779 
1780       ostiFreeMemory(tiRoot,
1781                      tdsaAllShared->tdFWControlEx.buffer,
1782                      tdsaAllShared->tdFWControlEx.len);
1783 
1784       ostiIOCTLSetSignal(tiRoot,
1785                          tdsaAllShared->tdFWControlEx.param1,
1786                          tdsaAllShared->tdFWControlEx.param2,
1787                          NULL);
1788       tdsaAllShared->tdFWControlEx.inProgress = 0;
1789     }
1790 #ifdef SPC_ENABLE_PROFILE
1791     if(tdsaAllShared->tdFWProfileEx.inProgress)
1792     {
1793       agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWProfileEx.payload);
1794       agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1795       if(tdsaAllShared->tdFWProfileEx.virtAddr != NULL)  /*Free only if our IOCTL is in progress*/
1796       {
1797         ostiFreeMemory(tiRoot,
1798                        tdsaAllShared->tdFWProfileEx.buffer,
1799                        tdsaAllShared->tdFWProfileEx.len);
1800         tdsaAllShared->tdFWProfileEx.virtAddr = NULL;
1801       }
1802       ostiIOCTLSetSignal(tiRoot,
1803                          tdsaAllShared->tdFWProfileEx.param1,
1804                          tdsaAllShared->tdFWProfileEx.param2,
1805                          NULL);
1806       tdsaAllShared->tdFWProfileEx.inProgress = 0;
1807 
1808     }
1809 #endif /*SPC_ENABLE_PROFILE*/
1810 
1811 }
1812 
1813 osGLOBAL void
1814 ostiGetDeviceInfoIOCTLRsp(
1815                         tiRoot_t    *tiRoot,
1816                         bit32        status,
1817                         void        *param
1818                         )
1819 {
1820     tdsaRoot_t             *tdsaRoot       = (tdsaRoot_t *) tiRoot->tdData;
1821     tdsaContext_t          *tdsaAllShared  = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1822     tiIOCTLPayload_t       *agIOCTLPayload = agNULL;
1823     tdDeviceInfoPayload_t  *pTDDeviceInfo  = agNULL;
1824     agsaDeviceInfo_t       *pSADeviceInfo  = agNULL;
1825 
1826     TI_DBG1(("ostiGetDeviceInfoIOCTLRsp: start\n"));
1827 
1828     agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1829     pSADeviceInfo = (agsaDeviceInfo_t*)param;
1830     pTDDeviceInfo = (tdDeviceInfoPayload_t*)agIOCTLPayload->FunctionSpecificArea;
1831 
1832     if (pSADeviceInfo != agNULL)
1833     {
1834       /* fill the device information in IOCTL payload */
1835       osti_memcpy(&pTDDeviceInfo->devInfo.sasAddressHi, pSADeviceInfo->sasAddressHi, sizeof(bit32));
1836       osti_memcpy(&pTDDeviceInfo->devInfo.sasAddressLo, pSADeviceInfo->sasAddressLo, sizeof(bit32));
1837 
1838       pTDDeviceInfo->devInfo.sasAddressHi = DMA_BEBIT32_TO_BIT32(pTDDeviceInfo->devInfo.sasAddressHi);
1839       pTDDeviceInfo->devInfo.sasAddressLo = DMA_BEBIT32_TO_BIT32(pTDDeviceInfo->devInfo.sasAddressLo);
1840 
1841       pTDDeviceInfo->devInfo.deviceType = (pSADeviceInfo->devType_S_Rate & 0x30) >> 4;
1842       pTDDeviceInfo->devInfo.linkRate   = pSADeviceInfo->devType_S_Rate & 0x0F;
1843 
1844       agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1845     }
1846     else
1847     {
1848       agIOCTLPayload->Status = IOCTL_ERR_STATUS_INVALID_DEVICE;
1849     }
1850 
1851     if(tdsaAllShared->tdFWControlEx.inProgress)  /*Free only if our IOCTL is in progress*/
1852     {
1853       ostiIOCTLSetSignal(tiRoot,
1854                          tdsaAllShared->tdFWControlEx.param1,
1855                          tdsaAllShared->tdFWControlEx.param2,
1856                          NULL);
1857       tdsaAllShared->tdFWControlEx.inProgress = 0;
1858     }
1859 }
1860 
1861 
1862 #ifdef INITIATOR_DRIVER
1863 osGLOBAL void
1864 ostiGetIoErrorStatsIOCTLRsp(
1865                         tiRoot_t    *tiRoot,
1866                         bit32        status,
1867                         void        *param
1868                         )
1869 {
1870     tdsaRoot_t                  *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
1871     tdsaContext_t               *tdsaAllShared   = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1872     itdsaIni_t                  *Initiator       = (itdsaIni_t *)tdsaAllShared->itdsaIni;
1873     tiIOCTLPayload_t            *agIOCTLPayload  = agNULL;
1874     tdIoErrorStatisticPayload_t *pIoErrorPayload = agNULL;
1875     agsaIOErrorEventStats_t     *pIoErrorCount   = agNULL;
1876 
1877     OS_ASSERT(sizeof(agsaIOErrorEventStats_t) == sizeof(tdIoErrorEventStatisticIOCTL_t), "agsaIOErrorEventStats_t tdIoErrorEventStatisticIOCTL_t\n");
1878     TI_DBG1(("ostiGetIoErrorStatsIOCTLRsp: start\n"));
1879 
1880     agIOCTLPayload  = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1881     pIoErrorPayload = (tdIoErrorStatisticPayload_t*)agIOCTLPayload->FunctionSpecificArea;
1882     pIoErrorCount   = (agsaIOErrorEventStats_t*)param;
1883 
1884     osti_memcpy(&pIoErrorPayload->IoError, pIoErrorCount, sizeof(agsaIOErrorEventStats_t));
1885     /*copy SCSI status and sense key count from OS layer to TD layer*/
1886     osti_memcpy(&pIoErrorPayload->ScsiStatusCounter, &Initiator->ScsiStatusCounts, sizeof(tdSCSIStatusCount_t));
1887     osti_memcpy(&pIoErrorPayload->SenseKeyCounter, &Initiator->SenseKeyCounter, sizeof(tdSenseKeyCount_t));
1888     if (pIoErrorPayload->flag)
1889     {
1890       osti_memset(&Initiator->ScsiStatusCounts, 0,sizeof(tdSCSIStatusCount_t) );
1891       osti_memset(&Initiator->SenseKeyCounter, 0,sizeof(tdSenseKeyCount_t) );
1892     }
1893 
1894     agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1895 }
1896 #endif /* INITIATOR_DRIVER */
1897 
1898 osGLOBAL void
1899 ostiGetIoEventStatsIOCTLRsp(
1900                         tiRoot_t    *tiRoot,
1901                         bit32        status,
1902                         void        *param
1903                         )
1904 {
1905     tdsaRoot_t                  *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
1906     tdsaContext_t               *tdsaAllShared   = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1907     tiIOCTLPayload_t            *agIOCTLPayload  = agNULL;
1908     tdIoEventStatisticPayload_t *pIoEventPayload = agNULL;
1909     agsaIOErrorEventStats_t     *pIoEventCount   = agNULL;
1910 
1911     TI_DBG1(("ostiGetIoEventStatsIOCTLRsp: start\n"));
1912 
1913     agIOCTLPayload  = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1914     pIoEventPayload = (tdIoEventStatisticPayload_t*)agIOCTLPayload->FunctionSpecificArea;
1915     pIoEventCount   = (agsaIOErrorEventStats_t*)param;
1916 
1917     osti_memcpy(&pIoEventPayload->IoEvent, pIoEventCount, sizeof(agsaIOErrorEventStats_t));
1918 
1919     agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1920 }
1921 
1922 osGLOBAL void
1923 ostiGetForensicDataIOCTLRsp(
1924                         tiRoot_t    *tiRoot,
1925                         bit32        status,
1926                         void        *param
1927                         )
1928 {
1929   tdsaRoot_t                  *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
1930   tdsaContext_t               *tdsaAllShared   = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
1931   tiIOCTLPayload_t            *agIOCTLPayload  = agNULL;
1932   tdForensicDataPayload_t     *pForensicDataPayload = agNULL;
1933   agsaForensicData_t          *pForensicData   = agNULL;
1934 
1935   TI_DBG3(("ostiGetForensicDataIOCTLRsp: start, status = %d\n", status));
1936 
1937   agIOCTLPayload  = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
1938   pForensicDataPayload = (tdForensicDataPayload_t*)agIOCTLPayload->FunctionSpecificArea;
1939   pForensicData   = (agsaForensicData_t*)param;
1940 
1941   if (agNULL == agIOCTLPayload)
1942   {
1943     return;
1944   }
1945 
1946   if (FORENSIC_DATA_TYPE_CHECK_FATAL == pForensicData->DataType)
1947   {
1948     agIOCTLPayload->Status = (bit16)status;
1949     return;
1950   }
1951 
1952   if (status == AGSA_RC_SUCCESS)
1953   {
1954     switch (pForensicData->DataType)
1955     {
1956       case FORENSIC_DATA_TYPE_NON_FATAL:
1957       case FORENSIC_DATA_TYPE_FATAL:
1958            pForensicDataPayload->dataBuffer.directOffset = pForensicData->BufferType.dataBuf.directOffset;
1959            pForensicDataPayload->dataBuffer.readLen      = pForensicData->BufferType.dataBuf.readLen;
1960            break;
1961       case FORENSIC_DATA_TYPE_GSM_SPACE:
1962            pForensicDataPayload->gsmBuffer.directOffset  = pForensicData->BufferType.gsmBuf.directOffset;
1963 	   pForensicDataPayload->gsmBuffer.readLen 	 = pForensicData->BufferType.gsmBuf.readLen;
1964            break;
1965 
1966       case FORENSIC_DATA_TYPE_QUEUE:
1967            break;
1968 
1969       default:
1970            TI_DBG1(("ostiGetForensicDataIOCTLRsp: forensic data type error %d\n", pForensicData->DataType));
1971            break;
1972     }
1973     agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
1974   }
1975   else if(status == IOCTL_ERROR_NO_FATAL_ERROR)
1976   {
1977     agIOCTLPayload->Status = (bit16)status;
1978   }
1979   else
1980   {
1981     agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
1982   }
1983 
1984   /*Free only if our IOCTL is in progress*/
1985   if(tdsaAllShared->tdFWControlEx.inProgress)
1986   {
1987     TI_DBG3(("ostiGetForensicDataIOCTLRsp: Waiting for the signal \n"));
1988     ostiIOCTLSetSignal(tiRoot,
1989           tdsaAllShared->tdFWControlEx.param1,
1990           tdsaAllShared->tdFWControlEx.param2,
1991           NULL);
1992     TI_DBG3(("ostiGetForensicDataIOCTLRsp: Signal wait completed \n"));
1993     tdsaAllShared->tdFWControlEx.inProgress = 0;
1994   }
1995 }
1996 
1997 /*****************************************************************************
1998 *
1999 * tdsaRegDumpGetIoctl
2000 *
2001 * Purpose:  This routine is called to get Register Dump information.
2002 *           This function is used for both target and initiator.
2003 *
2004 * Parameters:
2005 *   tiRoot:         Pointer to driver instance
2006 *   agIOCTLPayload: Pointer to the IOCTL payload.
2007 *   agParam1:       Pointer to pass context handle for IOCTL DMA operation
2008 *   agParam2:       Pointer to pass context handle for IOCTL DMA operation
2009 *   agParam3:       Pointer to pass context handle for IOCTL DMA operation
2010 *
2011 * Return:
2012 *
2013 *   IOCTL_CALL_SUCCESS        The requested operation completed successfully.
2014 *   IOCTL_CALL_FAIL           Fail to complete the IOCTL request.
2015 *                             Detail error code is function specific and
2016 *                             defined by the specific IOCTL function.
2017 *   IOCTL_CALL_PENDING        This request is asynchronous and completed
2018 *                             in some other context.
2019 *   IOCTL_CALL_INVALID_CODE   This IOCTL function is not recognized.
2020 *
2021 *
2022 *****************************************************************************/
2023 osGLOBAL bit32
2024 tdsaRegDumpGetIoctl(
2025                 tiRoot_t            *tiRoot,
2026                 tiIOCTLPayload_t    *agIOCTLPayload,
2027                 void                *agParam1,
2028                 void                *agParam2,
2029                 void                *agParam3
2030                 )
2031 {
2032     tdsaRoot_t    *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2033     tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2034     agsaRoot_t    *agRoot = &(tdsaAllShared->agRootInt);
2035 //    agsaControllerStatus_t RegDump;
2036     bit32               Offset = 0;
2037     bit32               RequestLength = 0;  /* user request on how much data to pass to application */
2038     agsaRegDumpInfo_t   regDumpInfo;
2039     void                *buffer = agNULL;
2040     void                *osMemHandle = agNULL;
2041     bit32               status = IOCTL_CALL_SUCCESS;
2042     bit32               CoreDumpLength = 16384; /* change it once data is available */
2043     bit32               EventLogOffset = 65536;
2044 
2045     ///saGetControllerStatus(agRoot, &RegDump);
2046     /* length of FSA as provided by application */
2047     RequestLength = agIOCTLPayload->Length;
2048 ///    FunctionSpecificOffset = 0; /* Offset into the FunctionSpecificArea of payload */
2049     /* offset into core dump that was passed from application */
2050     Offset = agIOCTLPayload->Reserved;
2051 
2052   if((CoreDumpLength <= Offset)&&
2053     (agIOCTLPayload->MinorFunction != IOCTL_MN_FW_GET_EVENT_FLASH_LOG1)&&
2054     (agIOCTLPayload->MinorFunction != IOCTL_MN_FW_GET_EVENT_FLASH_LOG2))
2055   {
2056       agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
2057       agIOCTLPayload->Length = 0;
2058       status=IOCTL_CALL_SUCCESS;
2059       return status;
2060     }
2061     regDumpInfo.regDumpOffset = Offset;
2062     agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
2063     /* dump either aap1 or iop registers */
2064     switch(agIOCTLPayload->MinorFunction){
2065 
2066     /*Coredump*/
2067     case IOCTL_MN_FW_GET_CORE_DUMP_AAP1:
2068             //CoreDumpBAROffset = RegDump.fatalErrorInfo.regDumpOffset0;    /* get this from mpi config table */
2069             //CoreDumpLength = RegDump.fatalErrorInfo.regDumpLen0;
2070             /*changes for added Call back*/
2071             tdsaAllShared->tdFWControlEx.param1 = agParam1;
2072             tdsaAllShared->tdFWControlEx.param2 = agParam2;
2073             regDumpInfo.regDumpSrc = 0;
2074             regDumpInfo.regDumpNum = 0;
2075             regDumpInfo.directLen = RequestLength;
2076             regDumpInfo.directData = &agIOCTLPayload->FunctionSpecificArea[0];
2077             /*changes for added Call back*/
2078             //status = IOCTL_CALL_SUCCESS;
2079             tdsaAllShared->tdFWControlEx.inProgress = 1;
2080             status = IOCTL_CALL_PENDING;
2081             break;
2082     case IOCTL_MN_FW_GET_CORE_DUMP_IOP:
2083         //CoreDumpBAROffset = RegDump.fatalErrorInfo.regDumpOffset1;    /* get this from mpi config table */
2084         //CoreDumpLength = RegDump.fatalErrorInfo.regDumpLen1;
2085         /*changes for added Call back*/
2086         tdsaAllShared->tdFWControlEx.param1 = agParam1;
2087         tdsaAllShared->tdFWControlEx.param2 = agParam2;
2088         regDumpInfo.regDumpSrc = 0;
2089         regDumpInfo.regDumpNum = 1;
2090         regDumpInfo.directLen = RequestLength;
2091         regDumpInfo.directData = &agIOCTLPayload->FunctionSpecificArea[0];
2092         /*changes for added Call back*/
2093         //status = IOCTL_CALL_SUCCESS;
2094         tdsaAllShared->tdFWControlEx.inProgress = 1;
2095         status = IOCTL_CALL_PENDING;
2096         break;
2097     case IOCTL_MN_FW_GET_CORE_DUMP_FLASH_AAP1:
2098         regDumpInfo.regDumpSrc = 1;
2099         regDumpInfo.regDumpNum = 0;
2100         if(RequestLength != 0)
2101         {
2102             if(ostiAllocMemory( tiRoot,
2103                     &osMemHandle,
2104                     (void **)&buffer,
2105                     &(regDumpInfo.indirectAddrUpper32),
2106                     &(regDumpInfo.indirectAddrLower32),
2107                     8,
2108                     RequestLength,
2109                     agFALSE))
2110                 return IOCTL_CALL_FAIL;
2111         }
2112         osti_memset((void *)buffer, 0, RequestLength);
2113         regDumpInfo.indirectLen = RequestLength;
2114 
2115         // use FW control place in shared structure to keep the neccesary information
2116         tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
2117         tdsaAllShared->tdFWControlEx.virtAddr = buffer;
2118         tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2119         tdsaAllShared->tdFWControlEx.len = RequestLength;
2120         tdsaAllShared->tdFWControlEx.param1 = agParam1;
2121         tdsaAllShared->tdFWControlEx.param2 = agParam2;
2122         tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2123         tdsaAllShared->tdFWControlEx.inProgress = 1;
2124         status = IOCTL_CALL_PENDING;
2125         break;
2126     case IOCTL_MN_FW_GET_CORE_DUMP_FLASH_IOP:
2127         regDumpInfo.regDumpSrc = 1;
2128         regDumpInfo.regDumpNum = 1;
2129         if(RequestLength != 0)
2130         {
2131             if(ostiAllocMemory( tiRoot,
2132                     &osMemHandle,
2133                     (void **)&buffer,
2134                     &(regDumpInfo.indirectAddrUpper32),
2135                     &(regDumpInfo.indirectAddrLower32),
2136                     8,
2137                     RequestLength,
2138                     agFALSE))
2139                 return IOCTL_CALL_FAIL;
2140         }
2141         osti_memset((void *)buffer, 0, RequestLength);
2142         regDumpInfo.indirectLen = RequestLength;
2143 
2144         // use FW control place in shared structure to keep the neccesary information
2145         tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
2146         tdsaAllShared->tdFWControlEx.virtAddr = buffer;
2147         tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2148         tdsaAllShared->tdFWControlEx.len = RequestLength;
2149         tdsaAllShared->tdFWControlEx.param1 = agParam1;
2150         tdsaAllShared->tdFWControlEx.param2 = agParam2;
2151         tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2152         tdsaAllShared->tdFWControlEx.inProgress = 1;
2153         status = IOCTL_CALL_PENDING;
2154         break;
2155     /*EventLog from Flash*/
2156     case IOCTL_MN_FW_GET_EVENT_FLASH_LOG1:      //aap1 Eventlog
2157       if(CoreDumpLength + EventLogOffset <= Offset)
2158       {
2159         agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
2160         agIOCTLPayload->Length = 0;
2161         status=IOCTL_CALL_SUCCESS;
2162         return status;
2163       }
2164       regDumpInfo.regDumpSrc = 1;
2165       regDumpInfo.regDumpNum = 0;
2166       if(RequestLength != 0)
2167       {
2168           if(ostiAllocMemory( tiRoot,
2169                   &osMemHandle,
2170                   (void **)&buffer,
2171                   &(regDumpInfo.indirectAddrUpper32),
2172                   &(regDumpInfo.indirectAddrLower32),
2173                   8,
2174                   RequestLength,
2175                   agFALSE))
2176               return IOCTL_CALL_FAIL;
2177       }
2178       osti_memset((void *)buffer, 0, RequestLength);
2179       regDumpInfo.indirectLen = RequestLength;
2180 
2181       // use FW control place in shared structure to keep the neccesary information
2182       tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
2183       tdsaAllShared->tdFWControlEx.virtAddr = buffer;
2184       tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2185       tdsaAllShared->tdFWControlEx.len = RequestLength;
2186       tdsaAllShared->tdFWControlEx.param1 = agParam1;
2187       tdsaAllShared->tdFWControlEx.param2 = agParam2;
2188       tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2189       tdsaAllShared->tdFWControlEx.inProgress = 1;
2190       status = IOCTL_CALL_PENDING;
2191       break;
2192     case IOCTL_MN_FW_GET_EVENT_FLASH_LOG2:      //iop Eventlog
2193       if(CoreDumpLength + EventLogOffset <= Offset)
2194       {
2195         agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
2196         agIOCTLPayload->Length = 0;
2197         status=IOCTL_CALL_SUCCESS;
2198         return status;
2199       }
2200       regDumpInfo.regDumpSrc = 1;
2201       regDumpInfo.regDumpNum = 1;
2202       if(RequestLength != 0)
2203       {
2204           if(ostiAllocMemory( tiRoot,
2205                   &osMemHandle,
2206                   (void **)&buffer,
2207                   &(regDumpInfo.indirectAddrUpper32),
2208                   &(regDumpInfo.indirectAddrLower32),
2209                   8,
2210                   RequestLength,
2211                   agFALSE))
2212               return IOCTL_CALL_FAIL;
2213       }
2214       osti_memset((void *)buffer, 0, RequestLength);
2215       regDumpInfo.indirectLen = RequestLength;
2216 
2217       // use FW control place in shared structure to keep the neccesary information
2218       tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
2219       tdsaAllShared->tdFWControlEx.virtAddr = buffer;
2220       tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2221       tdsaAllShared->tdFWControlEx.len = RequestLength;
2222       tdsaAllShared->tdFWControlEx.param1 = agParam1;
2223       tdsaAllShared->tdFWControlEx.param2 = agParam2;
2224       tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2225       tdsaAllShared->tdFWControlEx.inProgress = 1;
2226       status = IOCTL_CALL_PENDING;
2227       break;
2228   default:
2229       status = IOCTL_CALL_INVALID_CODE;
2230       TI_DBG1(("tiCOMMgntIOCTL: ERROR: Wrong IOCTL code %d\n", agIOCTLPayload->MinorFunction));
2231       break;
2232     }
2233     if(saGetRegisterDump(agRoot, agNULL, 0, &regDumpInfo) != AGSA_RC_SUCCESS)
2234     {
2235         status = IOCTL_CALL_FAIL;
2236         agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
2237     }
2238 
2239     return status;
2240 }
2241 
2242 osGLOBAL void
2243 ostiCOMMgntVPDSetIOCTLRsp(
2244                           tiRoot_t            *tiRoot,
2245                           bit32               status
2246                           )
2247 {
2248     tdsaRoot_t    *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2249     tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2250 //    agsaRoot_t    *agRoot = &(tdsaAllShared->agRootInt);
2251 
2252     TI_DBG1(("ostiCOMMgntVPDSetIOCTLRsp: start\n"));
2253     (tdsaAllShared->tdFWControlEx.tdFWControl)->retcode = status;
2254 
2255     ostiFreeMemory(tiRoot,
2256                    tdsaAllShared->tdFWControlEx.buffer,
2257                    tdsaAllShared->tdFWControlEx.len);
2258 
2259     ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
2260                                tdsaAllShared->tdFWControlEx.param2,
2261                                NULL);
2262 }
2263 
2264 /*****************************************************************************
2265 *
2266 * tdsaNVMDSetIoctl
2267 *
2268 * Purpose:  This routine is called to set Config. SEEPROM information.
2269 *           This function is used for both target and initiator.
2270 *
2271 * Parameters:
2272 *   tiRoot:         Pointer to driver instance
2273 *   agIOCTLPayload: Pointer to the IOCTL payload.
2274 *   agParam1:       Pointer to pass context handle for IOCTL DMA operation
2275 *   agParam2:       Pointer to pass context handle for IOCTL DMA operation
2276 *   agParam3:       Pointer to pass context handle for IOCTL DMA operation
2277 *
2278 * Return:
2279 *
2280 *   IOCTL_CALL_SUCCESS        The requested operation completed successfully.
2281 *   IOCTL_CALL_FAIL           Fail to complete the IOCTL request.
2282 *                             Detail error code is function specific and
2283 *                             defined by the specific IOCTL function.
2284 *   IOCTL_CALL_PENDING        This request is asynchronous and completed
2285 *                             in some other context.
2286 *   IOCTL_CALL_INVALID_CODE   This IOCTL function is not recognized.
2287 *
2288 *
2289 *****************************************************************************/
2290 osGLOBAL bit32
2291 tdsaNVMDSetIoctl(
2292                 tiRoot_t            *tiRoot,
2293                 tiIOCTLPayload_t    *agIOCTLPayload,
2294                 void                *agParam1,
2295                 void                *agParam2,
2296                 void                *agParam3
2297                 )
2298 {
2299   bit32                  RequestLength = 0;
2300   bit32                  bufAddrUpper = 0;
2301   bit32                  bufAddrLower = 0;
2302   tdsaRoot_t             *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2303   tdsaContext_t          *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2304   agsaRoot_t             *agRoot = &(tdsaAllShared->agRootInt);
2305   void                   *buffer = agNULL;
2306   void                   *osMemHandle = agNULL;
2307   bit32                  status = IOCTL_CALL_SUCCESS;
2308   agsaNVMDData_t         nvmdInfo;
2309 
2310 
2311   TI_DBG2(("tdsaNVMDSetIoctl: start\n"));
2312 
2313   RequestLength = agIOCTLPayload->Length;
2314 
2315   osti_memset(&nvmdInfo, 0, sizeof(agsaNVMDData_t));
2316 
2317   switch(agIOCTLPayload->MinorFunction)
2318   {
2319     case IOCTL_MN_NVMD_SET_CONFIG:
2320 
2321       //nvmdInfo.NVMDevice = 1;
2322       nvmdInfo.NVMDevice = *((bit8*)agParam3);
2323       nvmdInfo.signature = 0xFEDCBA98;
2324       nvmdInfo.dataOffsetAddress = agIOCTLPayload->Reserved;
2325       nvmdInfo.indirectPayload = 1;
2326       nvmdInfo.indirectLen = RequestLength;
2327 
2328       if (nvmdInfo.NVMDevice == 0) {
2329         nvmdInfo.TWIDeviceAddress = 0xa0;
2330         nvmdInfo.TWIBusNumber = 0;
2331         nvmdInfo.TWIDevicePageSize = 0;
2332         nvmdInfo.TWIDeviceAddressSize = 1;
2333       }
2334 
2335       if(RequestLength != 0)
2336       {
2337         if(ostiAllocMemory( tiRoot,
2338             &osMemHandle,
2339             (void **)&buffer,
2340             &bufAddrUpper,
2341             &bufAddrLower,
2342             8,
2343             RequestLength,
2344             agFALSE))
2345           return IOCTL_CALL_FAIL;
2346       }
2347       else
2348       {
2349         return IOCTL_CALL_FAIL;
2350       }
2351 
2352       osti_memset((void *)buffer, 0, RequestLength);
2353 
2354       osti_memcpy((void *)buffer,
2355             agIOCTLPayload->FunctionSpecificArea,
2356             RequestLength);
2357 
2358       nvmdInfo.indirectAddrLower32 = bufAddrLower;
2359       nvmdInfo.indirectAddrUpper32 = bufAddrUpper;
2360       // use FW control place in shared structure to keep the neccesary information
2361       tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
2362       tdsaAllShared->tdFWControlEx.virtAddr = buffer;
2363       tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2364       tdsaAllShared->tdFWControlEx.len = RequestLength;
2365       tdsaAllShared->tdFWControlEx.param1 = agParam1;
2366       tdsaAllShared->tdFWControlEx.param2 = agParam2;
2367       tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2368       tdsaAllShared->tdFWControlEx.inProgress = 1;
2369       status = IOCTL_CALL_PENDING;
2370       break;
2371     default:
2372         status = IOCTL_CALL_INVALID_CODE;
2373         TI_DBG1(("tdsaNVMDSetIoctl: ERROR: Wrong IOCTL code %d\n", agIOCTLPayload->MinorFunction));
2374         break;
2375   }
2376 
2377   if(saSetNVMDCommand(agRoot, agNULL, 0, &nvmdInfo) != AGSA_RC_SUCCESS)
2378   {
2379       status = IOCTL_CALL_FAIL;
2380       agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
2381   }
2382 
2383   return status;
2384 
2385 }
2386 
2387 /*****************************************************************************
2388 *
2389 * tdsaNVMDGetIoctl
2390 *
2391 * Purpose:  This routine is called to get Config. SEEPROM information.
2392 *           This function is used for both target and initiator.
2393 *
2394 * Parameters:
2395 *   tiRoot:         Pointer to driver instance
2396 *   agIOCTLPayload: Pointer to the IOCTL payload.
2397 *   agParam1:       Pointer to pass context handle for IOCTL DMA operation
2398 *   agParam2:       Pointer to pass context handle for IOCTL DMA operation
2399 *   agParam3:       Pointer to pass context handle for IOCTL DMA operation
2400 *
2401 * Return:
2402 *
2403 *   IOCTL_CALL_SUCCESS        The requested operation completed successfully.
2404 *   IOCTL_CALL_FAIL           Fail to complete the IOCTL request.
2405 *                             Detail error code is function specific and
2406 *                             defined by the specific IOCTL function.
2407 *   IOCTL_CALL_PENDING        This request is asynchronous and completed
2408 *                             in some other context.
2409 *   IOCTL_CALL_INVALID_CODE   This IOCTL function is not recognized.
2410 *
2411 *
2412 *****************************************************************************/
2413 osGLOBAL bit32
2414 tdsaNVMDGetIoctl(
2415                 tiRoot_t            *tiRoot,
2416                 tiIOCTLPayload_t    *agIOCTLPayload,
2417                 void                *agParam1,
2418                 void                *agParam2,
2419                 void                *agParam3
2420                 )
2421 {
2422   tdsaRoot_t      *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2423   tdsaContext_t   *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2424   agsaRoot_t      *agRoot = &(tdsaAllShared->agRootInt);
2425   void            *buffer = agNULL;
2426   void            *osMemHandle = agNULL;
2427   bit32           status = IOCTL_CALL_SUCCESS;
2428   agsaNVMDData_t  nvmdInfo;
2429   bit32           Offset = 0;
2430   bit32           RequestLength = 0;
2431   bit32		  ostiMemoryStatus = 0;
2432   bit32		  i,j;
2433   bit8*		  seepromBuffer;
2434   bit8*		  phySettingsBuffer;
2435 
2436 
2437   TI_DBG2(("tdsaNVMDGetIoctl: start\n"));
2438 
2439   RequestLength = agIOCTLPayload->Length;
2440   Offset = agIOCTLPayload->Reserved;
2441 
2442   osti_memset(&nvmdInfo, 0, sizeof(agsaNVMDData_t));
2443   /* This condition is not valid for direct read so commenting */
2444   /*if(!tiIS_SPC(agRoot)) {
2445      if( RequestLength <= Offset ) //4096-max seeprom size
2446      {
2447     	agIOCTLPayload->Status = IOCTL_ERR_STATUS_NO_MORE_DATA;
2448     	agIOCTLPayload->Length = 0;
2449     	status=IOCTL_CALL_SUCCESS;
2450     	return status;
2451      }
2452   }*/
2453 
2454   agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
2455 
2456   switch(agIOCTLPayload->MinorFunction)
2457   {
2458     case IOCTL_MN_NVMD_GET_CONFIG:
2459 
2460    //   nvmdInfo.NVMDevice = 1;
2461       nvmdInfo.NVMDevice = *((bit8*)agParam3);
2462       nvmdInfo.signature = 0xFEDCBA98;
2463       nvmdInfo.dataOffsetAddress = Offset;
2464       nvmdInfo.indirectPayload = 1;
2465       nvmdInfo.indirectLen = RequestLength;
2466 
2467       if (nvmdInfo.NVMDevice == 0) {
2468         nvmdInfo.TWIDeviceAddress = 0xa0;
2469         nvmdInfo.TWIBusNumber = 0;
2470         nvmdInfo.TWIDevicePageSize = 0;
2471         nvmdInfo.TWIDeviceAddressSize = 1;
2472       }
2473 
2474       if(RequestLength != 0)
2475       {
2476         ostiMemoryStatus = ostiAllocMemory( tiRoot,
2477             &osMemHandle,
2478             (void **)&buffer,
2479             &(nvmdInfo.indirectAddrUpper32),
2480             &(nvmdInfo.indirectAddrLower32),
2481             8,
2482             RequestLength,
2483             agFALSE);
2484 	if((ostiMemoryStatus != tiSuccess) && (buffer == agNULL))
2485         return IOCTL_CALL_FAIL;
2486      }
2487       else
2488       {
2489         return IOCTL_CALL_FAIL;
2490       }
2491       osti_memset((void *)buffer, 0, RequestLength);
2492 
2493       // use FW control place in shared structure to keep the neccesary information
2494       tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
2495       tdsaAllShared->tdFWControlEx.virtAddr = buffer;
2496       tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2497       tdsaAllShared->tdFWControlEx.len = RequestLength;
2498       tdsaAllShared->tdFWControlEx.param1 = agParam1;
2499       tdsaAllShared->tdFWControlEx.param2 = agParam2;
2500       tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2501       tdsaAllShared->tdFWControlEx.inProgress = 1;
2502       status = IOCTL_CALL_PENDING;
2503       break;
2504       default:
2505       status = IOCTL_CALL_INVALID_CODE;
2506       TI_DBG1(("tiCOMMgntIOCTL: ERROR: Wrong IOCTL code %d\n", agIOCTLPayload->MinorFunction));
2507       break;
2508   }
2509   tdsaAllShared->NvmdResponseSet = 0;
2510 
2511   if(saGetNVMDCommand(agRoot, agNULL, 0, &nvmdInfo) != AGSA_RC_SUCCESS)
2512   {
2513     status = IOCTL_CALL_FAIL;
2514     agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
2515     return status;
2516   }
2517   /* Copy the SAS address */
2518   if(agParam1 == agNULL)
2519 
2520   {
2521      while(!tdsaAllShared->NvmdResponseSet)
2522      {
2523    //	tiCOMDelayedInterruptHandler(tiRoot, 0, 1, tiNonInterruptContext);
2524      }
2525      if(nvmdInfo.NVMDevice == 4 || nvmdInfo.NVMDevice == 1)
2526      {
2527 	seepromBuffer = buffer;
2528 	/*Get Initiator SAS address*/
2529 
2530 	if(tiIS_SPC(agRoot))
2531 	{
2532 	   for(j=0,i=ADAPTER_WWN_SPC_START_OFFSET; i<= ADAPTER_WWN_SPC_END_OFFSET; i++,j++)
2533 	  agIOCTLPayload->FunctionSpecificArea[j] = seepromBuffer[i];
2534         }
2535  	else
2536 	{
2537 	  for(j=0,i=ADAPTER_WWN_START_OFFSET; i<= ADAPTER_WWN_END_OFFSET; i++,j++)
2538 	  agIOCTLPayload->FunctionSpecificArea[j] = seepromBuffer[i];
2539 	}
2540     }
2541     /* Copy the Phy settings */
2542     else if(nvmdInfo.NVMDevice == 6)
2543     {
2544       phySettingsBuffer = buffer;
2545       for(i=0; i<PHY_SETTINGS_LEN; i++)
2546 	agIOCTLPayload->FunctionSpecificArea[i] = phySettingsBuffer[i];
2547     }
2548     tdsaAllShared->NvmdResponseSet = 0;
2549     ostiFreeMemory(tiRoot, tdsaAllShared->tdFWControlEx.buffer, tdsaAllShared->tdFWControlEx.len);
2550 
2551   }
2552   return status;
2553 
2554 }
2555 
2556 /*****************************************************************************
2557 *
2558 * tdsaDeviceInfoGetIoctl
2559 *
2560 * Purpose:  This routine is called to get the specified device information.
2561 *
2562 * Parameters:
2563 *   tiRoot:         Pointer to driver instance
2564 *   agIOCTLPayload: Pointer to the IOCTL payload.
2565 *   agParam1:       Pointer to pass context handle for IOCTL DMA operation
2566 *   agParam2:       Pointer to pass context handle for IOCTL DMA operation
2567 *   agParam3:       Pointer to pass context handle for IOCTL DMA operation
2568 *
2569 * Return:
2570 *
2571 *   IOCTL_CALL_SUCCESS        The requested operation completed successfully.
2572 *   IOCTL_CALL_FAIL           Fail to complete the IOCTL request.
2573 *                             Detail error code is function specific and
2574 *                             defined by the specific IOCTL function.
2575 *   IOCTL_CALL_PENDING        This request is asynchronous and completed
2576 *                             in some other context.
2577 *   IOCTL_CALL_INVALID_CODE   This IOCTL function is not recognized.
2578 *
2579 *
2580 *****************************************************************************/
2581 osGLOBAL bit32
2582 tdsaDeviceInfoGetIoctl(
2583                 tiRoot_t            *tiRoot,
2584                 tiIOCTLPayload_t    *agIOCTLPayload,
2585                 void                *agParam1,
2586                 void                *agParam2,
2587                 void                *agParam3
2588                 )
2589 {
2590   tdsaDeviceData_t       *oneDeviceData = agNULL;
2591   tiDeviceHandle_t       *tiDeviceHandle = agNULL;
2592   tdDeviceInfoPayload_t  *pDeviceInfo = agNULL;
2593   /*agsaDevHandle_t  *agDevHandle = agNULL;*/
2594   bit32            status = IOCTL_CALL_SUCCESS;
2595 
2596   pDeviceInfo = (tdDeviceInfoPayload_t*)agIOCTLPayload->FunctionSpecificArea;
2597 
2598   TI_DBG3(("tdsaDeviceInfoGetIoctl: %d:%3d:%d %p %p %p\n",
2599                                      (bit8)pDeviceInfo->PathId,
2600                                      (bit8)pDeviceInfo->TargetId,
2601                                      (bit8)pDeviceInfo->Lun,
2602                                       agParam1,
2603                                       agParam2,
2604                                       agParam3));
2605 
2606   tiDeviceHandle = ostiMapToDevHandle(tiRoot,
2607                                      (bit8)pDeviceInfo->PathId,
2608                                      (bit8)pDeviceInfo->TargetId,
2609                                      (bit8)pDeviceInfo->Lun
2610                                      );
2611 
2612   if (tiDeviceHandle == agNULL)
2613   {
2614     TI_DBG1(("tdsaDeviceInfoGetIoctl: tiDeviceHandle is NULL !!!! SCSI address = %d:%3d:%d\n",
2615               pDeviceInfo->PathId, pDeviceInfo->TargetId, pDeviceInfo->Lun));
2616     agIOCTLPayload->Status = IOCTL_ERR_STATUS_INVALID_DEVICE;
2617     status = IOCTL_CALL_FAIL;
2618     return status;
2619   }
2620 
2621   oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
2622   if(oneDeviceData == agNULL)
2623   {
2624     TI_DBG1(("tdsaDeviceInfoGetIoctl: tiDeviceHandle=%p DeviceData is NULL!!! SCSI address = %d:%3d:%d\n",
2625              tiDeviceHandle, pDeviceInfo->PathId, pDeviceInfo->TargetId, pDeviceInfo->Lun));
2626     agIOCTLPayload->Status = IOCTL_ERR_STATUS_INVALID_DEVICE;
2627     status = IOCTL_CALL_FAIL;
2628     return status;
2629   }
2630 
2631   /* for hotplug */
2632   if (oneDeviceData->valid != agTRUE || oneDeviceData->registered != agTRUE ||
2633       oneDeviceData->tdPortContext == agNULL )
2634   {
2635     TI_DBG1(("tdsaDeviceInfoGetIoctl: tiDeviceHandle=%p did %d DeviceData was removed!!! SCSI address = %d:%3d:%d\n",
2636              tiDeviceHandle, oneDeviceData->id, pDeviceInfo->PathId, pDeviceInfo->TargetId, pDeviceInfo->Lun));
2637     agIOCTLPayload->Status = IOCTL_ERR_STATUS_INVALID_DEVICE;
2638     status = IOCTL_CALL_FAIL;
2639     return status;
2640   }
2641 
2642   /* fill the device information in IOCTL payload */
2643   pDeviceInfo->devInfo.phyId = oneDeviceData->phyID;
2644   osti_memcpy(&pDeviceInfo->devInfo.sasAddressHi, oneDeviceData->agDeviceInfo.sasAddressHi, sizeof(bit32));
2645   osti_memcpy(&pDeviceInfo->devInfo.sasAddressLo, oneDeviceData->agDeviceInfo.sasAddressLo, sizeof(bit32));
2646 
2647   pDeviceInfo->devInfo.sasAddressHi = DMA_BEBIT32_TO_BIT32(pDeviceInfo->devInfo.sasAddressHi);
2648   pDeviceInfo->devInfo.sasAddressLo = DMA_BEBIT32_TO_BIT32(pDeviceInfo->devInfo.sasAddressLo);
2649 
2650   pDeviceInfo->devInfo.deviceType = (oneDeviceData->agDeviceInfo.devType_S_Rate & 0x30) >> 4;
2651   pDeviceInfo->devInfo.linkRate   = oneDeviceData->agDeviceInfo.devType_S_Rate & 0x0F;
2652 
2653   agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
2654 
2655   TI_DBG3(("tdsaDeviceInfoGetIoctl:IOCTL_CALL_SUCCESS\n"));
2656 
2657   /*saGetDeviceInfo(agRoot, agNULL, 0, 0, agDevHandle);*/
2658 
2659   status = IOCTL_CALL_SUCCESS;
2660 
2661   return status;
2662 }
2663 /*****************************************************************************
2664 *
2665 * tdsaIoErrorStatisticGetIoctl
2666 *
2667 * Purpose:  This routine is called to get the IO error statistic.
2668 *
2669 * Parameters:
2670 *   tiRoot:         Pointer to driver instance
2671 *   agIOCTLPayload: Pointer to the IOCTL payload.
2672 *   agParam1:       Pointer to pass context handle for IOCTL DMA operation
2673 *   agParam2:       Pointer to pass context handle for IOCTL DMA operation
2674 *   agParam3:       Pointer to pass context handle for IOCTL DMA operation
2675 *
2676 * Return:
2677 *
2678 *   IOCTL_CALL_SUCCESS        The requested operation completed successfully.
2679 *   IOCTL_CALL_FAIL           Fail to complete the IOCTL request.
2680 *                             Detail error code is function specific and
2681 *                             defined by the specific IOCTL function.
2682 *   IOCTL_CALL_PENDING        This request is asynchronous and completed
2683 *                             in some other context.
2684 *   IOCTL_CALL_INVALID_CODE   This IOCTL function is not recognized.
2685 *
2686 *
2687 *****************************************************************************/
2688 osGLOBAL bit32
2689 tdsaIoErrorStatisticGetIoctl(
2690                  tiRoot_t            *tiRoot,
2691                  tiIOCTLPayload_t    *agIOCTLPayload,
2692                  void                *agParam1,
2693                  void                *agParam2,
2694                  void                *agParam3
2695                  )
2696 {
2697   tdsaRoot_t                  *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
2698   tdsaContext_t               *tdsaAllShared   = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2699   agsaRoot_t                  *agRoot          = &(tdsaAllShared->agRootInt);
2700   tdIoErrorStatisticPayload_t *pIoErrorPayload = agNULL;
2701   bit32                        status = IOCTL_CALL_SUCCESS;
2702 
2703   pIoErrorPayload = (tdIoErrorStatisticPayload_t*)agIOCTLPayload->FunctionSpecificArea;
2704 
2705   tdsaAllShared->tdFWControlEx.buffer = agNULL;
2706   tdsaAllShared->tdFWControlEx.virtAddr = agNULL;
2707   tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2708   tdsaAllShared->tdFWControlEx.len = 0;
2709   tdsaAllShared->tdFWControlEx.param1 = agParam1;
2710   tdsaAllShared->tdFWControlEx.param2 = agParam2;
2711   tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2712   tdsaAllShared->tdFWControlEx.inProgress = 0;
2713 
2714   saGetIOErrorStats(agRoot, agNULL, pIoErrorPayload->flag);
2715 
2716   return status;
2717 }
2718 
2719 /*****************************************************************************
2720 *
2721 * tdsaIoEventStatisticGetIoctl
2722 *
2723 * Purpose:  This routine is called to get the IO event statistic.
2724 *
2725 * Parameters:
2726 *   tiRoot:         Pointer to driver instance
2727 *   agIOCTLPayload: Pointer to the IOCTL payload.
2728 *   agParam1:       Pointer to pass context handle for IOCTL DMA operation
2729 *   agParam2:       Pointer to pass context handle for IOCTL DMA operation
2730 *   agParam3:       Pointer to pass context handle for IOCTL DMA operation
2731 *
2732 * Return:
2733 *
2734 *   IOCTL_CALL_SUCCESS        The requested operation completed successfully.
2735 *   IOCTL_CALL_FAIL           Fail to complete the IOCTL request.
2736 *                             Detail error code is function specific and
2737 *                             defined by the specific IOCTL function.
2738 *   IOCTL_CALL_PENDING        This request is asynchronous and completed
2739 *                             in some other context.
2740 *   IOCTL_CALL_INVALID_CODE   This IOCTL function is not recognized.
2741 *
2742 *
2743 *****************************************************************************/
2744 osGLOBAL bit32
2745 tdsaIoEventStatisticGetIoctl(
2746                  tiRoot_t            *tiRoot,
2747                  tiIOCTLPayload_t    *agIOCTLPayload,
2748                  void                *agParam1,
2749                  void                *agParam2,
2750                  void                *agParam3
2751                  )
2752 {
2753   tdsaRoot_t                  *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
2754   tdsaContext_t               *tdsaAllShared   = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2755   agsaRoot_t                  *agRoot          = &(tdsaAllShared->agRootInt);
2756   tdIoEventStatisticPayload_t *pIoEventPayload = agNULL;
2757   bit32                        status = IOCTL_CALL_SUCCESS;
2758 
2759   pIoEventPayload = (tdIoEventStatisticPayload_t*)agIOCTLPayload->FunctionSpecificArea;
2760 
2761   tdsaAllShared->tdFWControlEx.buffer = agNULL;
2762   tdsaAllShared->tdFWControlEx.virtAddr = agNULL;
2763   tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2764   tdsaAllShared->tdFWControlEx.len = 0;
2765   tdsaAllShared->tdFWControlEx.param1 = agParam1;
2766   tdsaAllShared->tdFWControlEx.param2 = agParam2;
2767   tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2768   tdsaAllShared->tdFWControlEx.inProgress = 0;
2769 
2770   saGetIOEventStats(agRoot, agNULL, pIoEventPayload->flag);
2771 
2772   return status;
2773 }
2774 
2775 /*****************************************************************************
2776 *
2777 * tdsaRegisterIoctl
2778 *
2779 * Purpose:  This routine is called to get Forensic Data.
2780 *
2781 * Parameters:
2782 *   tiRoot:         Pointer to driver instance
2783 *   agIOCTLPayload: Pointer to the IOCTL payload.
2784 *   agParam1:       Pointer to pass context handle for IOCTL DMA operation
2785 *   agParam2:       Pointer to pass context handle for IOCTL DMA operation
2786 *   agParam3:       Pointer to pass context handle for IOCTL DMA operation
2787 *
2788 * Return:
2789 *
2790 *   IOCTL_CALL_SUCCESS        The requested operation completed successfully.
2791 *   IOCTL_CALL_FAIL           Fail to complete the IOCTL request.
2792 *                             Detail error code is function specific and
2793 *                             defined by the specific IOCTL function.
2794 *   IOCTL_CALL_PENDING        This request is asynchronous and completed
2795 *                             in some other context.
2796 *   IOCTL_CALL_INVALID_CODE   This IOCTL function is not recognized.
2797 *
2798 *
2799 *****************************************************************************/
2800 osGLOBAL bit32
2801 tdsaRegisterIoctl(
2802                  tiRoot_t            *tiRoot,
2803                  tiIOCTLPayload_t    *agIOCTLPayload,
2804                  void                *agParam1,
2805                  void                *agParam2,
2806                  void                *agParam3
2807                  )
2808 {
2809   tdsaRoot_t                  *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
2810   tdsaContext_t               *tdsaAllShared   = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2811 //  agsaRoot_t                  *agRoot          = &(tdsaAllShared->agRootInt);
2812   tdRegisterPayload_t         *pRegisterPayload = agNULL;
2813   bit32                        status = IOCTL_CALL_SUCCESS;
2814 
2815   pRegisterPayload = (tdRegisterPayload_t*)agIOCTLPayload->FunctionSpecificArea;
2816 
2817   tdsaAllShared->tdFWControlEx.buffer = agNULL;
2818   tdsaAllShared->tdFWControlEx.virtAddr = agNULL;
2819   tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2820   tdsaAllShared->tdFWControlEx.len = 0;
2821   tdsaAllShared->tdFWControlEx.param1 = agParam1;
2822   tdsaAllShared->tdFWControlEx.param2 = agParam2;
2823   tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2824   tdsaAllShared->tdFWControlEx.inProgress = 0;
2825 
2826   TI_DBG1(("tdsaRegisterIoctl: Flag %d RegAddr 0x%x RegValue 0x%x\n",
2827             pRegisterPayload->flag, pRegisterPayload->RegAddr, pRegisterPayload->RegValue));
2828 
2829   if (pRegisterPayload->flag)
2830   {
2831     /* set register */
2832     ostiChipWriteBit32Ext(tiRoot, 0, pRegisterPayload->RegAddr, pRegisterPayload->RegValue);
2833   }
2834   else
2835   {
2836     /* get register */
2837     pRegisterPayload->RegValue = ostiChipReadBit32Ext(tiRoot, 0, pRegisterPayload->RegAddr);
2838   }
2839   agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
2840   return status;
2841 }
2842 
2843 osGLOBAL bit32
2844 tdsaGetPhyGeneralStatusIoctl(
2845 				tiRoot_t			      *tiRoot,
2846 				agsaPhyGeneralState_t     *PhyData
2847 				)
2848 {
2849   tdsaRoot_t				*tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2850   tdsaContext_t 			*tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2851   agsaRoot_t				*agRoot = &(tdsaAllShared->agRootNonInt);
2852 //  agsaLLRoot_t	            *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
2853 //  bit8                      totalValidPhys;
2854   bit32 					 status = AGSA_RC_SUCCESS;
2855   bit32                      i = 0;
2856   agsaControllerInfo_t ControllerInfo;
2857   saGetControllerInfo(agRoot,&ControllerInfo);
2858 
2859   TI_DBG3(("tdsaGetPhyGeneralStatusIoctl: start\n"));
2860   do
2861   {
2862     if(tIsSPC(agRoot)||tIsSPCHIL(agRoot))
2863     {
2864   	    status = IOCTL_ERR_STATUS_NOT_SUPPORTED;
2865 		break;
2866     }
2867 
2868     PhyData->Reserved1 = ControllerInfo.phyCount;
2869     for(i=0;i<PhyData->Reserved1;i++)
2870     {
2871       status = saGetPhyProfile( agRoot,agNULL,tdsaRotateQnumber(tiRoot, agNULL), AGSA_SAS_PHY_GENERAL_STATUS_PAGE,i);
2872       if(status == AGSA_RC_FAILURE)
2873 	  {
2874 	    break;
2875 	  }
2876     }
2877   }while(0);
2878   TI_DBG3(("tdsaGetPhyGeneralStatusIoctl: End\n"));
2879   return status;
2880 }
2881 /*****************************************************************************
2882 *
2883 * ostiGetPhyGeneralStatusRsp
2884 *
2885 * Purpose:  This routine is called when a PhyStatus IOCTL response is received.
2886 *
2887 * Parameters:
2888 *   tiRoot:         Pointer to driver instance
2889 *   agsaSASPhyGeneralStatusPage_t:   Status of the phy.
2890 *   bit32:          phyID
2891 *
2892 * Return: none
2893 *
2894 *
2895 *****************************************************************************/
2896 osGLOBAL void ostiGetPhyGeneralStatusRsp(
2897                             tiRoot_t                      *tiRoot,
2898                         	agsaSASPhyGeneralStatusPage_t *GenStatus,
2899                         	bit32                          phyID
2900                             )
2901 {
2902 
2903   tdsaRoot_t               *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
2904   tdsaContext_t            *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2905   tiIOCTLPayload_t         *agIoctlPayload = agNULL;
2906   agsaPhyGeneralState_t    *pSetPhyStatusRes = agNULL;
2907 
2908 
2909   TI_DBG1(("ostiGetPhyGeneralStatusRsp: start\n"));
2910 
2911   if (tdsaAllShared->tdFWControlEx.inProgress)
2912   {
2913       agIoctlPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
2914       if ((agIoctlPayload) && (PMC_IOCTL_SIGNATURE == agIoctlPayload->Signature)&&
2915 	  	                 (IOCTL_MJ_PHY_GENERAL_STATUS == agIoctlPayload->MajorFunction))
2916       {
2917         pSetPhyStatusRes = (agsaPhyGeneralState_t*) &agIoctlPayload->FunctionSpecificArea[0];
2918 		osti_memcpy(&pSetPhyStatusRes->PhyGenData[phyID], GenStatus, sizeof(agsaSASPhyGeneralStatusPage_t));
2919 		pSetPhyStatusRes->Reserved2++;
2920         if(pSetPhyStatusRes->Reserved1 == pSetPhyStatusRes->Reserved2)
2921         {
2922   		  tdsaAllShared->tdFWControlEx.payload = NULL;
2923           ostiIOCTLSetSignal(tiRoot, tdsaAllShared->tdFWControlEx.param1,
2924                           tdsaAllShared->tdFWControlEx.param2, agNULL);
2925 	  tdsaAllShared->tdFWControlEx.inProgress = 0;
2926           agIoctlPayload->Status = IOCTL_ERR_STATUS_OK;
2927 
2928         }
2929   	  }
2930   }
2931 
2932   TI_DBG1(("ostiGetPhyGeneralStatusRsp: end\n"));
2933 }
2934 
2935 
2936 osGLOBAL bit32
2937 tdsaPhyProfileIoctl(
2938                  tiRoot_t            *tiRoot,
2939                  tiIOCTLPayload_t    *agIOCTLPayload,
2940                  void                *agParam1,
2941                  void                *agParam2,
2942                  void                *agParam3
2943                  )
2944 {
2945   tdsaRoot_t       *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
2946   tdsaContext_t    *tdsaAllShared   = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
2947   agsaRoot_t       *agRoot          = &(tdsaAllShared->agRootInt);
2948   void             *buffer = agNULL;
2949   void             *osMemHandle = agNULL;
2950   bit32            status = IOCTL_CALL_SUCCESS;
2951   bit32            retcode = AGSA_RC_FAILURE;
2952   bit32            RequestLength= agIOCTLPayload->Length;
2953   bit32 	   bufAddrUpper = 0;
2954   bit32 	   bufAddrLower = 0;
2955 
2956   tdPhyCount_t     *PhyBlob = (tdPhyCount_t*)&agIOCTLPayload->FunctionSpecificArea[0];
2957 
2958 
2959   if(ostiAllocMemory( tiRoot,
2960       &osMemHandle,
2961       (void **)&buffer,
2962       &bufAddrUpper,
2963       &bufAddrLower,
2964       RequestLength,
2965       RequestLength,
2966       agTRUE))
2967     return IOCTL_CALL_FAIL;
2968 
2969 
2970   tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
2971   tdsaAllShared->tdFWControlEx.virtAddr = buffer;
2972   tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
2973   tdsaAllShared->tdFWControlEx.len = 32;
2974   tdsaAllShared->tdFWControlEx.param1 = agParam1;
2975   tdsaAllShared->tdFWControlEx.param2 = agParam2;
2976   tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
2977   tdsaAllShared->tdFWControlEx.inProgress = 1;
2978 
2979   TI_DBG1(("tdsaPhyProfileIoctl: MinorFunction %d\n",agIOCTLPayload->MinorFunction));
2980 //  PhyBlob->Phy |= 0x100;
2981 
2982   if( tiIS_SPC(agRoot) )
2983   {
2984     TI_DBG1(("tdsaPhyProfileIoctl: SPC operation 0x%x PHY %d\n",agIOCTLPayload->MinorFunction,PhyBlob->Phy));
2985     retcode = saLocalPhyControl(agRoot,agNULL,0 ,PhyBlob->Phy ,agIOCTLPayload->MinorFunction , agNULL);
2986     if(retcode ==  AGSA_RC_SUCCESS)
2987     {
2988       status = IOCTL_CALL_PENDING;
2989     }
2990   }
2991   else
2992   {
2993     TI_DBG1(("tdsaPhyProfileIoctl: SPCv operation 0x%x PHY %d\n",agIOCTLPayload->MinorFunction,PhyBlob->Phy));
2994     retcode = saGetPhyProfile( agRoot,agNULL,0,agIOCTLPayload->MinorFunction , PhyBlob->Phy);
2995 
2996     if(retcode ==  AGSA_RC_SUCCESS)
2997     {
2998       status = IOCTL_CALL_PENDING;
2999     }
3000 
3001   }
3002 
3003   TI_DBG2(("tdsaPhyProfileIoctl: after\n"));
3004 
3005 
3006   return status;
3007 }
3008 
3009 /*****************************************************************************
3010 *
3011 * tdsaForensicDataGetIoctl
3012 *
3013 * Purpose:  This routine is called to get Forensic Data.
3014 *
3015 * Parameters:
3016 *   tiRoot:         Pointer to driver instance
3017 *   agIOCTLPayload: Pointer to the IOCTL payload.
3018 *   agParam1:       Pointer to pass context handle for IOCTL DMA operation
3019 *   agParam2:       Pointer to pass context handle for IOCTL DMA operation
3020 *   agParam3:       Pointer to pass context handle for IOCTL DMA operation
3021 *
3022 * Return:
3023 *
3024 *   IOCTL_CALL_SUCCESS        The requested operation completed successfully.
3025 *   IOCTL_CALL_FAIL           Fail to complete the IOCTL request.
3026 *                             Detail error code is function specific and
3027 *                             defined by the specific IOCTL function.
3028 *   IOCTL_CALL_PENDING        This request is asynchronous and completed
3029 *                             in some other context.
3030 *   IOCTL_CALL_INVALID_CODE   This IOCTL function is not recognized.
3031 *
3032 *
3033 *****************************************************************************/
3034 osGLOBAL bit32
3035 tdsaForensicDataGetIoctl(
3036                  tiRoot_t            *tiRoot,
3037                  tiIOCTLPayload_t    *agIOCTLPayload,
3038                  void                *agParam1,
3039                  void                *agParam2,
3040                  void                *agParam3
3041                  )
3042 {
3043   tdsaRoot_t                  *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
3044   tdsaContext_t               *tdsaAllShared   = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3045   agsaRoot_t                  *agRoot          = &(tdsaAllShared->agRootInt);
3046   tdForensicDataPayload_t     *pForensicDataPayload = agNULL;
3047   agsaForensicData_t           ForensicData;
3048   bit32                        status = IOCTL_CALL_SUCCESS;
3049 
3050   pForensicDataPayload = (tdForensicDataPayload_t*)agIOCTLPayload->FunctionSpecificArea;
3051 
3052   tdsaAllShared->tdFWControlEx.buffer = agNULL;
3053   tdsaAllShared->tdFWControlEx.virtAddr = agNULL;
3054   tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
3055   tdsaAllShared->tdFWControlEx.len = 0;
3056   tdsaAllShared->tdFWControlEx.param1 = agParam1;
3057   tdsaAllShared->tdFWControlEx.param2 = agParam2;
3058   tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
3059   tdsaAllShared->tdFWControlEx.inProgress = 0;
3060 
3061   osti_memset(&ForensicData, 0, sizeof(agsaForensicData_t));
3062 
3063   ForensicData.DataType = pForensicDataPayload->DataType;
3064 
3065   switch (ForensicData.DataType)
3066   {
3067     case FORENSIC_DATA_TYPE_NON_FATAL:
3068     case FORENSIC_DATA_TYPE_FATAL:
3069          ForensicData.BufferType.dataBuf.directLen = pForensicDataPayload->dataBuffer.directLen;
3070          ForensicData.BufferType.dataBuf.directOffset = pForensicDataPayload->dataBuffer.directOffset;
3071          ForensicData.BufferType.dataBuf.readLen = pForensicDataPayload->dataBuffer.readLen;
3072          ForensicData.BufferType.dataBuf.directData = (void*)pForensicDataPayload->dataBuffer.directData;
3073 		 break;
3074     case FORENSIC_DATA_TYPE_GSM_SPACE:
3075          ForensicData.BufferType.gsmBuf.directLen = pForensicDataPayload->gsmBuffer.directLen;
3076          ForensicData.BufferType.gsmBuf.directOffset = pForensicDataPayload->gsmBuffer.directOffset;
3077          ForensicData.BufferType.dataBuf.readLen      = pForensicDataPayload->gsmBuffer.readLen;
3078          ForensicData.BufferType.gsmBuf.directData = (void*)pForensicDataPayload->gsmBuffer.directData;
3079          break;
3080 
3081     case FORENSIC_DATA_TYPE_IB_QUEUE:
3082          ForensicData.BufferType.queueBuf.directLen = pForensicDataPayload->queueBuffer.directLen;
3083          //ForensicData.BufferType.queueBuf.queueType = pForensicDataPayload->queueBuffer.queueType;
3084          ForensicData.BufferType.queueBuf.queueType = FORENSIC_DATA_TYPE_IB_QUEUE;
3085          ForensicData.BufferType.queueBuf.queueIndex = pForensicDataPayload->queueBuffer.queueIndex;
3086          ForensicData.BufferType.queueBuf.directData = (void*)pForensicDataPayload->queueBuffer.directData;
3087          break;
3088     case FORENSIC_DATA_TYPE_OB_QUEUE:
3089          ForensicData.BufferType.queueBuf.directLen = pForensicDataPayload->queueBuffer.directLen;
3090          ForensicData.BufferType.queueBuf.queueType = FORENSIC_DATA_TYPE_OB_QUEUE;
3091          ForensicData.BufferType.queueBuf.queueIndex = pForensicDataPayload->queueBuffer.queueIndex;
3092          ForensicData.BufferType.queueBuf.directData = (void*)pForensicDataPayload->queueBuffer.directData;
3093          break;
3094 
3095     default:
3096          TI_DBG1(("tdsaGetForensicDataIoctl: forensic data type error %d\n", pForensicDataPayload->DataType));
3097          status = IOCTL_CALL_INVALID_CODE;
3098          return status;
3099   }
3100 
3101   if ( saGetForensicData(agRoot, agNULL, &ForensicData) != AGSA_RC_SUCCESS )
3102   {
3103     status = IOCTL_CALL_FAIL;
3104   }
3105 
3106   return status;
3107 }
3108 
3109 osGLOBAL bit32
3110 tdsaSendSMPIoctl(
3111                 tiRoot_t            *tiRoot,
3112                 tiIOCTLPayload_t    *agIOCTLPayload,
3113                 void                *agParam1,
3114                 void                *agParam2,
3115                 void                *agParam3
3116                 )
3117 {
3118 	tdsaRoot_t		*tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3119 	tdsaContext_t	*tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3120 	agsaRoot_t		*agRoot = &(tdsaAllShared->agRootInt);
3121 	void			*reqBuffer = agNULL;
3122 	void			*respBuffer = agNULL;
3123 	void			*osMemHandle = agNULL;
3124 	bit32			status = IOCTL_CALL_SUCCESS;
3125 //	bit32			Offset = 0;
3126 //	bit32			RequestLength = 0;
3127 	bit32			ostiMemoryStatus = 0;
3128 	smp_pass_through_req_t *smp_pass_through_req;
3129 
3130 	tiDeviceHandle_t *devHandle;
3131 	agsaSMPFrame_t			  agSMPFrame;
3132 	tdsaDeviceData_t          *oneDeviceData = agNULL;
3133 	bit32 i;
3134 
3135 	TI_DBG2(("tdsaSendSMPIoctl: start\n"));
3136 
3137  	smp_pass_through_req = (smp_pass_through_req_t*)agIOCTLPayload->FunctionSpecificArea;
3138 
3139 	for(i=0;i<8;i++)
3140 		TI_DBG2(("SAS Address[%d]:%x",i,smp_pass_through_req->exp_sas_addr[i]));
3141 	TI_DBG2(("SAS Request Length:%d",smp_pass_through_req->smp_req_len));
3142 	TI_DBG2(("SAS Response Length:%d",smp_pass_through_req->smp_resp_len));
3143 	for(i=0;i<smp_pass_through_req->smp_req_len;i++)
3144 		TI_DBG2(("SAS request + %d:%x",i,smp_pass_through_req->smp_req_resp[i]));
3145 
3146 	devHandle = ostiGetDevHandleFromSasAddr(tiRoot, smp_pass_through_req->exp_sas_addr);
3147 	if(devHandle == NULL)
3148 	{
3149 		status = IOCTL_CALL_FAIL;
3150 		agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
3151 		return status;
3152 	}
3153 
3154 
3155 
3156 	//agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
3157 	agIOCTLPayload->Status = IOCTL_ERR_STATUS_NOT_RESPONDING;
3158 
3159 
3160 
3161 	if((ostiMemoryStatus != tiSuccess) && (reqBuffer == agNULL  ))
3162 			return IOCTL_CALL_FAIL;
3163 
3164 
3165     tdsaAllShared->tdFWControlEx.param3 = osMemHandle;
3166 
3167 
3168 	agSMPFrame.outFrameBuf = smp_pass_through_req->smp_req_resp;
3169 	agSMPFrame.expectedRespLen = smp_pass_through_req->smp_resp_len;
3170 	agSMPFrame.inFrameLen = smp_pass_through_req->smp_resp_len - 4;
3171 
3172 	if(!(smp_pass_through_req->smp_req_len - 8) && !tiIS_SPC(agRoot))
3173 	{
3174 		agSMPFrame.flag = 1;  // Direct request Indirect response
3175 		agSMPFrame.outFrameLen = smp_pass_through_req->smp_req_len - 4; //Exclude header
3176 	}
3177 	else
3178 	{
3179 
3180 		agSMPFrame.flag = 3;  //Indirect request and Indirect response
3181 		ostiMemoryStatus = ostiAllocMemory( tiRoot,
3182 										  &osMemHandle,
3183 										  (void **)&reqBuffer,
3184 										  &(agSMPFrame.outFrameAddrUpper32),
3185 										  &(agSMPFrame.outFrameAddrLower32),
3186 										  8,
3187 										  smp_pass_through_req->smp_req_len,
3188 										  agFALSE);
3189 		tdsaAllShared->tdFWControlEx.param3 = osMemHandle;
3190 		if(tiIS_SPC(agRoot))
3191 		{
3192 		  agSMPFrame.outFrameLen = smp_pass_through_req->smp_req_len - 4; //Exclude crc
3193 		  osti_memcpy((void *)reqBuffer, (void *)(smp_pass_through_req->smp_req_resp), smp_pass_through_req->smp_req_len);
3194 		}
3195 		else
3196 		{
3197 		  agSMPFrame.outFrameLen = smp_pass_through_req->smp_req_len - 8; //Exclude header and crc
3198 		  osti_memcpy((void *)reqBuffer, (void *)(smp_pass_through_req->smp_req_resp + 4), smp_pass_through_req->smp_req_len - 4);
3199 		}
3200 	}
3201 
3202 	ostiMemoryStatus = ostiAllocMemory( tiRoot,
3203 										  &osMemHandle,
3204 										  (void **)&respBuffer,
3205 										  &(agSMPFrame.inFrameAddrUpper32),
3206 										  &(agSMPFrame.inFrameAddrLower32),
3207 										  8,
3208 										  smp_pass_through_req->smp_resp_len + 4,
3209 										  agFALSE);
3210 	if((ostiMemoryStatus != tiSuccess) && (respBuffer == agNULL  ))
3211 			return IOCTL_CALL_FAIL;
3212 
3213 
3214 	osti_memset((void *)respBuffer, 0, smp_pass_through_req->smp_resp_len);
3215 
3216 		// use FW control place in shared structure to keep the neccesary information
3217 	tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
3218 	tdsaAllShared->tdFWControlEx.virtAddr = respBuffer;
3219 	tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)smp_pass_through_req->smp_req_resp + smp_pass_through_req->smp_req_len;
3220 	tdsaAllShared->tdFWControlEx.len = smp_pass_through_req->smp_resp_len;
3221 	tdsaAllShared->tdFWControlEx.param1 = agParam1;
3222 	tdsaAllShared->tdFWControlEx.param2 = agParam2;
3223 	tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
3224 	tdsaAllShared->tdFWControlEx.inProgress = 1;
3225 	status = IOCTL_CALL_PENDING;
3226 
3227 	oneDeviceData = (tdsaDeviceData_t *)devHandle->tdData;
3228 	if(saSendSMPIoctl(agRoot, oneDeviceData->agDevHandle, 0, &agSMPFrame, &ossaSMPIoctlCompleted) != AGSA_RC_SUCCESS)
3229 	{
3230 	  status = IOCTL_CALL_FAIL;
3231 	  agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
3232 	}
3233 	return status;
3234 }
3235 
3236 osGLOBAL void ostiSendSMPIOCTLRsp(
3237                         tiRoot_t            *tiRoot,
3238                         bit32               status
3239                         )
3240 {
3241     tdsaRoot_t           *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3242     tdsaContext_t        *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3243     tiIOCTLPayload_t     *agIOCTLPayload;
3244 
3245     agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
3246     agIOCTLPayload->Status = (bit16)status;
3247 
3248     TI_DBG1(("ostiSendSMPIOCTLRsp: start, status = %d\n", status));
3249 
3250 //	if(tdsaAllShared->tdFWControlEx.param1 != agNULL)
3251 //	{
3252       osti_memcpy((void *)(tdsaAllShared->tdFWControlEx.usrAddr),
3253                   (void *)(tdsaAllShared->tdFWControlEx.virtAddr),
3254                   tdsaAllShared->tdFWControlEx.len);
3255 //	}
3256 	ostiFreeMemory(tiRoot,
3257                    tdsaAllShared->tdFWControlEx.buffer,
3258                    tdsaAllShared->tdFWControlEx.len);
3259 	ostiFreeMemory(tiRoot,
3260                    tdsaAllShared->tdFWControlEx.param3,
3261                    tdsaAllShared->tdFWControlEx.len);
3262     //if(tdsaAllShared->tdFWControlEx.param1 != agNULL)
3263 //	{
3264       ostiIOCTLComplete(tiRoot,
3265                          tdsaAllShared->tdFWControlEx.param1,
3266                          tdsaAllShared->tdFWControlEx.param2,
3267                          NULL);
3268 //    }
3269 }
3270 
3271 
3272 
3273 
3274 /*****************************************************************************
3275 *
3276 * tdsaSendBISTIoctl
3277 *
3278 * Purpose:  This routine is called to get Forensic Data.
3279 *
3280 * Parameters:
3281 *   tiRoot:         Pointer to driver instance
3282 *   agIOCTLPayload: Pointer to the IOCTL payload.
3283 *   agParam1:       Pointer to pass context handle for IOCTL DMA operation
3284 *   agParam2:       Pointer to pass context handle for IOCTL DMA operation
3285 *   agParam3:       Pointer to pass context handle for IOCTL DMA operation
3286 *
3287 * Return:
3288 *
3289 *   IOCTL_CALL_SUCCESS        The requested operation completed successfully.
3290 *   IOCTL_CALL_FAIL           Fail to complete the IOCTL request.
3291 *                             Detail error code is function specific and
3292 *                             defined by the specific IOCTL function.
3293 *   IOCTL_CALL_PENDING        This request is asynchronous and completed
3294 *                             in some other context.
3295 *   IOCTL_CALL_INVALID_CODE   This IOCTL function is not recognized.
3296 *
3297 *
3298 *****************************************************************************/
3299 osGLOBAL bit32
3300 tdsaSendBISTIoctl(
3301                  tiRoot_t            *tiRoot,
3302                  tiIOCTLPayload_t    *agIOCTLPayload,
3303                  void                *agParam1,
3304                  void                *agParam2,
3305                  void                *agParam3
3306                  )
3307 {
3308   tdsaRoot_t      *tdsaRoot        = (tdsaRoot_t *) tiRoot->tdData;
3309   tdsaContext_t   *tdsaAllShared   = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3310   agsaRoot_t      *agRoot          = &(tdsaAllShared->agRootInt);
3311   tdBistPayload_t *pBistPayload;
3312 //  bit32            length = 0;
3313 //  bit32            status = IOCTL_CALL_SUCCESS;
3314   bit32            status = IOCTL_CALL_FAIL;
3315 
3316   pBistPayload = (tdBistPayload_t*)agIOCTLPayload->FunctionSpecificArea;
3317 
3318   tdsaAllShared->tdFWControlEx.buffer = agNULL;
3319   tdsaAllShared->tdFWControlEx.virtAddr = agNULL;
3320   tdsaAllShared->tdFWControlEx.usrAddr = (bit8*)&agIOCTLPayload->FunctionSpecificArea[0];
3321   tdsaAllShared->tdFWControlEx.len = 0;
3322   tdsaAllShared->tdFWControlEx.param1 = agParam1;
3323   tdsaAllShared->tdFWControlEx.param2 = agParam2;
3324   tdsaAllShared->tdFWControlEx.payload = agIOCTLPayload;
3325   tdsaAllShared->tdFWControlEx.inProgress = 0;
3326 
3327   TI_DBG1(("tdsaSendBISTIoctl: Type %d Length %d Data %p\n",
3328       pBistPayload->testType,
3329       pBistPayload->testLength,
3330       pBistPayload->testData ));
3331 
3332 
3333   // pBistPayload->testtype = AGSA_BIST_TEST;
3334 
3335   if( pBistPayload->testType == AGSA_BIST_TEST)
3336   {
3337     if( pBistPayload->testLength != sizeof(agsaEncryptSelfTestBitMap_t))
3338     {
3339       return status;
3340     }
3341   }
3342   else if( pBistPayload->testType == AGSA_SHA_TEST)
3343   {
3344     if( pBistPayload->testLength != sizeof(agsaEncryptSHATestDescriptor_t) )
3345     {
3346       return status;
3347     }
3348   }
3349   else if( pBistPayload->testType == AGSA_HMAC_TEST )
3350   {
3351     if( pBistPayload->testLength != sizeof(agsaEncryptHMACTestDescriptor_t))
3352     {
3353       return status;
3354     }
3355   }
3356 
3357 /*
3358 GLOBAL bit32 saEncryptSelftestExecute(
3359                         agsaRoot_t    *agRoot,
3360                         agsaContext_t *agContext,
3361                         bit32         queueNum,
3362                         bit32         type,
3363                         bit32         length,
3364                         void          *TestDescriptor);
3365 
3366 */
3367   if ( saEncryptSelftestExecute(agRoot,
3368         agNULL,
3369         0,
3370         pBistPayload->testType,
3371         pBistPayload->testLength,
3372         pBistPayload->testData  ) != AGSA_RC_SUCCESS )
3373   {
3374     status = IOCTL_CALL_FAIL;
3375   }
3376 
3377   return status;
3378 }
3379 
3380 
3381 osGLOBAL bit32
3382 tdsaSendTMFIoctl( tiRoot_t	     	*tiRoot,
3383 		  tiIOCTLPayload_t	*agIOCTLPayload,
3384 		  void                  *agParam1,
3385 		  void			*agParam2,
3386 		  unsigned long		resetType
3387 		)
3388 {
3389 	bit32		status;
3390 	tmf_pass_through_req_t  *tmf_req = (tmf_pass_through_req_t*)agIOCTLPayload->FunctionSpecificArea;
3391 #if !(defined(__FreeBSD__))
3392 	status = ostiSendResetDeviceIoctl(tiRoot, agParam2, tmf_req->pathId, tmf_req->targetId, tmf_req->lun, resetType);
3393 #endif
3394 	TI_DBG3(("Status returned from ostiSendResetDeviceIoctl is %d\n",status));
3395 	if(status !=  IOCTL_CALL_SUCCESS)
3396 	{
3397 		agIOCTLPayload->Status = status;
3398 		return status;
3399 	}
3400 	status = IOCTL_CALL_SUCCESS;
3401 	return status;
3402 }
3403 
3404 
3405 #ifdef VPD_TESTING
3406 /* temporary to test saSetVPDCommand() and saGetVPDCommand */
3407 osGLOBAL bit32
3408 tdsaVPDSet(
3409                 tiRoot_t            *tiRoot
3410                 )
3411 {
3412   tdsaRoot_t    *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3413   tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3414   agsaRoot_t    *agRoot = &(tdsaAllShared->agRootInt);
3415   bit32         status = IOCTL_CALL_SUCCESS;
3416   agsaVPD_t     VPDInfo;
3417   bit32         ret = AGSA_RC_SUCCESS;
3418 
3419   bit32                 bufAddrUpper = 0;
3420   bit32                 bufAddrLower = 0;
3421   tdVPDControl_t        *VPDControl;
3422 
3423   void                  *osMemHandle = agNULL;
3424   void                  *buffer;
3425   bit32                 timeCount=0;
3426   bit8                  ioctlErr=0;
3427   bit8                  VPDPayload[32];
3428   bit8                  i;
3429   TI_DBG2(("tdsaVPDSet: start\n"));
3430 
3431   for(i=0;i<sizeof(VPDPayload);i++)
3432   {
3433     VPDPayload[i] = i;
3434   }
3435   if(ostiAllocMemory( tiRoot,
3436                         &osMemHandle,
3437                         (void **)&buffer,
3438                         &bufAddrUpper,
3439                         &bufAddrLower,
3440                         8,
3441                         sizeof(VPDPayload),
3442                         agFALSE))
3443   {
3444     return tiError;
3445   }
3446   osti_memcpy((void *)buffer,
3447                VPDPayload,
3448                sizeof(VPDPayload));
3449 
3450 
3451   osti_memset(&VPDInfo, 0, sizeof(agsaVPD_t));
3452 #ifdef NOT_YET /* direct mode worked */
3453   /* For now, only direct mode */
3454   VPDInfo.indirectMode = 0; /* direct mode */
3455   VPDInfo.VPDDevice = 1; /* SEEPROM-1 */
3456   VPDInfo.directLen  = (bit8)sizeof(VPDPayload);
3457   VPDInfo.VPDOffset = 0;
3458   VPDInfo.directData = buffer;
3459   VPDInfo.indirectAddrUpper32 = bufAddrUpper;
3460   VPDInfo.indirectAddrLower32 = bufAddrLower;
3461   VPDInfo.indirectLen = sizeof(VPDPayload);
3462 #endif
3463 
3464   /* indirect mode */
3465   VPDInfo.indirectMode = 1; /* indirect mode */
3466   VPDInfo.VPDDevice = 1; /* SEEPROM-1 */
3467   VPDInfo.directLen  = 0;
3468   VPDInfo.VPDOffset = 0;
3469   VPDInfo.directData = agNULL;
3470   VPDInfo.indirectAddrUpper32 = bufAddrUpper;
3471   VPDInfo.indirectAddrLower32 = bufAddrLower;
3472   VPDInfo.indirectLen = sizeof(VPDPayload);
3473 
3474   tdsaAllShared->tdFWControlEx.buffer = osMemHandle;
3475   tdsaAllShared->tdFWControlEx.param1 = agParam1;
3476   tdsaAllShared->tdFWControlEx.param2 = agParam2;
3477 
3478   /* for testing only */
3479   tdsaAllShared->addrUpper = bufAddrUpper;
3480   tdsaAllShared->addrLower = bufAddrLower;
3481 
3482   ret = saSetVPDCommand(agRoot, agNULL, 0, &VPDInfo);
3483 
3484   if (ret == AGSA_RC_SUCCESS)
3485   {
3486     status = tiSuccess;
3487   }
3488   else
3489   {
3490     status = tiError;
3491   }
3492 
3493     ostiFreeMemory(tiRoot, osMemHandle, sizeof(VPDPayload));
3494   return status;
3495 }
3496 
3497 /* temporary to test saSetVPDCommand() and saGetVPDCommand */
3498 osGLOBAL bit32
3499 tdsaVPDGet(tiRoot_t            *tiRoot)
3500 {
3501   tdsaRoot_t    *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3502   tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3503   agsaRoot_t    *agRoot = &(tdsaAllShared->agRootInt);
3504   bit32         status = IOCTL_CALL_SUCCESS;
3505   agsaVPD_t     VPDInfo;
3506   bit32         ret = AGSA_RC_SUCCESS;
3507 
3508 
3509   TI_DBG2(("tdsaVPDGet: start\n"));
3510 
3511   osti_memset(&VPDInfo, 0, sizeof(agsaVPD_t));
3512 
3513   /* direct mode worked */
3514   VPDInfo.indirectMode = 0; /* direct mode */
3515   VPDInfo.VPDDevice = 1; /* SEEPROM-1*/
3516   VPDInfo.directLen  = 32;
3517   VPDInfo.VPDOffset = 0;
3518   VPDInfo.directData = agNULL;
3519   VPDInfo.indirectAddrUpper32 = 0;
3520   VPDInfo.indirectAddrLower32 = 0;
3521   VPDInfo.indirectLen = 0;
3522 
3523 
3524 #ifdef NOT_YET /* worked; can't read VPD in ossaGetVPDResponseCB() because of indirect */
3525   VPDInfo.indirectMode = 1; /* direct mode */
3526   VPDInfo.VPDDevice = 1; /* SEEPROM-1*/
3527   VPDInfo.directLen  = 0;
3528   VPDInfo.VPDOffset = 0;
3529   VPDInfo.directData = agNULL;
3530   VPDInfo.indirectAddrUpper32 = tdsaAllShared->addrUpper;
3531   VPDInfo.indirectAddrLower32 = tdsaAllShared->addrLower;
3532   VPDInfo.indirectLen = 32;
3533 #endif
3534   ret = saGetVPDCommand(agRoot, agNULL, 0, &VPDInfo);
3535 
3536   if (ret == AGSA_RC_SUCCESS)
3537   {
3538     status = tiSuccess;
3539   }
3540   else
3541   {
3542     status = tiError;
3543   }
3544   return status;
3545 }
3546 #endif
3547 /*****************************************************************************
3548 *
3549 * tdsaGetNumOfLUNIOCTL
3550 *
3551 * Purpose:  This routine is called to send Report LUN SSP command request.
3552 *
3553 * Parameters:
3554 *   tiRoot:         Pointer to driver instance
3555 *   tiIOCTLPayload_t:        Status of the Controller Reset.
3556 *   agParam1:        Void pointer to device extension
3557 *   agParam2:        Void pointer to SRB
3558 *   agParam3:        NULL
3559 *
3560 *   Return: status
3561 *
3562 *
3563 *****************************************************************************/
3564 osGLOBAL bit32
3565 tdsaGetNumOfLUNIOCTL(
3566                tiRoot_t            *tiRoot,
3567                tiIOCTLPayload_t    *agIOCTLPayload,
3568                void                *agParam1,
3569                void                *agParam2,
3570                void                *agParam3
3571                )
3572 {
3573   tdsaRoot_t	              *tdsaRoot			= (tdsaRoot_t *) tiRoot->tdData;
3574   tdsaContext_t               *tdsaAllShared 	= (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3575   agsaRoot_t	              *agRoot 			= &(tdsaAllShared->agRootInt);
3576   tdDeviceLUNInfoIOCTL_t	  *pDeviceLUNInfo	= agNULL;
3577   tiDeviceHandle_t            *devHandle 		= agNULL;
3578   void				          *tiRequestBody 	= agNULL;
3579   tiIORequest_t 	          *tiIORequest 		= agNULL;
3580   bit32			              status 			= IOCTL_CALL_SUCCESS;
3581 
3582   TI_DBG2(("tdsaGetNumOfLUNIOCTL: Start\n"));
3583   do
3584   {
3585     pDeviceLUNInfo = (tdDeviceLUNInfoIOCTL_t*)agIOCTLPayload->FunctionSpecificArea;
3586 
3587     if (agIOCTLPayload->Length < sizeof(tdDeviceLUNInfoIOCTL_t))
3588     {
3589   	  status = IOCTL_CALL_FAIL;
3590   	  break;
3591     }
3592     if(!pDeviceLUNInfo->tiDeviceHandle)
3593     {
3594       status = IOCTL_CALL_FAIL;
3595       agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
3596       break;
3597     }
3598 	devHandle = (tiDeviceHandle_t*)pDeviceLUNInfo->tiDeviceHandle;
3599 	agIOCTLPayload->Status = IOCTL_ERR_STATUS_OK;
3600 
3601 	status = ostiNumOfLUNIOCTLreq(tiRoot,agParam1,agParam2,&tiRequestBody,&tiIORequest);
3602 
3603 
3604     if(status != AGSA_RC_SUCCESS)
3605     {
3606       agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
3607 	  break;
3608     }
3609     status = tiNumOfLunIOCTLreq(tiRoot,tiIORequest,devHandle,tiRequestBody,agIOCTLPayload,agParam1,agParam2);
3610 
3611     if(status != AGSA_RC_SUCCESS)
3612     {
3613          agIOCTLPayload->Status = IOCTL_ERR_STATUS_INTERNAL_ERROR;
3614 	  break;
3615     }
3616 //	ostiIOCTLWaitForSignal (tiRoot, agParam1, agParam2, agParam3);
3617 
3618   }while(0);
3619   TI_DBG2(("tdsaGetNumOfLUNIOCTL: End\n"));
3620   return status;
3621 }
3622 
3623 
3624 /*****************************************************************************
3625 *
3626 * ostiNumOfLUNIOCTLRsp
3627 *
3628 * Purpose:  This routine is called when a Report LUN SSP command response id recieved.
3629 *
3630 * Parameters:
3631 *   tiRoot:         Pointer to driver instance
3632 *   bit32               status
3633 *
3634 * Return: none
3635 *
3636 *
3637 *****************************************************************************/
3638 osGLOBAL void ostiNumOfLUNIOCTLRsp(
3639                         tiRoot_t            *tiRoot,
3640                         bit32               status
3641                         )
3642 {
3643   tdsaRoot_t                  *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
3644   tdsaContext_t               *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
3645   tiIOCTLPayload_t            *agIOCTLPayload;
3646   tdDeviceLUNInfoIOCTL_t	  *pDeviceLUNInfo = NULL;
3647   bit32                       count = 0;
3648   bit32                       numOfLUN =0;
3649 
3650   TI_DBG1(("ostiNumOfLUNIOCTLRsp: start, status = %d\n", status));
3651 
3652   if(tdsaAllShared->tdFWControlEx.inProgress == 1)
3653   {
3654     agIOCTLPayload = (tiIOCTLPayload_t *)(tdsaAllShared->tdFWControlEx.payload);
3655 	if ((agIOCTLPayload) && (PMC_IOCTL_SIGNATURE == agIOCTLPayload->Signature)&&
3656 					   (IOCTL_MJ_GET_DEVICE_LUN == agIOCTLPayload->MajorFunction))
3657 	{
3658       agIOCTLPayload->Status = (bit16)status;
3659       pDeviceLUNInfo = (tdDeviceLUNInfoIOCTL_t*)agIOCTLPayload->FunctionSpecificArea;
3660       numOfLUN = ((tdsaAllShared->tdFWControlEx.virtAddr[0] << 24)|(tdsaAllShared->tdFWControlEx.virtAddr[1] << 16)|\
3661                  (tdsaAllShared->tdFWControlEx.virtAddr[2] << 8)|(tdsaAllShared->tdFWControlEx.virtAddr[3]));
3662       numOfLUN = numOfLUN/8;
3663       pDeviceLUNInfo->numOfLun = numOfLUN;
3664 //	  ostiFreeMemory(tiRoot,
3665 //                     tdsaAllShared->tdFWControlEx.virtAddr,
3666 //                     tdsaAllShared->tdFWControlEx.len);
3667   //    if(tdsaAllShared->tdFWControlEx.param1 != agNULL)
3668   //    {
3669         ostiIOCTLSetSignal(tiRoot,
3670                            tdsaAllShared->tdFWControlEx.param1,
3671                            tdsaAllShared->tdFWControlEx.param2,
3672                            NULL);
3673   	    tdsaAllShared->tdFWControlEx.payload = NULL;
3674   //    }
3675 
3676 	  tdsaAllShared->tdFWControlEx.inProgress = 0;
3677 	}
3678   }
3679   TI_DBG1(("ostiNumOfLUNIOCTLRsp: End\n"));
3680 }
3681 
3682