summaryrefslogtreecommitdiffstats
path: root/lib/farsync/windows/sdci.h
blob: 220da489cf2fcc6ad70ef87bb95f8993b8af4a37 (plain)
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
688
689
690
691
692
693
694
695
696
697
698
699
700
/*******************************************************************************
*                                                                 
* Program     : FarSync (generic)
*                                                                 
* File        : sdci.h
*                                                                 
* Description : This header file is based on the Equates and Structure Layouts 
*               page of the SDCI section of the July '99 MSDN
*                                                    
* Modifications
*
* Version 2.1.0  01Mar01  WEB  Add QuickStart and GetLinkInterface
* Version 2.2.0  18Jul01  WEB  Certification candidate
* Version 2.2.1  07Aug01  JPG  Add FarSyncReadSignals
* Version 2.2.2  03Sep01  WEB  Extend USERDPC definition to include indication
*                              param instead of bReadIR
*                22Oct01  MJD  Added Transparent Mode support - defined 
*                              LinkOption_Transparent
* Version 3.0.0  12Sep02  WEB  Add dma mode and cardinfoex support definitions
* Version 3.1.0  07Nov02  WEB  Add interrupt handshake mode support definitions
* Version 3.2.0  09Dec02  WEB  Add LinkOption_InvertRxClock
*                              Add ResetStats IOCTL and extended InterfaceRecord
*                              Complete CardInfoEx definition
* Version 3.3.0  30Apr04  WEB  Extend CardInfoEx to include physical + IO address
* Version 3.3.1  03Mar05  WEB  Removed SA_TxAbort which was previously incorrectly
*                              named 
* Version 4.0.1  03Mar05  WEB  Correct IOCTL_SDCI_xxx definitions. Now requires
*                              CTL_CODE to be defined i.e winioctl.h (user-mode) or
*                              wdm.h (kernel-mode) must be included before this file.
*                              Add USERDPC_INDICATION_TX, FarSyncSetUserDpcEx,
*                              IoctlCodeFarSyncSetPortConfig,
*                              IoctlCodeFarSyncGetPortConfig,
*                              IoctlCodeFarSyncSetSerialConfig,
*                              IoctlCodeFarSyncGetSerialConfig
*                              IoctlCodeFarSyncSetCTBusConfig &
*                              IoctlCodeFarSyncGetCTBusConfig
* Version 4.0.1.1 03Mar05 WEB  Update FS_XXX_CONFIG structures
* Version 4.0.1.2 04Mar05 WEB  Update error counter explanations,
*                              FarSync-specific error codes & further
*                              rationalisations
* Version 4.1.0.0 15Jun05 WEB  Add TE1 and additional T4E definitions
*                              Add monitoring IOCTLs
* Version 4.1.0.1 02Aug05 MJD  Added USERDPC_INDICATION_CLOCK_SWITCH_TO_PRIMARY
* Version 4.1.0.2 09Aug05 MJD  Update FS_CLOCKING_STATUS to include uCTAInUse so
*                              that apps can tell which CT Bus the hardware is 
*                              using in slave mode, structure version now 2. 
* Version 4.2.0   12Sep05 WEB  Add async and synth detection fields to 
*                              FSCARDINFOEX
*                              SA_RxFrameTooBig is now supported by M1P
*                              Add FS_ERROR_INVALID_LENGTH definition
*
*******************************************************************************/

#ifndef __SDCI_H_ 
#define __SDCI_H_

/*****************************************************************************/
//
// There are the IOCTL code values used to communicate with the SDCI driver.
//
/*****************************************************************************/

#define IOCTL_SDCI_SetEvent                        CTL_CODE(0, (0x410 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_SetLinkCharacteristics          CTL_CODE(0, (0x420 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_SetV24OutputStatus              CTL_CODE(0, (0x430 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_TransmitFrame                   CTL_CODE(0, (0x440 >> 2), METHOD_IN_DIRECT,  FILE_ANY_ACCESS)
#define IOCTL_SDCI_AbortTransmit                   CTL_CODE(0, (0x450 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_AbortReceiver                   CTL_CODE(0, (0x460 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_OffBoardLoad                    CTL_CODE(0, (0x470 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_GetV24Status                    CTL_CODE(0, (0x620 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_ReceiveFrame                    CTL_CODE(0, (0x630 >> 2), METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncReceiveFrame             CTL_CODE(0, (0x630 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_ReadInterfaceRecord             CTL_CODE(0, (0x640 >> 2), METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncReadInterfaceRecord      CTL_CODE(0, (0x640 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncReadInterfaceRecordEx    CTL_CODE(0, (0x650 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetLinkInterface         CTL_CODE(0, (0x710 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetUserDpc               CTL_CODE(0, (0x720 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetCardMode              CTL_CODE(0, (0x730 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncReadCardInfo             CTL_CODE(0, (0x740 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncQuickStart               CTL_CODE(0, (0x750 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetLinkInterface         CTL_CODE(0, (0x760 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncReadSignals              CTL_CODE(0, (0x770 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetDMAMode               CTL_CODE(0, (0x780 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetDMAMode               CTL_CODE(0, (0x790 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncReadCardInfoEx           CTL_CODE(0, (0x7a0 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetHandShakeMode         CTL_CODE(0, (0x7b0 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetHandShakeMode         CTL_CODE(0, (0x7c0 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncResetStats               CTL_CODE(0, (0x7d0 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncReadTE1Status            CTL_CODE(0, (0x7e0 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetUserDpcEx             CTL_CODE(0, (0x7f0 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetPortConfig            CTL_CODE(0, (0x810 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetPortConfig            CTL_CODE(0, (0x820 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetSerialConfig          CTL_CODE(0, (0x830 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetSerialConfig          CTL_CODE(0, (0x840 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetCTBusConfig           CTL_CODE(0, (0x850 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetCTBusConfig           CTL_CODE(0, (0x860 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetTE1Config             CTL_CODE(0, (0x870 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetTE1Config             CTL_CODE(0, (0x880 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetCTBusBackupConfig     CTL_CODE(0, (0x890 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetCTBusBackupConfig     CTL_CODE(0, (0x8a0 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetClockingStatus        CTL_CODE(0, (0x8b0 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetMonitoring            CTL_CODE(0, (0x8c0 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetMonitoringStatus      CTL_CODE(0, (0x8d0 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)

#define IoctlCodeSetEvent                       IOCTL_SDCI_SetEvent
#define IoctlCodeSetLinkChar                    IOCTL_SDCI_SetLinkCharacteristics
#define IoctlCodeSetV24                         IOCTL_SDCI_SetV24OutputStatus
#define IoctlCodeTxFrame                        IOCTL_SDCI_TransmitFrame   
#define IoctlCodeAbortTransmit                  IOCTL_SDCI_AbortTransmit
#define IoctlCodeAbortReceiver                  IOCTL_SDCI_AbortReceiver
#define IoctlCodeOffBoardLoad                   IOCTL_SDCI_OffBoardLoad
#define IoctlCodeGetV24                         IOCTL_SDCI_GetV24Status
#define IoctlCodeRxFrame                        IOCTL_SDCI_ReceiveFrame   
#define IoctlCodeFarSyncRxFrame                 IOCTL_SDCI_FarSyncReceiveFrame
#define IoctlCodeReadInterfaceRecord            IOCTL_SDCI_ReadInterfaceRecord
#define IoctlCodeFarSyncReadInterfaceRecord     IOCTL_SDCI_FarSyncReadInterfaceRecord
#define IoctlCodeFarSyncReadInterfaceRecordEx   IOCTL_SDCI_FarSyncReadInterfaceRecordEx
#define IoctlCodeFarSyncSetLinkInterface        IOCTL_SDCI_FarSyncSetLinkInterface
#define IoctlCodeSetLinkInterface               IoctlCodeFarSyncSetLinkInterface
#define IoctlCodeFarSyncSetUserDpc              IOCTL_SDCI_FarSyncSetUserDpc
#define IoctlCodeFarSyncSetCardMode             IOCTL_SDCI_FarSyncSetCardMode
#define IoctlCodeFarSyncReadCardInfo            IOCTL_SDCI_FarSyncReadCardInfo
#define IoctlCodeFarSyncQuickStart              IOCTL_SDCI_FarSyncQuickStart
#define IoctlCodeFarSyncGetLinkInterface        IOCTL_SDCI_FarSyncGetLinkInterface
#define IoctlCodeFarSyncReadSignals             IOCTL_SDCI_FarSyncReadSignals
#define IoctlCodeFarSyncSetDMAMode              IOCTL_SDCI_FarSyncSetDMAMode
#define IoctlCodeFarSyncGetDMAMode              IOCTL_SDCI_FarSyncGetDMAMode
#define IoctlCodeFarSyncReadCardInfoEx          IOCTL_SDCI_FarSyncReadCardInfoEx
#define IoctlCodeFarSyncSetHandShakeMode        IOCTL_SDCI_FarSyncSetHandShakeMode
#define IoctlCodeFarSyncGetHandShakeMode        IOCTL_SDCI_FarSyncGetHandShakeMode
#define IoctlCodeFarSyncResetStats              IOCTL_SDCI_FarSyncResetStats
#define IoctlCodeFarSyncReadTE1Status           IOCTL_SDCI_FarSyncReadTE1Status
#define IoctlCodeFarSyncSetUserDpcEx            IOCTL_SDCI_FarSyncSetUserDpcEx
#define IoctlCodeFarSyncSetPortConfig           IOCTL_SDCI_FarSyncSetPortConfig
#define IoctlCodeFarSyncGetPortConfig           IOCTL_SDCI_FarSyncGetPortConfig
#define IoctlCodeFarSyncSetSerialConfig         IOCTL_SDCI_FarSyncSetSerialConfig
#define IoctlCodeFarSyncGetSerialConfig         IOCTL_SDCI_FarSyncGetSerialConfig
#define IoctlCodeFarSyncSetCTBusConfig          IOCTL_SDCI_FarSyncSetCTBusConfig
#define IoctlCodeFarSyncGetCTBusConfig          IOCTL_SDCI_FarSyncGetCTBusConfig
#define IoctlCodeFarSyncSetTE1Config            IOCTL_SDCI_FarSyncSetTE1Config
#define IoctlCodeFarSyncGetTE1Config            IOCTL_SDCI_FarSyncGetTE1Config
#define IoctlCodeFarSyncSetCTBusBackupConfig    IOCTL_SDCI_FarSyncSetCTBusBackupConfig
#define IoctlCodeFarSyncGetCTBusBackupConfig    IOCTL_SDCI_FarSyncGetCTBusBackupConfig
#define IoctlCodeFarSyncGetClockingStatus       IOCTL_SDCI_FarSyncGetClockingStatus
#define IoctlCodeFarSyncSetMonitoring           IOCTL_SDCI_FarSyncSetMonitoring
#define IoctlCodeFarSyncGetMonitoringStatus     IOCTL_SDCI_FarSyncGetMonitoringStatus

/*****************************************************************************/
/* Constants for the driver-specific IOCtl return codes.                     */
/*****************************************************************************/
#define CEDNODMA 0xff80     /* Warning (NO DMA!) from set link chrctrstcs    */
/*****************************************************************************/
/* Equates for the link options byte 1.                                      */
/*****************************************************************************/
#define CEL4WIRE 0x80
#define CELNRZI  0x40
#define CELPDPLX 0x20
#define CELSDPLX 0x10
#define CELCLOCK 0x08
#define CELDSRS  0x04
#define CELSTNBY 0x02
#define CELDMA   0x01

/*****************************************************************************/
/* Equates for the driver set link characteristics byte 1.                   */
/*****************************************************************************/
#define CED4WIRE 0x80
#define CEDNRZI  0x40
#define CEDHDLC  0x20
#define CEDFDPLX 0x10
#define CEDCLOCK 0x08
#define CEDDMA   0x04
#define CEDRSTAT 0x02
#define CEDCSTAT 0x01

/* Nicer names for NT-style code */

#define LinkOption_4Wire           CED4WIRE
#define LinkOption_InvertRxClock   CEDDMA
#define LinkOption_NRZI            CEDNRZI
#define LinkOption_HDLC            CEDHDLC
#define LinkOption_FullDuplex      CEDFDPLX
#define LinkOption_InternalClock   CEDCLOCK
#define LinkOption_DMA             CEDDMA
#define LinkOption_ResetStatistics CEDRSTAT
#define LinkOption_Transparent     CEDCSTAT

/*****************************************************************************/
/* Equates for the output V24 interface flags.                               */
/*****************************************************************************/
#define CED24RTS 0x01
#define CED24DTR 0x02
// #define CED24DRS 0x04- not used. 0x04 is instead used by DCD 
// i.e. when configured as an output - see below
#define CED24SLS 0x08
#define CED24TST 0x10

/* Nicer names for NT-style code */

#define IR_OV24RTS  CED24RTS
#define IR_OV24DTR  CED24DTR
//#define IR_OV24DSRS CED24DRS
#define IR_OV24SlSt CED24SLS
#define IR_OV24Test CED24TST


/*****************************************************************************/
/* Equates for the input V24 interface flags.                                */
/*****************************************************************************/
#define CED24CTS 0x01
#define CED24DSR 0x02
#define CED24DCD 0x04
#define CED24RI  0x08

// CEDCR indicates the presense of a generic carrier i.e. independent of port type
// e.g. DCD for V.25, CTS for X.21
#define CEDCR  0x10

 // Note: DCD can only be used as an output signal on a FarSync T4E
 // and only then if a FarSyncSetSerialConfig has been previously
 // issued for this port, with FsSerialConfig.uDCDOutput set to
 // TRUE

/* Nicer names for NT-style code */

#define IR_IV24CTS  CED24CTS
#define IR_IV24DSR  CED24DSR
#define IR_IV24DCD  CED24DCD
#define IR_IV24RI   CED24RI
#define IR_IV24Test 0x10


/*****************************************************************************/
/* Structure for the device driver interface record.                         */
/*****************************************************************************/

#define CEDSTCRC  0         /* Frames received with incorrect CRC            */
#define CEDSTOFL  1         /* Frames received longer than the maximum       */
#define CEDSTUFL  2         /* Frames received less than 4 octets long       */
#define CEDSTSPR  3         /* Frames received ending on a non-octet bndry   */
#define CEDSTABT  4         /* Aborted frames received                       */
#define CEDSTTXU  5         /* Transmitter interrupt underruns               */
#define CEDSTRXO  6         /* Receiver    interrupt overruns                */
#define CEDSTDCD  7         /* DCD (RLSD) lost during frame reception        */
#define CEDSTCTS  8         /* CTS lost while transmitting                   */
#define CEDSTDSR  9         /* DSR drops                                     */
#define CEDSTHDW 10         /* Hardware failures - adapter errors            */

#define CEDSTMAX 11

#define SA_CRC_Error       CEDSTCRC
#define SA_RxFrameTooBig   CEDSTOFL
#define SA_RxFrameTooShort CEDSTUFL
#define SA_Spare           CEDSTSPR
#define SA_RxAbort         CEDSTABT
#define SA_TxUnderrun      CEDSTTXU
#define SA_RxOverrun       CEDSTRXO
#define SA_DCDDrop         CEDSTDCD
#define SA_CTSDrop         CEDSTCTS
#define SA_DSRDrop         CEDSTDSR
#define SA_HardwareError   CEDSTHDW

// FarSync-specific counters mapped to existing SDCI definitions 
#define SA_FramingError       SA_Spare
#define SA_RxError            SA_HardwareError
#define SA_BufferUnavailable  SA_DCDDrop
#define SA_Parity             SA_CRC_Error

#define SA_Max_Stat        CEDSTMAX

// ****************************************************************************************************
// FarSync supports the following counters. All other counter indices are not used by FarSync.

// SA_CRC_Error       Sync & Async modes
// SA_FramingError    Sync & Async modes
// SA_RxOverrun       Sync & Async modes

// SA_RxAbort         (Async) & (M1P Sync) modes only
// SA_RxError         Sync mode only
// SA_TxUnderrun      Sync mode only
// SA_RxFrameTooShort M1P Sync mode only

// SA_RxFrameTooBig   Async mode (fifo overflow) & M1P Sync

//    Note that 
//      1) Async mode is currently only supported on the T4U - it is an optional extra feature
//      2) On a TxU an SA_RxError indicates a received abort OR a rx frame length error (too big OR too small)
//      3) On an M1P an SA_RxError indicates a alternative type of RxO as reported via SA_RxOverrun
// ****************************************************************************************************

/*****************************************************************************/
/* InterfaceRecord definition                                                */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeReadInterfaceRecord,                                           */
/*   IoctlCodeFarSyncReadInterfaceRecord                                     */
/*                                                                           */
/*****************************************************************************/
typedef struct _INTERFACE_RECORD
{
  int    RxFrameCount;   /* incremented after each frame rx'd */
  int    TxMaxFrSizeNow; /* max available frame size av. now  */
                         /* (changes after each Tx DevIoctl   */
                         /* to DD or after Tx completed)      */
  int    StatusCount;    /* How many status events have been  */
                         /* triggered.                        */
  UCHAR  V24In;          /* Last 'getv24 i/p' value got       */
  UCHAR  V24Out;         /* Last 'setv24 o/p' value set       */

/* The values for the indexes into the link statistics array of the */
/* various types of statistic. */

  int    StatusArray[SA_Max_Stat];

} IR, * PIR;

/*****************************************************************************/
/* InterfaceRecordEx definition                                              */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncReadInterfaceRecordEx                                   */
/*                                                                           */
/*****************************************************************************/
typedef struct _INTERFACE_RECORD_EX
{
  IR     InterfaceRecord;
  int    StatusCount;    /* How many status events have been  */
  ULONG  OpenedCount;
  ULONG  TxRequestCount;
  ULONG  TxCompleteCount;
  ULONG  RxPostedCount;
  ULONG  RxCompleteCount;
} IREX, * PIREX;

/*****************************************************************************/
/* Set link characteristics parameter block definition                       */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeSetLinkChar                                                    */
/*                                                                           */
/*****************************************************************************/
typedef struct  _SLPARMS
{
  int     SLFrameSize;            /* max frame size on link, should    */
                                  /* include 2-byte CRC - max is 8K    */
  LONG    SLDataRate;             /* not used by us - external clocks  */
  UCHAR   SLOurAddress1;          /* ) e.g C1/FF or 00/00 or 01/03     */
  UCHAR   SLOurAddress2;          /* )                                 */
  UCHAR   SLLinkOptionsByte;      /* see documentation & LinkOption_*  */
  UCHAR   SLSpare1;
} SLPARMS, *PSLPARMS;

/*****************************************************************************/
/* Set link interface parameter block definition                             */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetLinkInterface,                                       */
/*   IoctlCodeFarSyncGetLinkInterface                                        */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     /* Note: sizeof(FsLinkIfParms) is expected to be 0x10 */
typedef struct  _FSLINKIFPARMS
{
    HANDLE Context;       // context for completion routine - not used 
    USHORT MaxFrameSize;  // maximum frame size - not used
    USHORT Interface;     // line interface: 
    ULONG  BaudRate;      // baud rate
    UCHAR  Reserved;      // reserved
} FSLINKIFPARMS, * PFSLINKIFPARMS;
#pragma pack(pop)

// USER DPC DEFINITIONS - KERNEL-MODE ONLY

#define USERDPC_INDICATION_RX     0
#define USERDPC_INDICATION_SIGNAL 1
#define USERDPC_INDICATION_ERROR  2
#define USERDPC_INDICATION_TX     3 /* indicates that the number of tx buffers 
                                       in use by the card has changed - examine
                                       *pUserDpcTxBuffersInUse for the current value */

// FarSync T4E clock notifications
#define USERDPC_INDICATION_CLOCK_RATE_CHANGED        FS_INDICATION_CLOCK_RATE_CHANGED
#define USERDPC_INDICATION_CLOCK_OUT_OF_TOLERANCE1   FS_INDICATION_CLOCK_OUT_OF_TOLERANCE1
#define USERDPC_INDICATION_CLOCK_IN_TOLERANCE1       FS_INDICATION_CLOCK_IN_TOLERANCE1
#define USERDPC_INDICATION_CLOCK_SWITCH_TO_BACKUP    FS_INDICATION_CLOCK_SWITCH_TO_BACKUP
#define USERDPC_INDICATION_CLOCK_OUT_OF_TOLERANCE2   FS_INDICATION_CLOCK_OUT_OF_TOLERANCE2
#define USERDPC_INDICATION_CLOCK_IN_TOLERANCE2       FS_INDICATION_CLOCK_IN_TOLERANCE2
#define USERDPC_INDICATION_CLOCK_SWITCH_TO_OSC       FS_INDICATION_CLOCK_SWITCH_TO_OSC
#define USERDPC_INDICATION_CLOCK_SWITCH_TO_CTA       FS_INDICATION_CLOCK_SWITCH_TO_CTA
#define USERDPC_INDICATION_CLOCK_SWITCH_TO_CTB       FS_INDICATION_CLOCK_SWITCH_TO_CTB
#define USERDPC_INDICATION_CLOCK_SWITCH_TO_PRIMARY   FS_INDICATION_CLOCK_SWITCH_TO_PRIMARY

// user DPC callback - kernel mode only
typedef VOID (*USERDPC)(PVOID /* caller's handle*/, unsigned char /* indication */);  

/*****************************************************************************/
/* Set user dpc parameter block definition                                   */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetUserDpc      ,                                       */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FSUSERDPCINFO
{
  USERDPC fUserDpc;      // callback address
  PVOID   pUserDpcParam; // param to supply in callback
} FSUSERDPCINFO, * PFSUSERDPCINFO;

/*****************************************************************************/
/* Extended set user dpc parameter block definition                          */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetUserDpcEx    ,                                       */
/*                                                                           */
/* If used, this structure must be allocated in NonPaged memory.             */
/*                                                                           */
/*****************************************************************************/
typedef struct  _FSUSERDPCINFOEX
{
  FSUSERDPCINFO fUserDpcInfo;
  long *        pUserDpcTxBuffersInUse; // ref to a SDCI client-owned var that is used to maintain the number of tx buffers
                                        // currently in use by the card.
} FSUSERDPCINFOEX, * PFSUSERDPCINFOEX;
#pragma pack(pop)

/*****************************************************************************/
/* Card mode parameter block definition                                      */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetCardMode     ,                                       */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FSCARDMODE
{
  BOOLEAN bIdentifyMode;
} FSCARDMODE, * PFSCARDMODE;
#pragma pack(pop)

/*****************************************************************************/
/* Card info parameter block definition                                      */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncReadCardInfo    ,                                       */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FSCARDINFO
{
  #define FSCARDINFO_VERSION  1
  #define SERIAL_NO_LENGTH    8

  ULONG  uVersion;       // Version of this structure
  USHORT uDeviceId;
  USHORT uSubSystemId;
  ULONG  uNumberOfPorts;
  char   szSerialNo[SERIAL_NO_LENGTH+1];
  ULONG  uMajorRevision;
  ULONG  uMinorRevision;
  ULONG  uBuildState;
  ULONG  uCPUSpeed;
  ULONG  uMode;
} FSCARDINFO, * PFSCARDINFO;
#pragma pack(pop)

/*****************************************************************************/
/* DMA mode parameter block definition                                       */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetDMAMode,                                             */   
/*   IoctlCodeFarSyncGetDMAMode    ,                                         */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FSDMAMODE
{
  #define FSDMAMODE_VERSION       1
  #define FSDMAMODE_OFF           1
  #define FSDMAMODE_ON            2
  #define FSDMAMODE_INTERMEDIATE  3 // use for processing rxs via intermediate buffer

  ULONG  uVersion;       // Version of this structure
  USHORT uTxDMAMode;
  USHORT uRxDMAMode;
} FSDMAMODE, * PFSDMAMODE;
#pragma pack(pop)

/*****************************************************************************/
/* Interrupt handshake mode parameter block definition                       */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetHandShakeMode,                                       */   
/*   IoctlCodeFarSyncGetHandShakeMode                                        */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FSHANDSHAKEMODE
{
  #define FSHANDSHAKEMODE_VERSION       1
  #define FSHANDSHAKEMODE_2             2
  #define FSHANDSHAKEMODE_3             3

  ULONG  uVersion;       // Version of this structure
  USHORT uMode;
} FSHANDSHAKEMODE, * PFSHANDSHAKEMODE;
#pragma pack(pop)

/*****************************************************************************/
/* Extended card info parameter block definition                             */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncReadCardInfoEx  ,                                       */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FSCARDINFOEX
{
  #define FSCARDINFOEX_VERSION  2

  ULONG  uVersion;           // Version of this structure

  char   szDeviceName[32+8]; // Including aligned PADDING to allow for null-terminator
  PVOID  w_memory;           // Virtual addresses of Adapter Resources
  PVOID  w_controlSpace;     
  PVOID  w_localCfg;         
  PVOID  w_ioSpace;
  ULONG  z_memory;           // Lengths of Adapter Resources
  ULONG  z_controlSpace;     
  ULONG  z_localCfg;         
  ULONG  z_ioSpace;

  ULONG  uHiVersion;  
  ULONG  uLoVersion;

  ULONG  uReservedA[30]; // these are reserved for FarSite's own use

  PVOID  p_memory;       // physical address of window - T-Series cards 
  PVOID  p_io;           // main IO address of card
  ULONG  uExtendedClockingSupported; // are (T4E) clock synths available on the card?
  ULONG  uAsyncSupported;  // does the card support async
  ULONG  uReservedB[28];   // these are currently unused

} FSCARDINFOEX, * PFSCARDINFOEX;
#pragma pack(pop)

/*****************************************************************************/
/* Port config parameter block definition                                    */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetPortConfig,                                          */   
/*   IoctlCodeFarSyncGetPortConfig                                           */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FS_PORT_CONFIG
{
  #define FSPORTCONFIG_VERSION       2

  ULONG  uVersion;              // Version of this structure
  ULONG  uPortTxNumBuffers;     // 2,4,8,16,32,64,128
  ULONG  uPortRxNumBuffers;     // 2,4,8,16,32,64,128
	ULONG  uPortTxBufferLength;   // Min=2 Max=64*1024 Def= 8*1024
	ULONG  uPortRxBufferLength;   // Min=2 Max=64*1024 Def= 8*1024
  ULONG  uPortTxDMA;            // See fscfg.h for values i.e. FSDMAMODE_OFF=1, FSDMAMODE_ON=2
  ULONG  uPortRxDMA;            // See fscfg.h for values i.e. FSDMAMODE_OFF=1, FSDMAMODE_ON=2
  ULONG  uPortStartTxRx;        // See smcuser.h for values i.e. START_TX=1 | START_RX=2
  ULONG  uPortClockSource;      // See smcuser.h for values i.e. FS_CLOCK_REFERENCE_xxx
                                // Currently only supported on T4E
  ULONG  uPortTxMSB;            // FALSE ==> LSB (Default)
  ULONG  uPortRxMSB;            // FALSE ==> LSB (Default)
  ULONG  uPortMaxTxsOutstanding;// read-only - indicates how many txs can be outstanding at a time
  ULONG  uReserved[52];
} FS_PORT_CONFIG, *PFS_PORT_CONFIG;
#pragma pack(pop)

/*****************************************************************************/
/* Serial config parameter block definition                                  */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetSerialConfig,                                        */   
/*   IoctlCodeFarSyncGetSerialConfig                                         */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FS_SERIAL_CONFIG
{
  #define FSSERIALCONFIG_VERSION   2

  ULONG  uVersion;              // Version of this structure
  ULONG  uPortInterface;        // See fscfg.h for values e.g. FS_LINE_INTERFACE_X21
  ULONG  uPortRate;
  ULONG  uPortClocking;         // See fscfg.h for values e.g. FS_LINE_CLOCKING_INTERNAL
	ULONG  uPortTransparentMode;  // HDLC=0 Transparent=1
  ULONG  uPortInvertRxClock;    // TRUE(1) or FALSE(0)
  ULONG  uPortEncoding;         // See fscfg for values i.e. FS_PORT_ENCODING_xxx
                                // Currently only supported on M1P

  // The following fields have been added in Version 2 of this structure and not be
  // processed if uVersion = 1
  ULONG  uExtendedClocking; // subsequent fields only used if this is TRUE
  ULONG  uInternalTxClock;  
  ULONG  uInternalRxClock;  
  ULONG  uTerminalTxClock;  
  ULONG  uTerminalRxClock;  
  ULONG  uDCDOutput;        // TRUE => DCD is an output

  ULONG  uEstimatedLineSpeed; // returned by FarSyncGetSerialConfig for T4E only

  ULONG  uReserved[54];
} FS_SERIAL_CONFIG, *PFS_SERIAL_CONFIG;
#pragma pack(pop)

/*****************************************************************************/
/* CTBus config parameter block definition                                   */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetCTBusConfig                                          */   
/*   IoctlCodeFarSyncGetCTBusConfig                                          */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FS_CT_BUS_CONFIG
{
  #define FSCTBUSCONFIG_VERSION       2

  ULONG  uVersion;     // Version of this structure
  ULONG  uCTBusMode;   // See smcuser.h for values i.e. FS_CT_BUS_MODE_xxx
  ULONG  uCTBusFeed;   // See smcuser.h for values i.e. FS_CT_BUS_FEED_xxx
  ULONG  uFallback;    // TRUE=>auto switch if clock ref fails
  ULONG  uReserved[60];
} FS_CT_BUS_CONFIG, *PFS_CT_BUS_CONFIG;
#pragma pack(pop)

/*****************************************************************************/
/* Clocking Status block definition                                          */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncGetClockingStatus                                       */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FS_CLOCKING_STATUS
{
  #define FSCLOCKINGSTATUS_VERSION       2

  ULONG  uVersion;               // Version of this structure
  ULONG  uPrimaryClockStatus;    // 0=out-of-tolerance, 1=good
  ULONG  uBackupClockStatus;     // 0=out-of-tolerance, 1=good
  ULONG  uCurrentConfigReference; // See smcuser.h for values i.e. FS_CT_CONFIG_xxx
  ULONG  uCTAStatus;             // 0=out-of-tolerance, 1=good
  ULONG  uCTBStatus;             // 0=out-of-tolerance, 1=good
  USHORT uCurrentStatusSummary;  // bit map status word describing clocking state/config
                                 // see smcuser.h for bit definitions
  USHORT uReserved1;
  ULONG  uCTAInUse;              // 0=CTB, 1=CTA - shows which CT Bus the card
                                 // has selected for the slave clock source
  ULONG  uReserved2[15]; 
} FS_CLOCKING_STATUS, *PFS_CLOCKING_STATUS;
#pragma pack(pop)

//######################################################################################################
//
// FarSync Error Return Codes
//
// These return codes will be passed back from the FarSync SDCI driver in the IoStatus.Status field of 
// the IRP and (if the SDCI client is a user-mode app) will be passed through transparently to the app 
// via GetLastError().
//

#define FS_ERROR_INVALID_INPUT_BUFFER_LENGTH  0xE0000001
#define FS_ERROR_INVALID_OUTPUT_BUFFER_LENGTH 0xE0000002
#define FS_ERROR_PRIMARY_IOCTL                0xE0000003
#define FS_ERROR_CARD_NOT_STARTED             0xE0000004
#define FS_ERROR_INVALID_CT_BUS_MODE          0xE0000005
#define FS_ERROR_INVALID_CT_BUS_FEED          0xE0000006
#define FS_ERROR_INVALID_IOCTL_FOR_PORTTYPE   0xE0000007
#define FS_ERROR_INVALID_LENGTH               0xE0000008

//######################################################################################################



#endif /* __SDCI_H_ */