Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
/*******************************************************************************
*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved. 
*
*Redistribution and use in source and binary forms, with or without modification, are permitted provided 
*that the following conditions are met: 
*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
*following disclaimer. 
*2. Redistributions in binary form must reproduce the above copyright notice, 
*this list of conditions and the following disclaimer in the documentation and/or other materials provided
*with the distribution. 
*
*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 
*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*
* $FreeBSD$
*
*******************************************************************************/
/*****************************************************************************
*
*   tdioctl.h
*
*   Abstract:   This module contains data structure definition used
*               by the Transport Dependent (TD) Layer IOCTL.
*
*
*   Notes:
*
*
** MODIFICATION HISTORY ******************************************************
*
* NAME        DATE        DESCRIPTION
* ----        ----        -----------
* IWN         12/11/02     Initial creation.
*
*
*****************************************************************************/


#ifndef TD_IOCTL_H

#define TD_IOCTL_H

//#include "global.h"

/*
 * PMC-Sierra IOCTL signature
 */
#define PMC_SIERRA_SIGNATURE                0x1234
#define PMC_SIERRA_IOCTL_SIGNATURE          "PMC-STRG"

/*
 * Major function code of IOCTL functions, common to target and initiator.
 */
#define IOCTL_MJ_CARD_PARAMETER             0x01
#define IOCTL_MJ_FW_CONTROL                 0x02
#define IOCTL_MJ_NVMD_GET                   0x03
#define IOCTL_MJ_NVMD_SET                   0x04
#define IOCTL_MJ_GET_EVENT_LOG1             0x05
#define IOCTL_MJ_GET_EVENT_LOG2             0x06
#define IOCTL_MJ_GET_CORE_DUMP              0x07
#define IOCTL_MJ_LL_TRACING                 0x08
#define IOCTL_MJ_FW_PROFILE                 0x09
#define IOCTL_MJ_MNID                       0x0A
#define IOCTL_MJ_ENCRYPTION_CTL             0x0B

#define IOCTL_MJ_FW_INFO                    0x0C

#define IOCTL_MJ_LL_API_TEST                0x11
#define IOCTL_MJ_CHECK_DPMC_EVENT           0x16
#define IOCTL_MJ_GET_FW_REV                 0x1A
#define IOCTL_MJ_GET_DEVICE_INFO            0x1B
#define IOCTL_MJ_GET_IO_ERROR_STATISTIC     0x1C
#define IOCTL_MJ_GET_IO_EVENT_STATISTIC     0x1D
#define IOCTL_MJ_GET_FORENSIC_DATA          0x1E
#define IOCTL_MJ_GET_DEVICE_LIST            0x1F
#define IOCTL_MJ_SMP_REQUEST				0x6D
#define IOCTL_MJ_GET_DEVICE_LUN               0x7A1
#define IOCTL_MJ_PHY_GENERAL_STATUS           0x7A6
#define IOCTL_MJ_PHY_DETAILS           	      0x7A7
#define IOCTL_MJ_SEND_BIST                  0x20
#define IOCTL_MJ_CHECK_FATAL_ERROR          0x70
#define IOCTL_MJ_FATAL_ERROR_DUMP_COMPLETE  0x71
#define IOCTL_MJ_GPIO                       0x41
#define IOCTL_MJ_SGPIO                      0x42
#define IOCTL_MJ_SEND_TMF					0x6E
#define	IOCTL_MJ_FATAL_ERROR_SOFT_RESET_TRIG 0x72
#define	IOCTL_MJ_FATAL_ERR_CHK_RET_FALSE    0x76
#define	IOCTL_MJ_FATAL_ERR_CHK_SEND_FALSE   0x76
#define	IOCTL_MJ_FATAL_ERR_CHK_SEND_TRUE    0x77


/*
 * Major function code of IOCTL functions, specific to initiator.
 */
#define IOCTL_MJ_INI_ISCSI_DISCOVERY        0x21
#define IOCTL_MJ_INI_SESSION_CONTROL        0x22
#define IOCTL_MJ_INI_SNIA_IMA               0x23
#define IOCTL_MJ_INI_SCSI                   0x24
#define IOCTL_MJ_INI_WMI                    0x25
#define IOCTL_MJ_INI_DRIVER_EVENT_LOG       0x26
#define IOCTL_MJ_INI_PERSISTENT_BINDING     0x27
#define IOCTL_MJ_INI_DRIVER_IDENTIFY        0x28

/* temp */
#define IOCTL_MJ_PORT_STOP        0x29
#define IOCTL_MJ_PORT_START       0x30

/* SPCv controller configuration page commands */
#define IOCTL_MJ_MODE_CTL_PAGE              0x40

#define IOCTL_MJ_SET_OR_GET_REGISTER        0x41

#define IOCTL_MJ_GET_PHY_PROFILE            0x44
#define IOCTL_MJ_SET_PHY_PROFILE            0x43

#define IOCTL_MJ_GET_DRIVER_VERSION         0x101

#define IOCTL_MN_PHY_PROFILE_COUNTERS        0x01
#define IOCTL_MN_PHY_PROFILE_COUNTERS_CLR    0x02
#define IOCTL_MN_PHY_PROFILE_BW_COUNTERS     0x03
#define IOCTL_MN_PHY_PROFILE_ANALOG_SETTINGS 0x04

/* 
 * Minor functions for Card parameter IOCTL functions.
 */
#define IOCTL_MN_CARD_GET_VPD_INFO              0x01
#define IOCTL_MN_CARD_GET_PORTSTART_INFO        0x02
#define IOCTL_MN_CARD_GET_INTERRUPT_CONFIG      0x03
#define IOCTL_MN_CARD_GET_PHY_ANALOGSETTING     0x04
#define IOCTL_MN_CARD_GET_TIMER_CONFIG          0x05
#define IOCTL_MN_CARD_GET_TYPE_FATAL_DUMP       0x06

/*
 * Minor functions for FW control IOCTL functions.
 */

/* Send FW data requests.
 */
#define IOCTL_MN_FW_DOWNLOAD_DATA         0x01

/* Send the request for burning the new firmware.
 */
#define IOCTL_MN_FW_DOWNLOAD_BURN         0x02

/* Poll for the flash burn phases. Sequences of poll function calls are
 * needed following the IOCTL_MN_FW_DOWNLOAD_BURN, IOCTL_MN_FW_BURN_OSPD
 * and IOCTL_MN_FW_ROLL_BACK_FW functions.
 */
#define IOCTL_MN_FW_BURN_POLL             0x03

/* Instruct the FW to roll back FW to prior revision.
 */
#define IOCTL_MN_FW_ROLL_BACK_FW          0x04

/* Instruct the FW to return the current firmware revision number.
 */
#define IOCTL_MN_FW_VERSION               0x05

/* Retrieve the maximum size of the OS Persistent Data stored on the card.
 */
#define IOCTL_MN_FW_GET_OSPD_SIZE   0x06

/*  Retrieve the OS Persistent Data from the card.
 */
#define IOCTL_MN_FW_GET_OSPD              0x07

/* Send a new OS Persistent Data to the card and burn in flash.
 */
#define IOCTL_MN_FW_BURN_OSPD           0x08

/* Retrieve the trace buffer from the card FW. Only available on the debug
 * version of the FW.
 */
#define IOCTL_MN_FW_GET_TRACE_BUFFER            0x0f

#define IOCTL_MN_NVMD_GET_CONFIG                0x0A
#define IOCTL_MN_NVMD_SET_CONFIG                0x0B

#define IOCTL_MN_FW_GET_CORE_DUMP_AAP1          0x0C
#define IOCTL_MN_FW_GET_CORE_DUMP_IOP           0x0D
#define IOCTL_MN_FW_GET_CORE_DUMP_FLASH_AAP1    0x12
#define IOCTL_MN_FW_GET_CORE_DUMP_FLASH_IOP     0x13

#define IOCTL_MN_LL_RESET_TRACE_INDEX           0x0e
#define IOCTL_MN_LL_GET_TRACE_BUFFER_INFO       0x0f
#define IOCTL_MN_LL_GET_TRACE_BUFFER            0x10

#define IOCTL_MN_ENCRYPTION_GET_INFO          0x13
#define IOCTL_MN_ENCRYPTION_SET_MODE          0x14
#define IOCTL_MN_ENCRYPTION_KEK_ADD           0x15
#define IOCTL_MN_ENCRYPTION_DEK_ADD           0x16
#define IOCTL_MN_ENCRYPTION_DEK_INVALID       0x17
#define IOCTL_MN_ENCRYPTION_KEK_NVRAM         0x18
#define IOCTL_MN_ENCRYPTION_DEK_ASSIGN        0x19
#define IOCTL_MN_ENCRYPTION_LUN_QUERY         0x1A
#define IOCTL_MN_ENCRYPTION_KEK_LOAD_NVRAM    0x1B
#define IOCTL_MN_ENCRYPTION_ERROR_QUERY       0x1C
#define IOCTL_MN_ENCRYPTION_DEK_TABLE_INIT    0x1D
#define IOCTL_MN_ENCRYPT_LUN_VERIFY           0x1E
#define IOCTL_MN_ENCRYPT_OPERATOR_MGMT        0x1F
#define IOCTL_MN_ENCRYPT_SET_DEK_CONFIG_PAGE  0x21
#define IOCTL_MN_ENCRYPT_SET_CONTROL_PAGE     0x22
#define IOCTL_MN_ENCRYPT_SET_OPERATOR_CMD     0x23
#define IOCTL_MN_ENCRYPT_TEST_EXECUTE         0x24
#define IOCTL_MN_ENCRYPT_SET_HMAC_CONFIG_PAGE 0x25
#define IOCTL_MN_ENCRYPT_GET_OPERATOR_CMD     0x26
#define IOCTL_MN_ENCRYPT_RESCAN               0x27
#ifdef SOFT_RESET_TEST
#define IOCTL_MN_SOFT_RESET                   0x28
#endif
/* SPCv configuration pages */
#define IOCTL_MN_MODE_SENSE                   0x30
#define IOCTL_MN_MODE_SELECT                  0x31

#define IOCTL_MN_TISA_TEST_ENCRYPT_DEK_DUMP   0x51

#define IOCTL_MN_FW_GET_EVENT_FLASH_LOG1        0x5A
#define IOCTL_MN_FW_GET_EVENT_FLASH_LOG2        0x6A
#define IOCTL_MN_GET_EVENT_LOG1                 0x5B
#define IOCTL_MN_GET_EVENT_LOG2                 0x6B

#define IOCTL_MN_GPIO_PINSETUP	            	0x01
#define IOCTL_MN_GPIO_EVENTSETUP             	0x02
#define IOCTL_MN_GPIO_READ 		                0x03
#define IOCTL_MN_GPIO_WRITE	                	0x04

#define IOCTL_MN_TMF_DEVICE_RESET				0x6F
#define IOCTL_MN_TMF_LUN_RESET					0x70
typedef struct tdFWControl
{
  bit32   retcode;    /* ret code (status) = (bit32)oscmCtrlEvnt_e      */
  bit32   phase;      /* ret code phase    = (bit32)agcmCtrlFwPhase_e   */
  bit32   phaseCmplt; /* percent complete for the current update phase  */
  bit32   version;    /* Hex encoded firmware version number            */
  bit32   offset;     /* Used for downloading firmware                  */
  bit32   len;        /* len of buffer                                  */
  bit32   size;       /* Used in OS VPD and Trace get size operations.  */
  bit32   reserved;   /* padding required for 64 bit alignment          */
  bit8    buffer[1];  /* Start of buffer                                */
} tdFWControl_t;


typedef struct tdFWControlEx
{
  tdFWControl_t *tdFWControl;
  bit8    *buffer;    // keep buffer pointer to be freed when the responce comes
  bit8    *virtAddr;  /* keep virtual address of the data */
  bit8    *usrAddr;   /* keep virtual address of the user data */
  bit32   len;        /* len of buffer                                  */
  void    *payload;   /* pointer to IOCTL Payload */
  bit8    inProgress;  /* if 1 - the IOCTL request is in progress */
  void    *param1;
  void    *param2;
  void    *param3;
} tdFWControlEx_t;

/************************************************************/
//This flag and datastructure are specific for fw profiling, Now defined as
// compiler flag
//#define SPC_ENABLE_PROFILE

#ifdef SPC_ENABLE_PROFILE
typedef struct tdFWProfile
{
    bit32   status;
    bit32   tcid;
    bit32   processor;  /* processor name "iop/aap1"      */
    bit32   cmd;        /* cmd to fw   */
    bit32   len;        /* len of buffer                                  */
    bit32   codeStartAdd;
    bit32   codeEndAdd;
    bit32   reserved;   /* padding required for 64 bit alignment          */
    bit8    buffer[1];  /* Start of buffer                                */
} tdFWProfile_t;

/************************************************/
/**Definations for FW profile*/
#define FW_PROFILE_PROCESSOR_ID_IOP  0x00
#define FW_PROFILE_PROCESSOR_ID_AAP1 0x02
/* definitions for sub operation */
#define START_TIMER_PROFILE          0x01
#define START_CODE_PROFILE           0x02
#define STOP_TIMER_PROFILE           0x81
#define STOP_CODE_PROFILE            0x82
/************************************************/

typedef struct tdFWProfileEx
{
  tdFWProfile_t *tdFWProfile;
  bit8    *buffer;    // keep buffer pointer to be freed when the responce comes
  bit8    *virtAddr;  /* keep virtual address of the data */
  bit8    *usrAddr;   /* keep virtual address of the user data */
  bit32   len;        /* len of buffer                                  */
  void    *payload;   /* pointer to IOCTL Payload */
  bit8    inProgress;  /* if 1 - the IOCTL request is in progress */
  void    *param1;
  void    *param2;
  void    *param3;
} tdFWProfileEx_t;
#endif
/************************************************************/
typedef struct tdVPDControl
{
  bit32   retcode;    /* ret code (status)                              */
  bit32   phase;      /* ret code phase                                 */
  bit32   phaseCmplt; /* percent complete for the current update phase  */
  bit32   version;    /* Hex encoded firmware version number            */
  bit32   offset;     /* Used for downloading firmware                  */
  bit32   len;        /* len of buffer                                  */
  bit32   size;       /* Used in OS VPD and Trace get size operations.  */
  bit8    deviceID;   /* padding required for 64 bit alignment          */
  bit8    reserved1;
  bit16   reserved2;
  bit32   signature;
  bit8    buffer[1];  /* Start of buffer                                */
} tdVPDControl_t;

typedef struct tdDeviceInfoIOCTL_s
{
  bit8       deviceType;   // TD_SATA_DEVICE or TD_SAS_DEVICE
  bit8       linkRate;     // 0x08: 1.5 Gbit/s; 0x09: 3.0; 0x0A: 6.0 Gbit/s.
  bit8       phyId;
  bit8       reserved;
  bit32      sasAddressHi; // SAS address high
  bit32      sasAddressLo; // SAS address low
  bit32      up_sasAddressHi; // upstream SAS address high
  bit32      up_sasAddressLo; // upstream SAS address low
  bit32      ishost;
  bit32      isEncryption;    // is encryption enabled
  bit32      isDIF;           // is DIF enabled
  unsigned long DeviceHandle;
  bit32      host_num;
  bit32      channel;
  bit32      id;
  bit32      lun;
}tdDeviceInfoIOCTL_t;

/* Payload of IOCTL dump device list at OS layer */
typedef struct tdDeviceInfoPayload_s
{
  bit32      PathId;
  bit32      TargetId;
  bit32      Lun;
  bit32      Reserved;         /* Had better aligned to 64-bit. */

  /* output */
  tdDeviceInfoIOCTL_t  devInfo;
}tdDeviceInfoPayload_t;

typedef struct tdDeviceListPayload_s
{
  bit32  realDeviceCount;// the real device out in the array, returned by driver
  bit32  deviceLength;   // the length of tdDeviceInfoIOCTL_t array
  bit8   pDeviceInfo[1]; // point to tdDeviceInfoIOCTL_t array
}tdDeviceListPayload_t;

// Payload of IO error and event statistic IOCTL.
typedef struct tdIoErrorEventStatisticIOCTL_s
{
  bit32  agOSSA_IO_COMPLETED_ERROR_SCSI_STATUS;
  bit32  agOSSA_IO_ABORTED;
  bit32  agOSSA_IO_OVERFLOW;
  bit32  agOSSA_IO_UNDERFLOW;
  bit32  agOSSA_IO_FAILED;
  bit32  agOSSA_IO_ABORT_RESET;
  bit32  agOSSA_IO_NOT_VALID;
  bit32  agOSSA_IO_NO_DEVICE;
  bit32  agOSSA_IO_ILLEGAL_PARAMETER;
  bit32  agOSSA_IO_LINK_FAILURE;
  bit32  agOSSA_IO_PROG_ERROR;
  bit32  agOSSA_IO_DIF_IN_ERROR;
  bit32  agOSSA_IO_DIF_OUT_ERROR;
  bit32  agOSSA_IO_ERROR_HW_TIMEOUT;
  bit32  agOSSA_IO_XFER_ERROR_BREAK;
  bit32  agOSSA_IO_XFER_ERROR_PHY_NOT_READY;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_BREAK;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR;
  bit32  agOSSA_IO_XFER_ERROR_NAK_RECEIVED;
  bit32  agOSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT;
  bit32  agOSSA_IO_XFER_ERROR_PEER_ABORTED;
  bit32  agOSSA_IO_XFER_ERROR_RX_FRAME;
  bit32  agOSSA_IO_XFER_ERROR_DMA;
  bit32  agOSSA_IO_XFER_ERROR_CREDIT_TIMEOUT;
  bit32  agOSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT;
  bit32  agOSSA_IO_XFER_ERROR_SATA;
  bit32  agOSSA_IO_XFER_ERROR_ABORTED_DUE_TO_SRST;
  bit32  agOSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE;
  bit32  agOSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE;
  bit32  agOSSA_IO_XFER_OPEN_RETRY_TIMEOUT;
  bit32  agOSSA_IO_XFER_SMP_RESP_CONNECTION_ERROR;
  bit32  agOSSA_IO_XFER_ERROR_UNEXPECTED_PHASE;
  bit32  agOSSA_IO_XFER_ERROR_XFER_RDY_OVERRUN;
  bit32  agOSSA_IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED;
  bit32  agOSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT;
  bit32  agOSSA_IO_XFER_ERROR_CMD_ISSUE_BREAK_BEFORE_ACK_NAK;
  bit32  agOSSA_IO_XFER_ERROR_CMD_ISSUE_PHY_DOWN_BEFORE_ACK_NAK;
  bit32  agOSSA_IO_XFER_ERROR_OFFSET_MISMATCH;
  bit32  agOSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN;
  bit32  agOSSA_IO_XFER_CMD_FRAME_ISSUED;
  bit32  agOSSA_IO_ERROR_INTERNAL_SMP_RESOURCE;
  bit32  agOSSA_IO_PORT_IN_RESET;
  bit32  agOSSA_IO_DS_NON_OPERATIONAL;
  bit32  agOSSA_IO_DS_IN_RECOVERY;
  bit32  agOSSA_IO_TM_TAG_NOT_FOUND;
  bit32  agOSSA_IO_XFER_PIO_SETUP_ERROR;
  bit32  agOSSA_IO_SSP_EXT_IU_ZERO_LEN_ERROR;
  bit32  agOSSA_IO_DS_IN_ERROR;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY;
  bit32  agOSSA_IO_ABORT_IN_PROGRESS;
  bit32  agOSSA_IO_ABORT_DELAYED;
  bit32  agOSSA_IO_INVALID_LENGTH;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY_ALT;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED;
  bit32  agOSSA_IO_DS_INVALID;
  bit32  agOSSA_IO_XFER_READ_COMPL_ERR;
  bit32  agOSSA_IO_XFER_ERR_LAST_PIO_DATAIN_CRC_ERR;
  bit32  agOSSA_IO_XFR_ERROR_INTERNAL_CRC_ERROR;
  bit32  agOSSA_MPI_IO_RQE_BUSY_FULL;
  bit32  agOSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE;
  bit32  agOSSA_MPI_ERR_ATAPI_DEVICE_BUSY;
  bit32  agOSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS;
  bit32  agOSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH;
  bit32  agOSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID;
  bit32  agOSSA_IO_XFR_ERROR_DEK_IV_MISMATCH;
  bit32  agOSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR;
  bit32  agOSSA_IO_XFR_ERROR_INTERNAL_RAM;
  bit32  agOSSA_IO_XFR_ERROR_DIF_MISMATCH;
  bit32  agOSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH;
  bit32  agOSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH;
  bit32  agOSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH;
  bit32  agOSSA_IO_XFR_ERROR_INVALID_SSP_RSP_FRAME;
  bit32  agOSSA_IO_XFER_ERR_EOB_DATA_OVERRUN;
  bit32  agOSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS;
  bit32  agOSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED;
  bit32  agOSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE;
  bit32  agOSSA_IO_XFER_ERROR_DIF_INTERNAL_ERROR;
  bit32  agOSSA_MPI_ERR_OFFLOAD_DIF_OR_ENC_NOT_ENABLED;
  bit32  agOSSA_IO_UNKNOWN_ERROR;

} tdIoErrorEventStatisticIOCTL_t;

/*
01: soft error
02: not ready
03: medium error
04: hardware error
05: illegal request
06: unit attention
0b: abort command
*/
typedef struct tdSenseKeyCount_s{
  bit32     SoftError;
  bit32     MediumNotReady;
  bit32     MediumError;
  bit32     HardwareError;
  bit32     IllegalRequest;
  bit32     UnitAttention;
  bit32     AbortCommand;
  bit32     OtherKeyType;
}tdSenseKeyCount_t;

/*
Code Status Command  completed Service response
00h GOOD Yes COMMAND COMPLETE
02h CHECK CONDITION Yes COMMAND COMPLETE
04h CONDITION MET Yes COMMAND COMPLETE
08h BUSY Yes COMMAND COMPLETE
10h Obsolete
14h Obsolete
18h RESERVATION CONFLICT Yes COMMAND COMPLETE
22h Obsolete
28h TASK SET FULL Yes COMMAND COMPLETE
30h ACA ACTIVE Yes COMMAND COMPLETE
40h TASK ABORTED Yes COMMAND COMPLETE
*/
typedef struct tdSCSIStatusCount_s{
  bit32     GoodStatus;
  bit32     CheckCondition;
  bit32     ConditionMet;
  bit32     BusyStatus;
  bit32     ResvConflict;
  bit32     TaskSetFull;
  bit32     AcaActive;
  bit32     TaskAborted;
  bit32     ObsoleteStatus;
}tdSCSIStatusCount_t;

/* Payload of Io Error Statistic IOCTL. */
typedef struct tdIoErrorStatisticPayload_s
{
  bit32         flag;
  bit32         Reserved;         /* Had better aligned to 64-bit. */

  /* output */
  tdIoErrorEventStatisticIOCTL_t  IoError;
  tdSCSIStatusCount_t             ScsiStatusCounter;
  tdSenseKeyCount_t               SenseKeyCounter;
} tdIoErrorStatisticPayload_t;

/* Payload of Io Error Statistic IOCTL. */
typedef struct tdIoEventStatisticPayload_s
{
  bit32         flag;
  bit32         Reserved;         /* Had better aligned to 64-bit. */

  /* output */
  tdIoErrorEventStatisticIOCTL_t  IoEvent;
} tdIoEventStatisticPayload_t;

/* Payload of Register IOCTL. */
typedef struct tdRegisterPayload_s
{
  bit32         flag;
  bit32         busNum;
  bit32         RegAddr;         /* Register address */
  bit32         RegValue;        /* Register value */

} tdRegisterPayload_t;


#define FORENSIC_DATA_TYPE_GSM_SPACE        1
#define FORENSIC_DATA_TYPE_QUEUE            2
#define FORENSIC_DATA_TYPE_FATAL            3
#define FORENSIC_DATA_TYPE_NON_FATAL        4
#define FORENSIC_DATA_TYPE_IB_QUEUE         5
#define FORENSIC_DATA_TYPE_OB_QUEUE          6
#define FORENSIC_DATA_TYPE_CHECK_FATAL      0x70

#define FORENSIC_Q_TYPE_INBOUND          1
#define FORENSIC_Q_TYPE_OUTBOUND         2

/* get forensic data IOCTL payload */
typedef struct tdForensicDataPayload_s
{
  bit32   DataType;
  union
  {
    struct
    {
      bit32   directLen;
      bit32   directOffset;
      bit32   readLen;
      bit8   directData[1]; 
    } gsmBuffer;

    struct
    {
      bit16  queueType;
      bit16  queueIndex;
      bit32  directLen;
      bit8   directData[1];
    } queueBuffer;

    struct
    {
      bit32 directLen;
      bit32 directOffset;
      bit32 readLen;
      bit8  directData[1];
    } dataBuffer;
  }; 
}tdForensicDataPayload_t;

typedef struct tdBistPayload_s
{
  bit32  testType;
  bit32  testLength;
  bit32  testData[29];
}tdBistPayload_t;

typedef struct _TSTMTID_CARD_LOCATION_INFO
{
  bit32               CardNo;
  bit32               Bus;
  bit32               Slot;
  bit32               Device;
  bit32               Function;
  bit32               IOLower;
  bit32               IO_Upper;
  bit32               VidDid;
  bit32               PhyMem;
  bit32               Flag;

} TSTMTID_CARD_LOCATION_INFO;

typedef struct _TSTMTID_TRACE_BUFFER_INFO
{
  bit32               CardNo;
  bit32               TraceCompiled;
  bit32               BufferSize;
  bit32               CurrentIndex;
  bit32               TraceWrap;
  bit32               CurrentTraceIndexWrapCount;
  bit32               TraceMask;
  bit32               Flag;

} TSTMTID_TRACE_BUFFER_INFO;

#define FetchBufferSIZE  32
#define LowFence32Bits   0xFCFD1234
#define HighFence32Bits  0x5678ABDC

typedef struct _TSTMTID_TRACE_BUFFER_FETCH
{
  bit32               CardNo;
  bit32               BufferOffsetBegin;
  bit32               LowFence;
  bit8                Data[FetchBufferSIZE];
  bit32               HighFence;
  bit32               Flag;

} TSTMTID_TRACE_BUFFER_FETCH;


typedef struct _TSTMTID_TRACE_BUFFER_RESET
{
  bit32               CardNo;
  bit32               Reset;
  bit32               TraceMask;
  bit32               Flag;

} TSTMTID_TRACE_BUFFER_RESET;



typedef struct tdPhyCount_s{
  bit32 Phy;
  bit32 BW_tx;
  bit32 BW_rx;
  bit32 InvalidDword;
  bit32 runningDisparityError;
  bit32 codeViolation;
  bit32 LossOfSyncDW;
  bit32 phyResetProblem;
  bit32 inboundCRCError;
}tdPhyCount_t;


typedef struct _PHY_GENERAL_STATE
{
	bit32 Dword0;
	bit32 Dword1;

}GetPhyGenState_t;
typedef struct agsaPhyGeneralState_s
{
  GetPhyGenState_t  PhyGenData[16];
  bit32 Reserved1;
  bit32 Reserved2;
} agsaPhyGeneralState_t;

typedef struct _PHY_DETAILS_
{       
  bit8    sasAddressLo[4];
  bit8    sasAddressHi[4];
  bit8    attached_sasAddressLo[4];
  bit8    attached_sasAddressHi[4];
  bit8    attached_phy;
  bit8    attached_dev_type ;
}PhyDetails_t;

enum SAS_SATA_DEVICE_TYPE {
  SAS_PHY_NO_DEVICE ,
  SAS_PHY_END_DEVICE,
  SAS_PHY_EXPANDER_DEVICE,
  SAS_PHY_SATA_DEVICE = 0x11,
};
#define PHY_SETTINGS_LEN   1024

#endif  /* TD_IOCTL_H */