Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
[firefly-linux-kernel-4.4.55.git] / drivers / staging / comedi / drivers / addi-data / hwdrv_APCI1710.c
1 /**
2 @verbatim
3
4 Copyright (C) 2004,2005  ADDI-DATA GmbH for the source code of this module.
5
6         ADDI-DATA GmbH
7         Dieselstrasse 3
8         D-77833 Ottersweier
9         Tel: +19(0)7223/9493-0
10         Fax: +49(0)7223/9493-92
11         http://www.addi-data.com
12         info@addi-data.com
13
14 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
15
16 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
20 You should also find the complete GPL in the COPYING file accompanying this source code.
21
22 @endverbatim
23 */
24 /*
25   +-----------------------------------------------------------------------+
26   | (C) ADDI-DATA GmbH          Dieselstraße 3       D-77833 Ottersweier  |
27   +-----------------------------------------------------------------------+
28   | Tel : +49 (0) 7223/9493-0     | email    : info@addi-data.com         |
29   | Fax : +49 (0) 7223/9493-92    | Internet : http://www.addi-data.com   |
30   +-------------------------------+---------------------------------------+
31   | Project     : APCI-1710       | Compiler   : GCC                      |
32   | Module name : hwdrv_apci1710.c| Version    : 2.96                     |
33   +-------------------------------+---------------------------------------+
34   | Project manager: Eric Stolz   | Date       :  02/12/2002              |
35   +-------------------------------+---------------------------------------+
36   | Description :   Hardware Layer Access For APCI-1710                   |
37   +-----------------------------------------------------------------------+
38   |                             UPDATES                                   |
39   +----------+-----------+------------------------------------------------+
40   |   Date   |   Author  |          Description of updates                |
41   +----------+-----------+------------------------------------------------+
42   |          |           |                                                |
43   |          |           |                                                |
44   |          |           |                                                |
45   +----------+-----------+------------------------------------------------+
46 */
47
48 #define COMEDI_SUBD_TTLIO               11      /* Digital Input Output But TTL */
49 #define COMEDI_SUBD_PWM                 12      /* Pulse width Measurement */
50 #define COMEDI_SUBD_SSI                 13      /* Synchronous serial interface */
51 #define COMEDI_SUBD_TOR                 14      /* Tor counter */
52 #define COMEDI_SUBD_CHRONO              15      /* Chrono meter */
53 #define COMEDI_SUBD_PULSEENCODER        16      /* Pulse Encoder INP CPT */
54 #define COMEDI_SUBD_INCREMENTALCOUNTER  17      /* Incremental Counter */
55
56 #define APCI1710_BOARD_NAME             "apci1710"
57 #define APCI1710_BOARD_DEVICE_ID        0x818F
58 #define APCI1710_ADDRESS_RANGE          256
59 #define APCI1710_CONFIG_ADDRESS_RANGE   8
60 #define APCI1710_INCREMENTAL_COUNTER    0x53430000UL
61 #define APCI1710_SSI_COUNTER            0x53490000UL
62 #define APCI1710_TTL_IO                 0x544C0000UL
63 #define APCI1710_DIGITAL_IO             0x44490000UL
64 #define APCI1710_82X54_TIMER            0x49430000UL
65 #define APCI1710_CHRONOMETER            0x43480000UL
66 #define APCI1710_PULSE_ENCODER          0x495A0000UL
67 #define APCI1710_TOR_COUNTER            0x544F0000UL
68 #define APCI1710_PWM                    0x50570000UL
69 #define APCI1710_ETM                    0x45540000UL
70 #define APCI1710_CDA                    0x43440000UL
71 #define APCI1710_DISABLE                0
72 #define APCI1710_ENABLE                 1
73 #define APCI1710_SYNCHRONOUS_MODE       1
74 #define APCI1710_ASYNCHRONOUS_MODE      0
75
76 #include "APCI1710_Inp_cpt.c"
77
78 #include "APCI1710_Ssi.c"
79 #include "APCI1710_Tor.c"
80 #include "APCI1710_Ttl.c"
81 #include "APCI1710_Dig_io.c"
82 #include "APCI1710_82x54.c"
83 #include "APCI1710_Chrono.c"
84 #include "APCI1710_Pwm.c"
85 #include "APCI1710_INCCPT.c"
86
87 static const struct comedi_lrange range_apci1710_ttl = {
88         4, {
89                 BIP_RANGE(10),
90                 BIP_RANGE(5),
91                 BIP_RANGE(2),
92                 BIP_RANGE(1)
93         }
94 };
95
96 static const struct comedi_lrange range_apci1710_ssi = {
97         4, {
98                 BIP_RANGE(10),
99                 BIP_RANGE(5),
100                 BIP_RANGE(2),
101                 BIP_RANGE(1)
102         }
103 };
104
105 static const struct comedi_lrange range_apci1710_inccpt = {
106         4, {
107                 BIP_RANGE(10),
108                 BIP_RANGE(5),
109                 BIP_RANGE(2),
110                 BIP_RANGE(1)
111         }
112 };
113
114 static void i_ADDI_AttachPCI1710(struct comedi_device *dev)
115 {
116         struct comedi_subdevice *s;
117         int ret = 0;
118         int n_subdevices = 9;
119
120         ret = comedi_alloc_subdevices(dev, n_subdevices);
121         if (ret)
122                 return;
123
124         /*  Allocate and Initialise Timer Subdevice Structures */
125         s = &dev->subdevices[0];
126
127         s->type = COMEDI_SUBD_TIMER;
128         s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
129         s->n_chan = 3;
130         s->maxdata = 0;
131         s->len_chanlist = 3;
132         s->range_table = &range_digital;
133         s->insn_write = i_APCI1710_InsnWriteEnableDisableTimer;
134         s->insn_read = i_APCI1710_InsnReadAllTimerValue;
135         s->insn_config = i_APCI1710_InsnConfigInitTimer;
136         s->insn_bits = i_APCI1710_InsnBitsTimer;
137
138         /*  Allocate and Initialise DIO Subdevice Structures */
139         s = &dev->subdevices[1];
140
141         s->type = COMEDI_SUBD_DIO;
142         s->subdev_flags =
143                 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
144         s->n_chan = 7;
145         s->maxdata = 1;
146         s->len_chanlist = 7;
147         s->range_table = &range_digital;
148         s->insn_config = i_APCI1710_InsnConfigDigitalIO;
149         s->insn_read = i_APCI1710_InsnReadDigitalIOChlValue;
150         s->insn_bits = i_APCI1710_InsnBitsDigitalIOPortOnOff;
151         s->insn_write = i_APCI1710_InsnWriteDigitalIOChlOnOff;
152
153         /*  Allocate and Initialise Chrono Subdevice Structures */
154         s = &dev->subdevices[2];
155
156         s->type = COMEDI_SUBD_CHRONO;
157         s->subdev_flags = SDF_WRITEABLE | SDF_GROUND | SDF_COMMON;
158         s->n_chan = 4;
159         s->maxdata = 0;
160         s->len_chanlist = 4;
161         s->range_table = &range_digital;
162         s->insn_write = i_APCI1710_InsnWriteEnableDisableChrono;
163         s->insn_read = i_APCI1710_InsnReadChrono;
164         s->insn_config = i_APCI1710_InsnConfigInitChrono;
165         s->insn_bits = i_APCI1710_InsnBitsChronoDigitalIO;
166
167         /*  Allocate and Initialise PWM Subdevice Structures */
168         s = &dev->subdevices[3];
169         s->type = COMEDI_SUBD_PWM;
170         s->subdev_flags =
171                 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
172         s->n_chan = 3;
173         s->maxdata = 1;
174         s->len_chanlist = 3;
175         s->range_table = &range_digital;
176         s->io_bits = 0;         /* all bits input */
177         s->insn_config = i_APCI1710_InsnConfigPWM;
178         s->insn_read = i_APCI1710_InsnReadGetPWMStatus;
179         s->insn_write = i_APCI1710_InsnWritePWM;
180         s->insn_bits = i_APCI1710_InsnBitsReadPWMInterrupt;
181
182         /*  Allocate and Initialise TTLIO Subdevice Structures */
183         s = &dev->subdevices[4];
184         s->type = COMEDI_SUBD_TTLIO;
185         s->subdev_flags =
186                 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
187         s->n_chan = 8;
188         s->maxdata = 1;
189         s->len_chanlist = 8;
190         s->range_table = &range_apci1710_ttl;   /*  to pass arguments in range */
191         s->insn_config = i_APCI1710_InsnConfigInitTTLIO;
192         s->insn_bits = i_APCI1710_InsnBitsReadTTLIO;
193         s->insn_write = i_APCI1710_InsnWriteSetTTLIOChlOnOff;
194         s->insn_read = i_APCI1710_InsnReadTTLIOAllPortValue;
195
196         /*  Allocate and Initialise TOR Subdevice Structures */
197         s = &dev->subdevices[5];
198         s->type = COMEDI_SUBD_TOR;
199         s->subdev_flags =
200                 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
201         s->n_chan = 8;
202         s->maxdata = 1;
203         s->len_chanlist = 8;
204         s->range_table = &range_digital;
205         s->io_bits = 0;         /* all bits input */
206         s->insn_config = i_APCI1710_InsnConfigInitTorCounter;
207         s->insn_read = i_APCI1710_InsnReadGetTorCounterInitialisation;
208         s->insn_write = i_APCI1710_InsnWriteEnableDisableTorCounter;
209         s->insn_bits = i_APCI1710_InsnBitsGetTorCounterProgressStatusAndValue;
210
211         /*  Allocate and Initialise SSI Subdevice Structures */
212         s = &dev->subdevices[6];
213         s->type = COMEDI_SUBD_SSI;
214         s->subdev_flags =
215                 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
216         s->n_chan = 4;
217         s->maxdata = 1;
218         s->len_chanlist = 4;
219         s->range_table = &range_apci1710_ssi;
220         s->insn_config = i_APCI1710_InsnConfigInitSSI;
221         s->insn_read = i_APCI1710_InsnReadSSIValue;
222         s->insn_bits = i_APCI1710_InsnBitsSSIDigitalIO;
223
224         /*  Allocate and Initialise PULSEENCODER Subdevice Structures */
225         s = &dev->subdevices[7];
226         s->type = COMEDI_SUBD_PULSEENCODER;
227         s->subdev_flags =
228                 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
229         s->n_chan = 4;
230         s->maxdata = 1;
231         s->len_chanlist = 4;
232         s->range_table = &range_digital;
233         s->insn_config = i_APCI1710_InsnConfigInitPulseEncoder;
234         s->insn_write = i_APCI1710_InsnWriteEnableDisablePulseEncoder;
235         s->insn_bits = i_APCI1710_InsnBitsReadWritePulseEncoder;
236         s->insn_read = i_APCI1710_InsnReadInterruptPulseEncoder;
237
238         /*  Allocate and Initialise INCREMENTALCOUNTER Subdevice Structures */
239         s = &dev->subdevices[8];
240         s->type = COMEDI_SUBD_INCREMENTALCOUNTER;
241         s->subdev_flags =
242                 SDF_WRITEABLE | SDF_READABLE | SDF_GROUND | SDF_COMMON;
243         s->n_chan = 500;
244         s->maxdata = 1;
245         s->len_chanlist = 500;
246         s->range_table = &range_apci1710_inccpt;
247         s->insn_config = i_APCI1710_InsnConfigINCCPT;
248         s->insn_write = i_APCI1710_InsnWriteINCCPT;
249         s->insn_read = i_APCI1710_InsnReadINCCPT;
250         s->insn_bits = i_APCI1710_InsnBitsINCCPT;
251 }
252
253 static int i_APCI1710_Reset(struct comedi_device *dev)
254 {
255         struct addi_private *devpriv = dev->private;
256         int ret;
257         unsigned int dw_Dummy;
258
259         /*********************************/
260         /* Read all module configuration */
261         /*********************************/
262         ret = inl(devpriv->s_BoardInfos.ui_Address + 60);
263         devpriv->s_BoardInfos.dw_MolduleConfiguration[0] = ret;
264
265         ret = inl(devpriv->s_BoardInfos.ui_Address + 124);
266         devpriv->s_BoardInfos.dw_MolduleConfiguration[1] = ret;
267
268         ret = inl(devpriv->s_BoardInfos.ui_Address + 188);
269         devpriv->s_BoardInfos.dw_MolduleConfiguration[2] = ret;
270
271         ret = inl(devpriv->s_BoardInfos.ui_Address + 252);
272         devpriv->s_BoardInfos.dw_MolduleConfiguration[3] = ret;
273
274         /*  outl(0x80808082,devpriv->s_BoardInfos.ui_Address+0x60); */
275         outl(0x83838383, devpriv->s_BoardInfos.ui_Address + 0x60);
276
277         devpriv->s_BoardInfos.b_BoardVersion = 1;
278
279         /*  Enable the interrupt for the controller */
280         dw_Dummy = inl(devpriv->s_BoardInfos.ui_Address + 0x38);
281         outl(dw_Dummy | 0x2000, devpriv->s_BoardInfos.ui_Address + 0x38);
282
283         return 0;
284 }
285
286 /*
287 +----------------------------------------------------------------------------+
288 | Function's Name   : __void__ v_APCI1710_InterruptFunction                  |
289 |                               (unsigned char b_Interrupt, __CPPARGS)                |
290 +----------------------------------------------------------------------------+
291 | Task              : APCI-1710 interrupt function                           |
292 +----------------------------------------------------------------------------+
293 | Input Parameters  : unsigned char b_Interrupt : Interrupt number                    |
294 +----------------------------------------------------------------------------+
295 | Output Parameters : -                                                      |
296 +----------------------------------------------------------------------------+
297 | Return Value      : 0 : OK                                                 |
298 |                    -1 : Error                                              |
299 +----------------------------------------------------------------------------+
300 */
301
302 static void v_APCI1710_Interrupt(int irq, void *d)
303 {
304         struct comedi_device *dev = d;
305         struct addi_private *devpriv = dev->private;
306         unsigned char b_ModuleCpt = 0;
307         unsigned char b_InterruptFlag = 0;
308         unsigned char b_PWMCpt = 0;
309         unsigned char b_TorCounterCpt = 0;
310         unsigned char b_PulseIncoderCpt = 0;
311         unsigned int ui_16BitValue;
312         unsigned int ul_InterruptLatchReg = 0;
313         unsigned int ul_LatchRegisterValue = 0;
314         unsigned int ul_82X54InterruptStatus;
315         unsigned int ul_StatusRegister;
316
317         union str_ModuleInfo *ps_ModuleInfo;
318
319         printk("APCI1710 Interrupt\n");
320         for (b_ModuleCpt = 0; b_ModuleCpt < 4; b_ModuleCpt++, ps_ModuleInfo++) {
321
322                  /**************************/
323                 /* 1199/0225 to 0100/0226 */
324                  /**************************/
325                 ps_ModuleInfo = &devpriv->s_ModuleInfo[b_ModuleCpt];
326
327                  /***********************/
328                 /* Test if 82X54 timer */
329                  /***********************/
330
331                 if ((devpriv->s_BoardInfos.
332                                 dw_MolduleConfiguration[b_ModuleCpt] &
333                                 0xFFFF0000UL) == APCI1710_82X54_TIMER) {
334
335                         /* printk("TIMER Interrupt Occurred\n"); */
336                         ul_82X54InterruptStatus = inl(devpriv->s_BoardInfos.
337                                 ui_Address + 12 + (64 * b_ModuleCpt));
338
339                     /***************************/
340                         /* Test if interrupt occur */
341                     /***************************/
342
343                         if ((ul_82X54InterruptStatus & ps_ModuleInfo->
344                                         s_82X54ModuleInfo.
345                                         b_InterruptMask) != 0) {
346                                 devpriv->
347                                         s_InterruptParameters.
348                                         s_FIFOInterruptParameters[devpriv->
349                                         s_InterruptParameters.
350                                         ui_Write].
351                                         ul_OldInterruptMask =
352                                         (ul_82X54InterruptStatus &
353                                         ps_ModuleInfo->s_82X54ModuleInfo.
354                                         b_InterruptMask) << 4;
355
356                                 devpriv->
357                                         s_InterruptParameters.
358                                         s_FIFOInterruptParameters[devpriv->
359                                         s_InterruptParameters.
360                                         ui_Write].
361                                         b_OldModuleMask = 1 << b_ModuleCpt;
362
363                                 devpriv->
364                                         s_InterruptParameters.
365                                         s_FIFOInterruptParameters[devpriv->
366                                         s_InterruptParameters.
367                                         ui_Write].ul_OldCounterLatchValue = 0;
368
369                                 devpriv->
370                                         s_InterruptParameters.
371                                         ul_InterruptOccur++;
372
373                        /****************************/
374                                 /* Increment the write FIFO */
375                        /****************************/
376
377                                 devpriv->
378                                         s_InterruptParameters.
379                                         ui_Write = (devpriv->
380                                         s_InterruptParameters.
381                                         ui_Write + 1) % APCI1710_SAVE_INTERRUPT;
382
383                                 b_InterruptFlag = 1;
384
385                              /**********************/
386                                 /* Call user function */
387                              /**********************/
388                                 /* Send a signal to from kernel to user space */
389                                 send_sig(SIGIO, devpriv->tsk_Current, 0);
390
391                         }       /*  if ((ul_82X54InterruptStatus & 0x7) != 0) */
392                 }               /*  82X54 timer */
393
394                  /***************************/
395                 /* Test if increm. counter */
396                  /***************************/
397
398                 if ((devpriv->s_BoardInfos.
399                                 dw_MolduleConfiguration[b_ModuleCpt] &
400                                 0xFFFF0000UL) == APCI1710_INCREMENTAL_COUNTER) {
401
402                         ul_InterruptLatchReg = inl(devpriv->s_BoardInfos.
403                                 ui_Address + (64 * b_ModuleCpt));
404
405                     /*********************/
406                         /* Test if interrupt */
407                     /*********************/
408
409                         if ((ul_InterruptLatchReg & 0x22) && (ps_ModuleInfo->
410                                         s_SiemensCounterInfo.
411                                         s_ModeRegister.
412                                         s_ByteModeRegister.
413                                         b_ModeRegister2 & 0x80)) {
414                        /************************************/
415                                 /* Test if strobe latch I interrupt */
416                        /************************************/
417
418                                 if (ul_InterruptLatchReg & 2) {
419                                         ul_LatchRegisterValue =
420                                                 inl(devpriv->s_BoardInfos.
421                                                 ui_Address + 4 +
422                                                 (64 * b_ModuleCpt));
423
424                                         devpriv->
425                                                 s_InterruptParameters.
426                                                 s_FIFOInterruptParameters
427                                                 [devpriv->s_InterruptParameters.
428                                                 ui_Write].ul_OldInterruptMask =
429                                                 1UL;
430
431                                         devpriv->
432                                                 s_InterruptParameters.
433                                                 s_FIFOInterruptParameters
434                                                 [devpriv->s_InterruptParameters.
435                                                 ui_Write].b_OldModuleMask =
436                                                 1 << b_ModuleCpt;
437
438                                         devpriv->
439                                                 s_InterruptParameters.
440                                                 s_FIFOInterruptParameters
441                                                 [devpriv->s_InterruptParameters.
442                                                 ui_Write].
443                                                 ul_OldCounterLatchValue =
444                                                 ul_LatchRegisterValue;
445
446                                         devpriv->
447                                                 s_InterruptParameters.
448                                                 ul_InterruptOccur++;
449
450                           /****************************/
451                                         /* 0899/0224 to 1199/0225   */
452                           /****************************/
453                                         /* Increment the write FIFO */
454                       /****************************/
455
456                                         devpriv->
457                                                 s_InterruptParameters.
458                                                 ui_Write = (devpriv->
459                                                 s_InterruptParameters.
460                                                 ui_Write +
461                                                 1) % APCI1710_SAVE_INTERRUPT;
462
463                                         b_InterruptFlag = 1;
464
465                                 /**********************/
466                                         /* Call user function */
467                                 /**********************/
468                                         /* Send a signal to from kernel to user space */
469                                         send_sig(SIGIO, devpriv->tsk_Current,
470                                                 0);
471
472                                 }
473
474                        /*************************************/
475                                 /* Test if strobe latch II interrupt */
476                        /*************************************/
477
478                                 if (ul_InterruptLatchReg & 0x20) {
479
480                                         ul_LatchRegisterValue =
481                                                 inl(devpriv->s_BoardInfos.
482                                                 ui_Address + 8 +
483                                                 (64 * b_ModuleCpt));
484
485                                         devpriv->
486                                                 s_InterruptParameters.
487                                                 s_FIFOInterruptParameters
488                                                 [devpriv->s_InterruptParameters.
489                                                 ui_Write].ul_OldInterruptMask =
490                                                 2UL;
491
492                                         devpriv->
493                                                 s_InterruptParameters.
494                                                 s_FIFOInterruptParameters
495                                                 [devpriv->s_InterruptParameters.
496                                                 ui_Write].b_OldModuleMask =
497                                                 1 << b_ModuleCpt;
498
499                                         devpriv->
500                                                 s_InterruptParameters.
501                                                 s_FIFOInterruptParameters
502                                                 [devpriv->s_InterruptParameters.
503                                                 ui_Write].
504                                                 ul_OldCounterLatchValue =
505                                                 ul_LatchRegisterValue;
506
507                                         devpriv->
508                                                 s_InterruptParameters.
509                                                 ul_InterruptOccur++;
510
511                           /****************************/
512                                         /* 0899/0224 to 1199/0225   */
513                           /****************************/
514                                         /* Increment the write FIFO */
515                           /****************************/
516
517                                         devpriv->
518                                                 s_InterruptParameters.
519                                                 ui_Write = (devpriv->
520                                                 s_InterruptParameters.
521                                                 ui_Write +
522                                                 1) % APCI1710_SAVE_INTERRUPT;
523
524                                         b_InterruptFlag = 1;
525
526                             /**********************/
527                                         /* Call user function */
528                                 /**********************/
529                                         /* Send a signal to from kernel to user space */
530                                         send_sig(SIGIO, devpriv->tsk_Current,
531                                                 0);
532
533                                 }
534                         }
535
536                         ul_InterruptLatchReg = inl(devpriv->s_BoardInfos.
537                                 ui_Address + 24 + (64 * b_ModuleCpt));
538
539                     /***************************/
540                         /* Test if index interrupt */
541                     /***************************/
542
543                         if (ul_InterruptLatchReg & 0x8) {
544                                 ps_ModuleInfo->
545                                         s_SiemensCounterInfo.
546                                         s_InitFlag.b_IndexInterruptOccur = 1;
547
548                                 if (ps_ModuleInfo->
549                                         s_SiemensCounterInfo.
550                                         s_ModeRegister.
551                                         s_ByteModeRegister.
552                                         b_ModeRegister2 &
553                                         APCI1710_INDEX_AUTO_MODE) {
554
555                                         outl(ps_ModuleInfo->
556                                                 s_SiemensCounterInfo.
557                                                 s_ModeRegister.
558                                                 dw_ModeRegister1_2_3_4,
559                                                 devpriv->s_BoardInfos.
560                                                 ui_Address + 20 +
561                                                 (64 * b_ModuleCpt));
562                                 }
563
564                        /*****************************/
565                                 /* Test if interrupt enabled */
566                        /*****************************/
567
568                                 if ((ps_ModuleInfo->
569                                                 s_SiemensCounterInfo.
570                                                 s_ModeRegister.
571                                                 s_ByteModeRegister.
572                                                 b_ModeRegister3 &
573                                                 APCI1710_ENABLE_INDEX_INT) ==
574                                         APCI1710_ENABLE_INDEX_INT) {
575                                         devpriv->s_InterruptParameters.
576                                                 s_FIFOInterruptParameters
577                                                 [devpriv->s_InterruptParameters.
578                                                 ui_Write].ul_OldInterruptMask =
579                                                 4UL;
580
581                                         devpriv->
582                                                 s_InterruptParameters.
583                                                 s_FIFOInterruptParameters
584                                                 [devpriv->s_InterruptParameters.
585                                                 ui_Write].b_OldModuleMask =
586                                                 1 << b_ModuleCpt;
587
588                                         devpriv->
589                                                 s_InterruptParameters.
590                                                 s_FIFOInterruptParameters
591                                                 [devpriv->s_InterruptParameters.
592                                                 ui_Write].
593                                                 ul_OldCounterLatchValue =
594                                                 ul_LatchRegisterValue;
595
596                                         devpriv->
597                                                 s_InterruptParameters.
598                                                 ul_InterruptOccur++;
599
600                           /****************************/
601                                         /* 0899/0224 to 1199/0225   */
602                           /****************************/
603                                         /* Increment the write FIFO */
604                           /****************************/
605
606                                         devpriv->
607                                                 s_InterruptParameters.
608                                                 ui_Write = (devpriv->
609                                                 s_InterruptParameters.
610                                                 ui_Write +
611                                                 1) % APCI1710_SAVE_INTERRUPT;
612
613                                         b_InterruptFlag = 1;
614
615                                 /**********************/
616                                         /* Call user function */
617                                 /**********************/
618                                         /* Send a signal to from kernel to user space */
619                                         send_sig(SIGIO, devpriv->tsk_Current,
620                                                 0);
621
622                                 }
623                         }
624
625                     /*****************************/
626                         /* Test if compare interrupt */
627                     /*****************************/
628
629                         if (ul_InterruptLatchReg & 0x10) {
630                        /*****************************/
631                                 /* Test if interrupt enabled */
632                        /*****************************/
633
634                                 if ((ps_ModuleInfo->
635                                                 s_SiemensCounterInfo.
636                                                 s_ModeRegister.
637                                                 s_ByteModeRegister.
638                                                 b_ModeRegister3 &
639                                                 APCI1710_ENABLE_COMPARE_INT) ==
640                                         APCI1710_ENABLE_COMPARE_INT) {
641                                         devpriv->s_InterruptParameters.
642                                                 s_FIFOInterruptParameters
643                                                 [devpriv->s_InterruptParameters.
644                                                 ui_Write].ul_OldInterruptMask =
645                                                 8UL;
646
647                                         devpriv->
648                                                 s_InterruptParameters.
649                                                 s_FIFOInterruptParameters
650                                                 [devpriv->s_InterruptParameters.
651                                                 ui_Write].b_OldModuleMask =
652                                                 1 << b_ModuleCpt;
653
654                                         devpriv->
655                                                 s_InterruptParameters.
656                                                 s_FIFOInterruptParameters
657                                                 [devpriv->s_InterruptParameters.
658                                                 ui_Write].
659                                                 ul_OldCounterLatchValue =
660                                                 ul_LatchRegisterValue;
661
662                                         devpriv->
663                                                 s_InterruptParameters.
664                                                 ul_InterruptOccur++;
665
666                           /****************************/
667                                         /* 0899/0224 to 1199/0225   */
668                           /****************************/
669                                         /* Increment the write FIFO */
670                       /****************************/
671
672                                         devpriv->
673                                                 s_InterruptParameters.
674                                                 ui_Write = (devpriv->
675                                                 s_InterruptParameters.
676                                                 ui_Write +
677                                                 1) % APCI1710_SAVE_INTERRUPT;
678
679                                         b_InterruptFlag = 1;
680
681                                 /**********************/
682                                         /* Call user function */
683                                 /**********************/
684                                         /* Send a signal to from kernel to user space */
685                                         send_sig(SIGIO, devpriv->tsk_Current,
686                                                 0);
687
688                                 }
689                         }
690
691                     /*******************************************/
692                         /* Test if frequency measurement interrupt */
693                     /*******************************************/
694
695                         if (ul_InterruptLatchReg & 0x20) {
696                        /*******************/
697                                 /* Read the status */
698                        /*******************/
699
700                                 ul_StatusRegister = inl(devpriv->s_BoardInfos.
701                                         ui_Address + 32 + (64 * b_ModuleCpt));
702
703                        /******************/
704                                 /* Read the value */
705                        /******************/
706
707                                 ul_LatchRegisterValue =
708                                         inl(devpriv->s_BoardInfos.ui_Address +
709                                         28 + (64 * b_ModuleCpt));
710
711                                 switch ((ul_StatusRegister >> 1) & 3) {
712                                 case 0:
713                                /*************************/
714                                         /* Test the counter mode */
715                                /*************************/
716
717                                         if ((devpriv->s_ModuleInfo[b_ModuleCpt].
718                                                         s_SiemensCounterInfo.
719                                                         s_ModeRegister.
720                                                         s_ByteModeRegister.
721                                                         b_ModeRegister1 &
722                                                         APCI1710_16BIT_COUNTER)
723                                                 == APCI1710_16BIT_COUNTER) {
724                                   /****************************************/
725                                                 /* Test if 16-bit counter 1 pulse occur */
726                                   /****************************************/
727
728                                                 if ((ul_LatchRegisterValue &
729                                                                 0xFFFFU) != 0) {
730                                                         ui_16BitValue =
731                                                                 (unsigned int)
732                                                                 ul_LatchRegisterValue
733                                                                 & 0xFFFFU;
734                                                         ul_LatchRegisterValue =
735                                                                 (ul_LatchRegisterValue
736                                                                 & 0xFFFF0000UL)
737                                                                 | (0xFFFFU -
738                                                                 ui_16BitValue);
739                                                 }
740
741                                   /****************************************/
742                                                 /* Test if 16-bit counter 2 pulse occur */
743                                   /****************************************/
744
745                                                 if ((ul_LatchRegisterValue &
746                                                                 0xFFFF0000UL) !=
747                                                         0) {
748                                                         ui_16BitValue =
749                                                                 (unsigned int) (
750                                                                 (ul_LatchRegisterValue
751                                                                         >> 16) &
752                                                                 0xFFFFU);
753                                                         ul_LatchRegisterValue =
754                                                                 (ul_LatchRegisterValue
755                                                                 & 0xFFFFUL) |
756                                                                 ((0xFFFFU -
757                                                                         ui_16BitValue)
758                                                                 << 16);
759                                                 }
760                                         } else {
761                                                 if (ul_LatchRegisterValue != 0) {
762                                                         ul_LatchRegisterValue =
763                                                                 0xFFFFFFFFUL -
764                                                                 ul_LatchRegisterValue;
765                                                 }
766                                         }
767                                         break;
768
769                                 case 1:
770                                /****************************************/
771                                         /* Test if 16-bit counter 2 pulse occur */
772                                /****************************************/
773
774                                         if ((ul_LatchRegisterValue &
775                                                         0xFFFF0000UL) != 0) {
776                                                 ui_16BitValue =
777                                                         (unsigned int) (
778                                                         (ul_LatchRegisterValue
779                                                                 >> 16) &
780                                                         0xFFFFU);
781                                                 ul_LatchRegisterValue =
782                                                         (ul_LatchRegisterValue &
783                                                         0xFFFFUL) | ((0xFFFFU -
784                                                                 ui_16BitValue)
785                                                         << 16);
786                                         }
787                                         break;
788
789                                 case 2:
790                                /****************************************/
791                                         /* Test if 16-bit counter 1 pulse occur */
792                                /****************************************/
793
794                                         if ((ul_LatchRegisterValue & 0xFFFFU) !=
795                                                 0) {
796                                                 ui_16BitValue =
797                                                         (unsigned int)
798                                                         ul_LatchRegisterValue &
799                                                         0xFFFFU;
800                                                 ul_LatchRegisterValue =
801                                                         (ul_LatchRegisterValue &
802                                                         0xFFFF0000UL) | (0xFFFFU
803                                                         - ui_16BitValue);
804                                         }
805                                         break;
806                                 }
807
808                                 devpriv->
809                                         s_InterruptParameters.
810                                         s_FIFOInterruptParameters[devpriv->
811                                         s_InterruptParameters.
812                                         ui_Write].
813                                         ul_OldInterruptMask = 0x10000UL;
814
815                                 devpriv->
816                                         s_InterruptParameters.
817                                         s_FIFOInterruptParameters[devpriv->
818                                         s_InterruptParameters.
819                                         ui_Write].
820                                         b_OldModuleMask = 1 << b_ModuleCpt;
821
822                                 devpriv->
823                                         s_InterruptParameters.
824                                         s_FIFOInterruptParameters[devpriv->
825                                         s_InterruptParameters.
826                                         ui_Write].
827                                         ul_OldCounterLatchValue =
828                                         ul_LatchRegisterValue;
829
830                                 devpriv->
831                                         s_InterruptParameters.
832                                         ul_InterruptOccur++;
833
834                        /****************************/
835                                 /* 0899/0224 to 1199/0225   */
836                        /****************************/
837                                 /* Increment the write FIFO */
838                        /****************************/
839
840                                 devpriv->
841                                         s_InterruptParameters.
842                                         ui_Write = (devpriv->
843                                         s_InterruptParameters.
844                                         ui_Write + 1) % APCI1710_SAVE_INTERRUPT;
845
846                                 b_InterruptFlag = 1;
847
848                              /**********************/
849                                 /* Call user function */
850                              /**********************/
851                                 /* Send a signal to from kernel to user space */
852                                 send_sig(SIGIO, devpriv->tsk_Current, 0);
853
854                         }
855                 }               /*  Incremental counter */
856
857                  /***************/
858                 /* Test if CDA */
859                  /***************/
860
861                 if ((devpriv->s_BoardInfos.
862                                 dw_MolduleConfiguration[b_ModuleCpt] &
863                                 0xFFFF0000UL) == APCI1710_CDA) {
864                     /******************************************/
865                         /* Test if CDA enable and functionality 0 */
866                     /******************************************/
867
868                         if ((devpriv->s_ModuleInfo[b_ModuleCpt].
869                                         s_CDAModuleInfo.
870                                         b_CDAEnable == APCI1710_ENABLE)
871                                 && (devpriv->s_ModuleInfo[b_ModuleCpt].
872                                         s_CDAModuleInfo.b_FctSelection == 0)) {
873                        /****************************/
874                                 /* Get the interrupt status */
875                        /****************************/
876
877                                 ul_StatusRegister = inl(devpriv->s_BoardInfos.
878                                         ui_Address + 16 + (64 * b_ModuleCpt));
879                        /***************************/
880                                 /* Test if interrupt occur */
881                        /***************************/
882
883                                 if (ul_StatusRegister & 1) {
884                                         devpriv->
885                                                 s_InterruptParameters.
886                                                 s_FIFOInterruptParameters
887                                                 [devpriv->s_InterruptParameters.
888                                                 ui_Write].ul_OldInterruptMask =
889                                                 0x80000UL;
890
891                                         devpriv->
892                                                 s_InterruptParameters.
893                                                 s_FIFOInterruptParameters
894                                                 [devpriv->s_InterruptParameters.
895                                                 ui_Write].b_OldModuleMask =
896                                                 1 << b_ModuleCpt;
897
898                                         devpriv->
899                                                 s_InterruptParameters.
900                                                 s_FIFOInterruptParameters
901                                                 [devpriv->s_InterruptParameters.
902                                                 ui_Write].
903                                                 ul_OldCounterLatchValue = 0;
904
905                                         devpriv->
906                                                 s_InterruptParameters.
907                                                 ul_InterruptOccur++;
908
909                           /****************************/
910                                         /* Increment the write FIFO */
911                           /****************************/
912
913                                         devpriv->
914                                                 s_InterruptParameters.
915                                                 ui_Write = (devpriv->
916                                                 s_InterruptParameters.
917                                                 ui_Write +
918                                                 1) % APCI1710_SAVE_INTERRUPT;
919
920                                         b_InterruptFlag = 1;
921
922                                 /**********************/
923                                         /* Call user function */
924                                 /**********************/
925
926                                         /* Send a signal to from kernel to user space */
927                                         send_sig(SIGIO, devpriv->tsk_Current,
928                                                 0);
929
930                                 }       /*  if (ul_StatusRegister & 1) */
931
932                         }
933                 }               /*  CDA */
934
935                  /***********************/
936                 /* Test if PWM counter */
937                  /***********************/
938
939                 if ((devpriv->s_BoardInfos.
940                                 dw_MolduleConfiguration[b_ModuleCpt] &
941                                 0xFFFF0000UL) == APCI1710_PWM) {
942                         for (b_PWMCpt = 0; b_PWMCpt < 2; b_PWMCpt++) {
943                        /*************************************/
944                                 /* Test if PWM interrupt initialised */
945                        /*************************************/
946
947                                 if (devpriv->
948                                         s_ModuleInfo[b_ModuleCpt].
949                                         s_PWMModuleInfo.
950                                         s_PWMInfo[b_PWMCpt].
951                                         b_InterruptEnable == APCI1710_ENABLE) {
952                           /*****************************/
953                                         /* Read the interrupt status */
954                           /*****************************/
955
956                                         ul_StatusRegister =
957                                                 inl(devpriv->s_BoardInfos.
958                                                 ui_Address + 16 +
959                                                 (20 * b_PWMCpt) +
960                                                 (64 * b_ModuleCpt));
961
962                           /***************************/
963                                         /* Test if interrupt occur */
964                           /***************************/
965
966                                         if (ul_StatusRegister & 0x1) {
967                                                 devpriv->
968                                                         s_InterruptParameters.
969                                                         s_FIFOInterruptParameters
970                                                         [devpriv->
971                                                         s_InterruptParameters.
972                                                         ui_Write].
973                                                         ul_OldInterruptMask =
974                                                         0x4000UL << b_PWMCpt;
975
976                                                 devpriv->
977                                                         s_InterruptParameters.
978                                                         s_FIFOInterruptParameters
979                                                         [devpriv->
980                                                         s_InterruptParameters.
981                                                         ui_Write].
982                                                         b_OldModuleMask =
983                                                         1 << b_ModuleCpt;
984
985                                                 devpriv->
986                                                         s_InterruptParameters.
987                                                         ul_InterruptOccur++;
988
989                              /****************************/
990                                                 /* Increment the write FIFO */
991                              /****************************/
992
993                                                 devpriv->
994                                                         s_InterruptParameters.
995                                                         ui_Write = (devpriv->
996                                                         s_InterruptParameters.
997                                                         ui_Write +
998                                                         1) %
999                                                         APCI1710_SAVE_INTERRUPT;
1000
1001                                                 b_InterruptFlag = 1;
1002
1003                                    /**********************/
1004                                                 /* Call user function */
1005                                    /**********************/
1006                                                 /* Send a signal to from kernel to user space */
1007                                                 send_sig(SIGIO,
1008                                                         devpriv->tsk_Current,
1009                                                         0);
1010
1011                                         }       /*  if (ul_StatusRegister & 0x1) */
1012                                 }       /*  if (APCI1710_ENABLE) */
1013                         }       /*  for (b_PWMCpt == 0; b_PWMCpt < 0; b_PWMCpt ++) */
1014                 }               /*  PWM counter */
1015
1016                  /***********************/
1017                 /* Test if tor counter */
1018                  /***********************/
1019
1020                 if ((devpriv->s_BoardInfos.
1021                                 dw_MolduleConfiguration[b_ModuleCpt] &
1022                                 0xFFFF0000UL) == APCI1710_TOR_COUNTER) {
1023                         for (b_TorCounterCpt = 0; b_TorCounterCpt < 2;
1024                                 b_TorCounterCpt++) {
1025                        /*************************************/
1026                                 /* Test if tor interrupt initialised */
1027                        /*************************************/
1028
1029                                 if (devpriv->
1030                                         s_ModuleInfo[b_ModuleCpt].
1031                                         s_TorCounterModuleInfo.
1032                                         s_TorCounterInfo[b_TorCounterCpt].
1033                                         b_InterruptEnable == APCI1710_ENABLE) {
1034                           /*****************************/
1035                                         /* Read the interrupt status */
1036                           /*****************************/
1037
1038                                         ul_StatusRegister =
1039                                                 inl(devpriv->s_BoardInfos.
1040                                                 ui_Address + 12 +
1041                                                 (16 * b_TorCounterCpt) +
1042                                                 (64 * b_ModuleCpt));
1043
1044                           /***************************/
1045                                         /* Test if interrupt occur */
1046                           /***************************/
1047
1048                                         if (ul_StatusRegister & 0x1) {
1049                              /******************************/
1050                                                 /* Read the tor counter value */
1051                              /******************************/
1052
1053                                                 ul_LatchRegisterValue =
1054                                                         inl(devpriv->
1055                                                         s_BoardInfos.
1056                                                         ui_Address + 0 +
1057                                                         (16 * b_TorCounterCpt) +
1058                                                         (64 * b_ModuleCpt));
1059
1060                                                 devpriv->
1061                                                         s_InterruptParameters.
1062                                                         s_FIFOInterruptParameters
1063                                                         [devpriv->
1064                                                         s_InterruptParameters.
1065                                                         ui_Write].
1066                                                         ul_OldInterruptMask =
1067                                                         0x1000UL <<
1068                                                         b_TorCounterCpt;
1069
1070                                                 devpriv->
1071                                                         s_InterruptParameters.
1072                                                         s_FIFOInterruptParameters
1073                                                         [devpriv->
1074                                                         s_InterruptParameters.
1075                                                         ui_Write].
1076                                                         b_OldModuleMask =
1077                                                         1 << b_ModuleCpt;
1078
1079                                                 devpriv->
1080                                                         s_InterruptParameters.
1081                                                         s_FIFOInterruptParameters
1082                                                         [devpriv->
1083                                                         s_InterruptParameters.
1084                                                         ui_Write].
1085                                                         ul_OldCounterLatchValue
1086                                                         = ul_LatchRegisterValue;
1087
1088                                                 devpriv->
1089                                                         s_InterruptParameters.
1090                                                         ul_InterruptOccur++;
1091
1092                              /****************************/
1093                                                 /* Increment the write FIFO */
1094                              /****************************/
1095
1096                                                 devpriv->
1097                                                         s_InterruptParameters.
1098                                                         ui_Write = (devpriv->
1099                                                         s_InterruptParameters.
1100                                                         ui_Write +
1101                                                         1) %
1102                                                         APCI1710_SAVE_INTERRUPT;
1103
1104                                                 b_InterruptFlag = 1;
1105
1106                                    /**********************/
1107                                                 /* Call user function */
1108                                    /**********************/
1109
1110                                                 /* Send a signal to from kernel to user space */
1111                                                 send_sig(SIGIO,
1112                                                         devpriv->tsk_Current,
1113                                                         0);
1114                                         }       /*  if (ul_StatusRegister & 0x1) */
1115                                 }       /*  if (APCI1710_ENABLE) */
1116                         }       /*  for (b_TorCounterCpt == 0; b_TorCounterCpt < 0; b_TorCounterCpt ++) */
1117                 }               /*  Tor counter */
1118
1119                  /***********************/
1120                 /* Test if chronometer */
1121                  /***********************/
1122
1123                 if ((devpriv->s_BoardInfos.
1124                                 dw_MolduleConfiguration[b_ModuleCpt] &
1125                                 0xFFFF0000UL) == APCI1710_CHRONOMETER) {
1126
1127                         /* printk("APCI1710 Chrono Interrupt\n"); */
1128                     /*****************************/
1129                         /* Read the interrupt status */
1130                     /*****************************/
1131
1132                         ul_InterruptLatchReg = inl(devpriv->s_BoardInfos.
1133                                 ui_Address + 12 + (64 * b_ModuleCpt));
1134
1135                     /***************************/
1136                         /* Test if interrupt occur */
1137                     /***************************/
1138
1139                         if ((ul_InterruptLatchReg & 0x8) == 0x8) {
1140                        /****************************/
1141                                 /* Clear the interrupt flag */
1142                        /****************************/
1143
1144                                 outl(0, devpriv->s_BoardInfos.
1145                                         ui_Address + 32 + (64 * b_ModuleCpt));
1146
1147                        /***************************/
1148                                 /* Test if continuous mode */
1149                        /***************************/
1150
1151                                 if (ps_ModuleInfo->
1152                                         s_ChronoModuleInfo.
1153                                         b_CycleMode == APCI1710_ENABLE) {
1154                           /********************/
1155                                         /* Clear the status */
1156                           /********************/
1157
1158                                         outl(0, devpriv->s_BoardInfos.
1159                                                 ui_Address + 36 +
1160                                                 (64 * b_ModuleCpt));
1161                                 }
1162
1163                        /*************************/
1164                                 /* Read the timing value */
1165                        /*************************/
1166
1167                                 ul_LatchRegisterValue =
1168                                         inl(devpriv->s_BoardInfos.ui_Address +
1169                                         4 + (64 * b_ModuleCpt));
1170
1171                        /*****************************/
1172                                 /* Test if interrupt enabled */
1173                        /*****************************/
1174
1175                                 if (ps_ModuleInfo->
1176                                         s_ChronoModuleInfo.b_InterruptMask) {
1177                                         devpriv->
1178                                                 s_InterruptParameters.
1179                                                 s_FIFOInterruptParameters
1180                                                 [devpriv->s_InterruptParameters.
1181                                                 ui_Write].ul_OldInterruptMask =
1182                                                 0x80;
1183
1184                                         devpriv->
1185                                                 s_InterruptParameters.
1186                                                 s_FIFOInterruptParameters
1187                                                 [devpriv->s_InterruptParameters.
1188                                                 ui_Write].b_OldModuleMask =
1189                                                 1 << b_ModuleCpt;
1190
1191                                         devpriv->
1192                                                 s_InterruptParameters.
1193                                                 s_FIFOInterruptParameters
1194                                                 [devpriv->s_InterruptParameters.
1195                                                 ui_Write].
1196                                                 ul_OldCounterLatchValue =
1197                                                 ul_LatchRegisterValue;
1198
1199                                         devpriv->
1200                                                 s_InterruptParameters.
1201                                                 ul_InterruptOccur++;
1202
1203                           /****************************/
1204                                         /* Increment the write FIFO */
1205                       /****************************/
1206
1207                                         devpriv->
1208                                                 s_InterruptParameters.
1209                                                 ui_Write = (devpriv->
1210                                                 s_InterruptParameters.
1211                                                 ui_Write +
1212                                                 1) % APCI1710_SAVE_INTERRUPT;
1213
1214                                         b_InterruptFlag = 1;
1215
1216                                 /**********************/
1217                                         /* Call user function */
1218                                 /**********************/
1219                                         /* Send a signal to from kernel to user space */
1220                                         send_sig(SIGIO, devpriv->tsk_Current,
1221                                                 0);
1222
1223                                 }
1224                         }
1225                 }               /*  Chronometer */
1226
1227                  /*************************/
1228                 /* Test if pulse encoder */
1229                  /*************************/
1230
1231                 if ((devpriv->s_BoardInfos.
1232                                 dw_MolduleConfiguration[b_ModuleCpt] &
1233                                 0xFFFF0000UL) == APCI1710_PULSE_ENCODER) {
1234                     /****************************/
1235                         /* Read the status register */
1236                     /****************************/
1237
1238                         ul_StatusRegister = inl(devpriv->s_BoardInfos.
1239                                 ui_Address + 20 + (64 * b_ModuleCpt));
1240
1241                         if (ul_StatusRegister & 0xF) {
1242                                 for (b_PulseIncoderCpt = 0;
1243                                         b_PulseIncoderCpt < 4;
1244                                         b_PulseIncoderCpt++) {
1245                           /*************************************/
1246                                         /* Test if pulse encoder initialised */
1247                           /*************************************/
1248
1249                                         if ((ps_ModuleInfo->
1250                                                         s_PulseEncoderModuleInfo.
1251                                                         s_PulseEncoderInfo
1252                                                         [b_PulseIncoderCpt].
1253                                                         b_PulseEncoderInit == 1)
1254                                                 && (((ps_ModuleInfo->s_PulseEncoderModuleInfo.dw_SetRegister >> b_PulseIncoderCpt) & 1) == 1) && (((ul_StatusRegister >> (b_PulseIncoderCpt)) & 1) == 1)) {
1255                                                 devpriv->s_InterruptParameters.
1256                                                         s_FIFOInterruptParameters
1257                                                         [devpriv->
1258                                                         s_InterruptParameters.
1259                                                         ui_Write].
1260                                                         ul_OldInterruptMask =
1261                                                         0x100UL <<
1262                                                         b_PulseIncoderCpt;
1263
1264                                                 devpriv->
1265                                                         s_InterruptParameters.
1266                                                         s_FIFOInterruptParameters
1267                                                         [devpriv->
1268                                                         s_InterruptParameters.
1269                                                         ui_Write].
1270                                                         b_OldModuleMask =
1271                                                         1 << b_ModuleCpt;
1272
1273                                                 devpriv->
1274                                                         s_InterruptParameters.
1275                                                         s_FIFOInterruptParameters
1276                                                         [devpriv->
1277                                                         s_InterruptParameters.
1278                                                         ui_Write].
1279                                                         ul_OldCounterLatchValue
1280                                                         = ul_LatchRegisterValue;
1281
1282                                                 devpriv->
1283                                                         s_InterruptParameters.
1284                                                         ul_InterruptOccur++;
1285
1286                              /****************************/
1287                                                 /* 0899/0224 to 1199/0225   */
1288                              /****************************/
1289                                                 /* Increment the write FIFO */
1290                              /****************************/
1291
1292                                                 devpriv->
1293                                                         s_InterruptParameters.
1294                                                         ui_Write = (devpriv->
1295                                                         s_InterruptParameters.
1296                                                         ui_Write +
1297                                                         1) %
1298                                                         APCI1710_SAVE_INTERRUPT;
1299
1300                                                 b_InterruptFlag = 1;
1301
1302                                    /**********************/
1303                                                 /* Call user function */
1304                                    /**********************/
1305                                                 /* Send a signal to from kernel to user space */
1306                                                 send_sig(SIGIO,
1307                                                         devpriv->tsk_Current,
1308                                                         0);
1309
1310                                         }
1311                                 }
1312                         }
1313                 }               /* pulse encoder */
1314
1315         }
1316         return;
1317
1318 }