/**
@verbatim

Copyright (C) 2004,2005  ADDI-DATA GmbH for the source code of this module.

	ADDI-DATA GmbH
	Dieselstrasse 3
	D-77833 Ottersweier
	Tel: +19(0)7223/9493-0
	Fax: +49(0)7223/9493-92
	http://www.addi-data.com
	info@addi-data.com

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.

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.

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

You should also find the complete GPL in the COPYING file accompanying this source code.

@endverbatim
*/
/*

  +-----------------------------------------------------------------------+
  | (C) ADDI-DATA GmbH          Dieselstraße 3       D-77833 Ottersweier  |
  +-----------------------------------------------------------------------+
  | Tel : +49 (0) 7223/9493-0     | email    : info@addi-data.com         |
  | Fax : +49 (0) 7223/9493-92    | Internet : http://www.addi-data.com   |
  +-----------------------------------------------------------------------+
  | Project     : API APCI1710    | Compiler : gcc                        |
  | Module name : TOR.C           | Version  : 2.96                       |
  +-------------------------------+---------------------------------------+
  | Project manager: Eric Stolz   | Date     :  02/12/2002                |
  +-----------------------------------------------------------------------+
  | Description :   APCI-1710 tor counter module                          |
  |                                                                       |
  |                                                                       |
  +-----------------------------------------------------------------------+
  |                             UPDATES                                   |
  +-----------------------------------------------------------------------+
  |   Date   |   Author  |          Description of updates                |
  +----------+-----------+------------------------------------------------+
  | 27/01/99 | S. Weber  | 40 MHz implementation                          |
  +-----------------------------------------------------------------------+
  | 28/04/00 | S. Weber  | Simple,double and quadruple mode implementation|
  |          |           | Extern clock implementation                    |
  +-----------------------------------------------------------------------+
  | 08/05/00 | Guinot C  | - 0400/0228 All Function in RING 0             |
  |          |           |   available                                    |
  +-----------------------------------------------------------------------+
*/

#define APCI1710_30MHZ			30
#define APCI1710_33MHZ			33
#define APCI1710_40MHZ			40

#define APCI1710_GATE_INPUT		10

#define APCI1710_TOR_SIMPLE_MODE	2
#define APCI1710_TOR_DOUBLE_MODE	3
#define APCI1710_TOR_QUADRUPLE_MODE	4

#define APCI1710_SINGLE			0
#define APCI1710_CONTINUOUS		1

#define APCI1710_TOR_GETPROGRESSSTATUS	0
#define APCI1710_TOR_GETCOUNTERVALUE	1
#define APCI1710_TOR_READINTERRUPT	2

/*
+----------------------------------------------------------------------------+
| Function Name     : _INT_     i_APCI1710_InitTorCounter                    |
|                                       (unsigned char_     b_BoardHandle,            |
|                                        unsigned char_     b_ModulNbr,               |
|                                        unsigned char_     b_TorCounter,             |
|                                        unsigned char_     b_PCIInputClock,          |
|                                        unsigned char_     b_TimingUnit,             |
|                                        ULONG_   ul_TimingInterval,         |
|                                        PULONG_ pul_RealTimingInterval)     |
+----------------------------------------------------------------------------+
| Task              : Configure the selected tor counter (b_TorCounter)      |
|                     from selected module (b_ModulNbr).                     |
|                     The ul_TimingInterval and ul_TimingUnit determine the  |
|                     timing base for the measurement.                       |
|                     The pul_RealTimingInterval return the real timing      |
|                     value. You must calling this function be for you call  |
|                     any other function witch access of the tor counter.    |
|                                                                            |
+----------------------------------------------------------------------------+
| Input Parameters  :    |
|
		CR_AREF	unsigned char_   b_ModulNbr       : Module number to configure  |
|                                                (0 to 3)                    |
|           data[0] unsigned char_   b_TorCounter     : Tor counter selection       |
|                                                (0 or 1).                   |
|           data[1] unsigned char_   b_PCIInputClock  : Selection from PCI bus clock|
|                                                - APCI1710_30MHZ :          |
|                                                  The PC have a PCI bus     |
|                                                  clock from 30 MHz         |
|                                                - APCI1710_33MHZ :          |
|                                                  The PC have a PCI bus     |
|                                                  clock from 33 MHz         |
|                                                - APCI1710_40MHZ            |
|                                                  The APCI-1710 have a      |
|                                                  integrated 40Mhz          |
|                                                  quartz.                   |
|                                                - APCI1710_GATE_INPUT       |
|                                                  Used the gate input for   |
|						   the base clock. If you    |
|						   have selected this option,|
|						   than it is not possibl to |
|						   used the gate input for   |
|						   enabled the acquisition   |
|           data[2] unsigned char_   b_TimingUnit    : Base timing unit (0 to 4)    |
|                                                 0 : ns                     |
|                                                 1 : µs                     |
|                                                 2 : ms                     |
|                                                 3 : s                      |
|                                                 4 : mn                     |
|           data[3]          ULONG_ ul_TimingInterval : Base timing value.          |
+----------------------------------------------------------------------------+
| Output Parameters : PULONG_  pul_RealTimingInterval : Real  base timing    |
|                     data[0]                                  value.               |
+----------------------------------------------------------------------------+
| Return Value      :  0: No error                                           |
|                     -1: The handle parameter of the board is wrong         |
|                     -2: Module selection wrong                             |
|                     -3: The module is not a tor counter module             |
|                     -4: Tor counter selection is wrong                     |
|                     -5: The selected PCI input clock is wrong              |
|                     -6: Timing unit selection is wrong                     |
|                     -7: Base timing selection is wrong                     |
|                     -8: You can not used the 40MHz clock selection wich    |
|                         this board                                         |
|                     -9: You can not used the 40MHz clock selection wich    |
|                         this TOR version                                   |
+----------------------------------------------------------------------------+
*/

static int i_APCI1710_InsnConfigInitTorCounter(struct comedi_device *dev,
					       struct comedi_subdevice *s,
					       struct comedi_insn *insn,
					       unsigned int *data)
{
	struct addi_private *devpriv = dev->private;
	int i_ReturnValue = 0;
	unsigned int ul_TimerValue = 0;
	unsigned int dw_Command;
	double d_RealTimingInterval = 0;
	unsigned char b_ModulNbr;
	unsigned char b_TorCounter;
	unsigned char b_PCIInputClock;
	unsigned char b_TimingUnit;
	unsigned int ul_TimingInterval;
	unsigned int ul_RealTimingInterval = 0;

	i_ReturnValue = insn->n;
	b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec);

	b_TorCounter = (unsigned char) data[0];
	b_PCIInputClock = (unsigned char) data[1];
	b_TimingUnit = (unsigned char) data[2];
	ul_TimingInterval = (unsigned int) data[3];
	printk("INPUT clock %d\n", b_PCIInputClock);

		/**************************/
	/* Test the module number */
		/**************************/

	if (b_ModulNbr < 4) {
		/***********************/
		/* Test if tor counter */
		/***********************/

		if ((devpriv->s_BoardInfos.
				dw_MolduleConfiguration[b_ModulNbr] &
				0xFFFF0000UL) == APCI1710_TOR_COUNTER) {
	      /**********************************/
			/* Test the tor counter selection */
	      /**********************************/

			if (b_TorCounter <= 1) {
		 /**************************/
				/* Test the PCI bus clock */
		 /**************************/

				if ((b_PCIInputClock == APCI1710_30MHZ) ||
					(b_PCIInputClock == APCI1710_33MHZ) ||
					(b_PCIInputClock == APCI1710_40MHZ) ||
					(b_PCIInputClock ==
						APCI1710_GATE_INPUT)) {
		    /************************/
					/* Test the timing unit */
		    /************************/

					if ((b_TimingUnit <= 4)
						|| (b_PCIInputClock ==
							APCI1710_GATE_INPUT)) {
		       /**********************************/
						/* Test the base timing selection */
		       /**********************************/

						if (((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 0) && (ul_TimingInterval >= 133) && (ul_TimingInterval <= 0xFFFFFFFFUL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 1) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 571230650UL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 2) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 571230UL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 3) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 571UL)) || ((b_PCIInputClock == APCI1710_30MHZ) && (b_TimingUnit == 4) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 9UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 0) && (ul_TimingInterval >= 121) && (ul_TimingInterval <= 0xFFFFFFFFUL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 1) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 519691043UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 2) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 519691UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 3) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 520UL)) || ((b_PCIInputClock == APCI1710_33MHZ) && (b_TimingUnit == 4) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 8UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 0) && (ul_TimingInterval >= 100) && (ul_TimingInterval <= 0xFFFFFFFFUL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 1) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 429496729UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 2) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 429496UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 3) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 429UL)) || ((b_PCIInputClock == APCI1710_40MHZ) && (b_TimingUnit == 4) && (ul_TimingInterval >= 1) && (ul_TimingInterval <= 7UL)) || ((b_PCIInputClock == APCI1710_GATE_INPUT) && (ul_TimingInterval >= 2))) {
				/**************************/
							/* Test the board version */
				/**************************/

							if (((b_PCIInputClock == APCI1710_40MHZ) && (devpriv->s_BoardInfos.b_BoardVersion > 0)) || (b_PCIInputClock != APCI1710_40MHZ)) {
			     /************************/
								/* Test the TOR version */
			     /************************/

								if (((b_PCIInputClock == APCI1710_40MHZ) && ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3131)) || ((b_PCIInputClock == APCI1710_GATE_INPUT) && ((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3132)) || (b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ)) {
				/*********************************/
									/* Test if not extern clock used */
				/*********************************/

									if (b_PCIInputClock != APCI1710_GATE_INPUT) {
										fpu_begin
											();
				   /****************************************/
										/* Calculate the timer 0 division fator */
				   /****************************************/

										switch (b_TimingUnit) {
				      /******/
											/* ns */
				      /******/

										case 0:

					      /******************/
											/* Timer 0 factor */
					      /******************/

											ul_TimerValue
												=
												(unsigned int)
												(ul_TimingInterval
												*
												(0.00025 * b_PCIInputClock));

					      /*******************/
											/* Round the value */
					      /*******************/

											if ((double)((double)ul_TimingInterval * (0.00025 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
												ul_TimerValue
													=
													ul_TimerValue
													+
													1;
											}

					      /*****************************/
											/* Calculate the real timing */
					      /*****************************/

											ul_RealTimingInterval
												=
												(unsigned int)
												(ul_TimerValue
												/
												(0.00025 * (double)b_PCIInputClock));
											d_RealTimingInterval
												=
												(double)
												ul_TimerValue
												/
												(0.00025
												*
												(double)
												b_PCIInputClock);

											if ((double)((double)ul_TimerValue / (0.00025 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) {
												ul_RealTimingInterval
													=
													ul_RealTimingInterval
													+
													1;
											}

											ul_TimingInterval
												=
												ul_TimingInterval
												-
												1;
											ul_TimerValue
												=
												ul_TimerValue
												-
												2;

											if (b_PCIInputClock != APCI1710_40MHZ) {
												ul_TimerValue
													=
													(unsigned int)
													(
													(double)
													(ul_TimerValue)
													*
													1.007752288);
											}

											break;

				      /******/
											/* æs */
				      /******/

										case 1:

					      /******************/
											/* Timer 0 factor */
					      /******************/

											ul_TimerValue
												=
												(unsigned int)
												(ul_TimingInterval
												*
												(0.25 * b_PCIInputClock));

					      /*******************/
											/* Round the value */
					      /*******************/

											if ((double)((double)ul_TimingInterval * (0.25 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
												ul_TimerValue
													=
													ul_TimerValue
													+
													1;
											}

					      /*****************************/
											/* Calculate the real timing */
					      /*****************************/

											ul_RealTimingInterval
												=
												(unsigned int)
												(ul_TimerValue
												/
												(0.25 * (double)b_PCIInputClock));
											d_RealTimingInterval
												=
												(double)
												ul_TimerValue
												/
												(
												(double)
												0.25
												*
												(double)
												b_PCIInputClock);

											if ((double)((double)ul_TimerValue / (0.25 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) {
												ul_RealTimingInterval
													=
													ul_RealTimingInterval
													+
													1;
											}

											ul_TimingInterval
												=
												ul_TimingInterval
												-
												1;
											ul_TimerValue
												=
												ul_TimerValue
												-
												2;

											if (b_PCIInputClock != APCI1710_40MHZ) {
												ul_TimerValue
													=
													(unsigned int)
													(
													(double)
													(ul_TimerValue)
													*
													1.007752288);
											}

											break;

				      /******/
											/* ms */
				      /******/

										case 2:

					      /******************/
											/* Timer 0 factor */
					      /******************/

											ul_TimerValue
												=
												ul_TimingInterval
												*
												(250.0
												*
												b_PCIInputClock);

					      /*******************/
											/* Round the value */
					      /*******************/

											if ((double)((double)ul_TimingInterval * (250.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
												ul_TimerValue
													=
													ul_TimerValue
													+
													1;
											}

					      /*****************************/
											/* Calculate the real timing */
					      /*****************************/

											ul_RealTimingInterval
												=
												(unsigned int)
												(ul_TimerValue
												/
												(250.0 * (double)b_PCIInputClock));
											d_RealTimingInterval
												=
												(double)
												ul_TimerValue
												/
												(250.0
												*
												(double)
												b_PCIInputClock);

											if ((double)((double)ul_TimerValue / (250.0 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) {
												ul_RealTimingInterval
													=
													ul_RealTimingInterval
													+
													1;
											}

											ul_TimingInterval
												=
												ul_TimingInterval
												-
												1;
											ul_TimerValue
												=
												ul_TimerValue
												-
												2;

											if (b_PCIInputClock != APCI1710_40MHZ) {
												ul_TimerValue
													=
													(unsigned int)
													(
													(double)
													(ul_TimerValue)
													*
													1.007752288);
											}

											break;

				      /*****/
											/* s */
				      /*****/

										case 3:

					      /******************/
											/* Timer 0 factor */
					      /******************/

											ul_TimerValue
												=
												(unsigned int)
												(ul_TimingInterval
												*
												(250000.0
													*
													b_PCIInputClock));

					      /*******************/
											/* Round the value */
					      /*******************/

											if ((double)((double)ul_TimingInterval * (250000.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
												ul_TimerValue
													=
													ul_TimerValue
													+
													1;
											}

					      /*****************************/
											/* Calculate the real timing */
					      /*****************************/

											ul_RealTimingInterval
												=
												(unsigned int)
												(ul_TimerValue
												/
												(250000.0
													*
													(double)
													b_PCIInputClock));
											d_RealTimingInterval
												=
												(double)
												ul_TimerValue
												/
												(250000.0
												*
												(double)
												b_PCIInputClock);

											if ((double)((double)ul_TimerValue / (250000.0 * (double)b_PCIInputClock)) >= (double)((double)ul_RealTimingInterval + 0.5)) {
												ul_RealTimingInterval
													=
													ul_RealTimingInterval
													+
													1;
											}

											ul_TimingInterval
												=
												ul_TimingInterval
												-
												1;
											ul_TimerValue
												=
												ul_TimerValue
												-
												2;

											if (b_PCIInputClock != APCI1710_40MHZ) {
												ul_TimerValue
													=
													(unsigned int)
													(
													(double)
													(ul_TimerValue)
													*
													1.007752288);
											}

											break;

				      /******/
											/* mn */
				      /******/

										case 4:

					      /******************/
											/* Timer 0 factor */
					      /******************/

											ul_TimerValue
												=
												(unsigned int)
												(
												(ul_TimingInterval
													*
													60)
												*
												(250000.0
													*
													b_PCIInputClock));

					      /*******************/
											/* Round the value */
					      /*******************/

											if ((double)((double)(ul_TimingInterval * 60.0) * (250000.0 * (double)b_PCIInputClock)) >= ((double)((double)ul_TimerValue + 0.5))) {
												ul_TimerValue
													=
													ul_TimerValue
													+
													1;
											}

					      /*****************************/
											/* Calculate the real timing */
					      /*****************************/

											ul_RealTimingInterval
												=
												(unsigned int)
												(ul_TimerValue
												/
												(250000.0
													*
													(double)
													b_PCIInputClock))
												/
												60;
											d_RealTimingInterval
												=
												(
												(double)
												ul_TimerValue
												/
												(250000.0
													*
													(double)
													b_PCIInputClock))
												/
												60.0;

											if ((double)(((double)ul_TimerValue / (250000.0 * (double)b_PCIInputClock)) / 60.0) >= (double)((double)ul_RealTimingInterval + 0.5)) {
												ul_RealTimingInterval
													=
													ul_RealTimingInterval
													+
													1;
											}

											ul_TimingInterval
												=
												ul_TimingInterval
												-
												1;
											ul_TimerValue
												=
												ul_TimerValue
												-
												2;

											if (b_PCIInputClock != APCI1710_40MHZ) {
												ul_TimerValue
													=
													(unsigned int)
													(
													(double)
													(ul_TimerValue)
													*
													1.007752288);
											}

											break;
										}

										fpu_end();
									}	/*  if (b_PCIInputClock != APCI1710_GATE_INPUT) */
									else {
				   /*************************************************************/
										/* 2 Clock used for the overflow and the reload from counter */
				   /*************************************************************/

										ul_TimerValue
											=
											ul_TimingInterval
											-
											2;
									}	/*  if (b_PCIInputClock != APCI1710_GATE_INPUT) */

				/****************************/
									/* Save the PCI input clock */
				/****************************/
									devpriv->
										s_ModuleInfo
										[b_ModulNbr].
										s_TorCounterModuleInfo.
										b_PCIInputClock
										=
										b_PCIInputClock;

				/************************/
									/* Save the timing unit */
				/************************/

									devpriv->
										s_ModuleInfo
										[b_ModulNbr].
										s_TorCounterModuleInfo.
										s_TorCounterInfo
										[b_TorCounter].
										b_TimingUnit
										=
										b_TimingUnit;

				/************************/
									/* Save the base timing */
				/************************/
									devpriv->
										s_ModuleInfo
										[b_ModulNbr].
										s_TorCounterModuleInfo.
										s_TorCounterInfo
										[b_TorCounter].
										d_TimingInterval
										=
										d_RealTimingInterval;

									devpriv->
										s_ModuleInfo
										[b_ModulNbr].
										s_TorCounterModuleInfo.
										s_TorCounterInfo
										[b_TorCounter].
										ul_RealTimingInterval
										=
										ul_RealTimingInterval;

				/*******************/
									/* Get the command */
				/*******************/

									dw_Command
										=
										inl
										(devpriv->
										s_BoardInfos.
										ui_Address
										+
										4
										+
										(16 * b_TorCounter) + (64 * b_ModulNbr));

									dw_Command
										=
										(dw_Command
										>>
										4)
										&
										0xF;

				/******************/
									/* Test if 40 MHz */
				/******************/

									if (b_PCIInputClock == APCI1710_40MHZ) {
				   /****************************/
										/* Set the 40 MHz selection */
				   /****************************/

										dw_Command
											=
											dw_Command
											|
											0x10;
									}

				/*****************************/
									/* Test if extern clock used */
				/*****************************/

									if (b_PCIInputClock == APCI1710_GATE_INPUT) {
				   /****************************/
										/* Set the 40 MHz selection */
				   /****************************/

										dw_Command
											=
											dw_Command
											|
											0x20;
									}

				/*************************/
									/* Write the new command */
				/*************************/

									outl(dw_Command, devpriv->s_BoardInfos.ui_Address + 4 + (16 * b_TorCounter) + (64 * b_ModulNbr));

				/*******************/
									/* Disable the tor */
				/*******************/

									outl(0, devpriv->s_BoardInfos.ui_Address + 8 + (16 * b_TorCounter) + (64 * b_ModulNbr));
				/*************************/
									/* Set the timer 1 value */
				/*************************/

									outl(ul_TimerValue, devpriv->s_BoardInfos.ui_Address + 0 + (16 * b_TorCounter) + (64 * b_ModulNbr));

				/*********************/
									/* Tor counter init. */
				/*********************/

									devpriv->
										s_ModuleInfo
										[b_ModulNbr].
										s_TorCounterModuleInfo.
										s_TorCounterInfo
										[b_TorCounter].
										b_TorCounterInit
										=
										1;
								} else {
				/***********************************************/
									/* TOR version error for 40MHz clock selection */
				/***********************************************/

									DPRINTK("TOR version error for 40MHz clock selection\n");
									i_ReturnValue
										=
										-9;
								}
							} else {
			     /**************************************************************/
								/* You can not used the 40MHz clock selection wich this board */
			     /**************************************************************/

								DPRINTK("You can not used the 40MHz clock selection wich this board\n");
								i_ReturnValue =
									-8;
							}
						} else {
			  /**********************************/
							/* Base timing selection is wrong */
			  /**********************************/

							DPRINTK("Base timing selection is wrong\n");
							i_ReturnValue = -7;
						}
					}	/*  if ((b_TimingUnit >= 0) && (b_TimingUnit <= 4)) */
					else {
		       /**********************************/
						/* Timing unit selection is wrong */
		       /**********************************/

						DPRINTK("Timing unit selection is wrong\n");
						i_ReturnValue = -6;
					}	/*  if ((b_TimingUnit >= 0) && (b_TimingUnit <= 4)) */
				}	/*  if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ)) */
				else {
		    /*****************************************/
					/* The selected PCI input clock is wrong */
		    /*****************************************/

					DPRINTK("The selected PCI input clock is wrong\n");
					i_ReturnValue = -5;
				}	/*  if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ)) */
			}	/*  if (b_TorCounterMode >= 0 && b_TorCounterMode <= 7) */
			else {
		 /**********************************/
				/* Tor Counter selection is wrong */
		 /**********************************/

				DPRINTK("Tor Counter selection is wrong\n");
				i_ReturnValue = -4;
			}	/*  if (b_TorCounterMode >= 0 && b_TorCounterMode <= 7) */
		} else {
	      /******************************************/
			/* The module is not a tor counter module */
	      /******************************************/

			DPRINTK("The module is not a tor counter module\n");
			i_ReturnValue = -3;
		}
	} else {
	   /***********************/
		/* Module number error */
	   /***********************/

		DPRINTK("Module number error\n");
		i_ReturnValue = -2;
	}
	data[0] = (unsigned int) ul_RealTimingInterval;
	return i_ReturnValue;
}

/*
+----------------------------------------------------------------------------+
| Function Name     : _INT_ i_APCI1710_EnableTorCounter                      |
|                                               (unsigned char_ b_BoardHandle,        |
|                                                unsigned char_ b_ModulNbr,           |
|						 unsigned char_ b_TorCounter,         |
|						 unsigned char_ b_InputMode,          |
|						 unsigned char_ b_ExternGate,         |
|                                                unsigned char_ b_CycleMode,          |
|                                                unsigned char_ b_InterruptEnable)    |
+----------------------------------------------------------------------------+
| Task              : Enable the tor counter (b_TorCounter) from selected    |
|		      module (b_ModulNbr). You must calling the              |
|                     "i_APCI1710_InitTorCounter" function be for you call   |
|		      this function.                                         |
|                     If you enable the tor counter interrupt, the           |
|                     tor counter generate a interrupt after the timing cycle|
|                     See function "i_APCI1710_SetBoardIntRoutineX" and the  |
|                     Interrupt mask description chapter from this manual.   |
|                     The b_CycleMode parameter determine if you will        |
|                     measured a single or more cycle.                       |
+----------------------------------------------------------------------------+
| Input Parameters  : unsigned char_ b_BoardHandle  : Handle of board APCI-1710       |
|                     unsigned char_ b_ModulNbr     : Selected module number (0 to 3) |
|                     unsigned char_ b_TorCounter   : Tor counter selection (0 or 1). |
|		      unsigned char_ b_InputMode    : Input signal level selection    |
|						0 : Tor count each low level |
|						1 : Tor count each high level|
|		      unsigned char_ b_ExternGate   : Extern gate action selection    |
|						0 : Extern gate signal not   |
|						    used                     |
|						1 : Extern gate signal used. |
|						    If you selected the      |
|						    single mode, each high   |
|						    level signal start the   |
|						    counter.                 |
|						    If you selected the      |
|						    continuous mode, the     |
|						    first high level signal  |
|						    start the tor counter    |
|									     |
|					      APCI1710_TOR_QUADRUPLE _MODE : |
|					      In the quadruple mode, the edge|
|					      analysis circuit generates a   |
|					      counting pulse from each edge  |
|					      of 2 signals which are phase   |
|					      shifted in relation to each    |
|					      other.                         |
|					      The gate input is used for the |
|					      signal B                       |
|									     |
|					      APCI1710_TOR_DOUBLE_MODE:      |
|					      Functions in the same way as   |
|					      the quadruple mode, except that|
|					      only two of the four edges are |
|					      analysed per period.           |
|					      The gate input is used for the |
|					      signal B                       |
|									     |
|					      APCI1710_TOR_SIMPLE_MODE:      |
|					      Functions in the same way as   |
|					      the quadruple mode, except that|
|					      only one of the four edges is  |
|					      analysed per period.           |
|					      The gate input is used for the |
|					      signal B                       |
|									     |
|                     unsigned char_ b_CycleMode    : Selected the tor counter        |
|                                            acquisition mode                |
|                     unsigned char_ b_InterruptEnable : Enable or disable the        |
|                                               tor counter interrupt.       |
|                                               APCI1710_ENABLE:             |
|                                               Enable the tor counter       |
|                                               interrupt                    |
|                                               APCI1710_DISABLE:            |
|                                               Disable the tor counter      |
|                                               interrupt                    |
+----------------------------------------------------------------------------+
| Output Parameters : -                                                      |
+----------------------------------------------------------------------------+
| Return Value      :  0: No error                                           |
|                     -1: The handle parameter of the board is wrong         |
|                     -2: Module selection wrong                             |
|                     -3: The module is not a tor counter module             |
|                     -4: Tor counter selection is wrong                     |
|                     -5: Tor counter not initialised see function           |
|                         "i_APCI1710_InitTorCounter"                        |
|                     -6: Tor input signal selection is wrong                |
|                     -7: Extern gate signal mode is wrong                   |
|                     -8: Tor counter acquisition mode cycle is wrong        |
|                     -9: Interrupt parameter is wrong                       |
|                     -10:Interrupt function not initialised.                |
|                         See function "i_APCI1710_SetBoardIntRoutineX"      |
+----------------------------------------------------------------------------+
*/
/*
+----------------------------------------------------------------------------+
| Function Name     : _INT_ i_APCI1710_DisableTorCounter                     |
|                                               (unsigned char_  b_BoardHandle,       |
|                                                unsigned char_  b_ModulNbr,          |
|						 unsigned char_  b_TorCounter)        |
+----------------------------------------------------------------------------+
| Task              : Disable the tor counter (b_TorCounter) from selected   |
|		      module (b_ModulNbr). If you disable the tor counter    |
|		      after a start cycle occur and you restart the tor      |
|		      counter witch the " i_APCI1710_EnableTorCounter"       |
|		      function, the status register is cleared               |
+----------------------------------------------------------------------------+
| Input Parameters  : unsigned char_ b_BoardHandle  : Handle of board APCI-1710       |
|                     unsigned char_ b_ModulNbr     : Selected module number (0 to 3) |
|                     unsigned char_ b_TorCounter   : Tor counter selection (0 or 1). |
+----------------------------------------------------------------------------+
| Output Parameters : -                                                      |
+----------------------------------------------------------------------------+
| Return Value      :  0: No error                                           |
|                     -1: The handle parameter of the board is wrong         |
|                     -2: Module selection wrong                             |
|                     -3: The module is not a tor counter module             |
|                     -4: Tor counter selection is wrong                     |
|                     -5: Tor counter not initialised see function           |
|                         "i_APCI1710_InitTorCounter"                        |
|                     -6: Tor counter not enabled see function               |
|                         "i_APCI1710_EnableTorCounter"                      |
+----------------------------------------------------------------------------+
*/

static int i_APCI1710_InsnWriteEnableDisableTorCounter(struct comedi_device *dev,
						       struct comedi_subdevice *s,
						       struct comedi_insn *insn,
						       unsigned int *data)
{
	struct addi_private *devpriv = dev->private;
	int i_ReturnValue = 0;
	unsigned int dw_Status;
	unsigned int dw_DummyRead;
	unsigned int dw_ConfigReg;
	unsigned char b_ModulNbr, b_Action;
	unsigned char b_TorCounter;
	unsigned char b_InputMode;
	unsigned char b_ExternGate;
	unsigned char b_CycleMode;
	unsigned char b_InterruptEnable;

	b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec);
	b_Action = (unsigned char) data[0];	/*  enable or disable */
	b_TorCounter = (unsigned char) data[1];
	b_InputMode = (unsigned char) data[2];
	b_ExternGate = (unsigned char) data[3];
	b_CycleMode = (unsigned char) data[4];
	b_InterruptEnable = (unsigned char) data[5];
	i_ReturnValue = insn->n;
	devpriv->tsk_Current = current;	/*  Save the current process task structure */
	/**************************/
	/* Test the module number */
	/**************************/

	if (b_ModulNbr < 4) {
	   /***********************/
		/* Test if tor counter */
	   /***********************/

		if ((devpriv->s_BoardInfos.
				dw_MolduleConfiguration[b_ModulNbr] &
				0xFFFF0000UL) == APCI1710_TOR_COUNTER) {
	      /**********************************/
			/* Test the tor counter selection */
	      /**********************************/

			if (b_TorCounter <= 1) {
				switch (b_Action)	/*  Enable or Disable */
				{
				case APCI1710_ENABLE:
		 /***********************************/
					/* Test if tor counter initialised */
		 /***********************************/

					dw_Status =
						inl(devpriv->s_BoardInfos.
						ui_Address + 8 +
						(16 * b_TorCounter) +
						(64 * b_ModulNbr));

					if (dw_Status & 0x10) {
		    /******************************/
						/* Test the input signal mode */
		    /******************************/

						if (b_InputMode == 0 ||
							b_InputMode == 1 ||
							b_InputMode ==
							APCI1710_TOR_SIMPLE_MODE
							|| b_InputMode ==
							APCI1710_TOR_DOUBLE_MODE
							|| b_InputMode ==
							APCI1710_TOR_QUADRUPLE_MODE)
						{
		       /************************************/
							/* Test the extern gate signal mode */
		       /************************************/

							if (b_ExternGate == 0
								|| b_ExternGate
								== 1
								|| b_InputMode >
								1) {
			  /*********************************/
								/* Test the cycle mode parameter */
			  /*********************************/

								if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS)) {
			     /***************************/
									/* Test the interrupt flag */
			     /***************************/

									if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE)) {

				   /***************************/
										/* Save the interrupt mode */
				   /***************************/

										devpriv->
											s_ModuleInfo
											[b_ModulNbr].
											s_TorCounterModuleInfo.
											s_TorCounterInfo
											[b_TorCounter].
											b_InterruptEnable
											=
											b_InterruptEnable;

				   /*******************/
										/* Get the command */
				   /*******************/

										dw_ConfigReg
											=
											inl
											(devpriv->
											s_BoardInfos.
											ui_Address
											+
											4
											+
											(16 * b_TorCounter) + (64 * b_ModulNbr));

										dw_ConfigReg
											=
											(dw_ConfigReg
											>>
											4)
											&
											0x30;

				   /********************************/
										/* Test if not direct mode used */
				   /********************************/

										if (b_InputMode > 1) {
				      /*******************************/
											/* Extern gate can not be used */
				      /*******************************/

											b_ExternGate
												=
												0;

				      /*******************************************/
											/* Enable the extern gate for the Signal B */
				      /*******************************************/

											dw_ConfigReg
												=
												dw_ConfigReg
												|
												0x40;

				      /***********************/
											/* Test if simple mode */
				      /***********************/

											if (b_InputMode == APCI1710_TOR_SIMPLE_MODE) {
					 /**************************/
												/* Enable the sinple mode */
					 /**************************/

												dw_ConfigReg
													=
													dw_ConfigReg
													|
													0x780;

											}	/*  if (b_InputMode == APCI1710_TOR_SIMPLE_MODE) */

				      /***********************/
											/* Test if double mode */
				      /***********************/

											if (b_InputMode == APCI1710_TOR_DOUBLE_MODE) {
					 /**************************/
												/* Enable the double mode */
					 /**************************/

												dw_ConfigReg
													=
													dw_ConfigReg
													|
													0x180;

											}	/*  if (b_InputMode == APCI1710_TOR_DOUBLE_MODE) */

											b_InputMode
												=
												0;
										}	/*  if (b_InputMode > 1) */

				   /*******************/
										/* Set the command */
				   /*******************/

										dw_ConfigReg
											=
											dw_ConfigReg
											|
											b_CycleMode
											|
											(b_InterruptEnable
											*
											2)
											|
											(b_InputMode
											*
											4)
											|
											(b_ExternGate
											*
											8);

				   /*****************************/
										/* Clear the status register */
				   /*****************************/

										dw_DummyRead
											=
											inl
											(devpriv->
											s_BoardInfos.
											ui_Address
											+
											0
											+
											(16 * b_TorCounter) + (64 * b_ModulNbr));

				   /***************************************/
										/* Clear the interrupt status register */
				   /***************************************/

										dw_DummyRead
											=
											inl
											(devpriv->
											s_BoardInfos.
											ui_Address
											+
											12
											+
											(16 * b_TorCounter) + (64 * b_ModulNbr));

				   /********************/
										/* Set the commando */
				   /********************/

										outl(dw_ConfigReg, devpriv->s_BoardInfos.ui_Address + 4 + (16 * b_TorCounter) + (64 * b_ModulNbr));

				   /****************/
										/* Set the gate */
				   /****************/

										outl(1, devpriv->s_BoardInfos.ui_Address + 8 + (16 * b_TorCounter) + (64 * b_ModulNbr));

									}	/*  if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE)) */
									else {
				/********************************/
										/* Interrupt parameter is wrong */
				/********************************/

										DPRINTK("Interrupt parameter is wrong\n");
										i_ReturnValue
											=
											-9;
									}	/*  if ((b_InterruptEnable == APCI1710_ENABLE) || (b_InterruptEnable == APCI1710_DISABLE)) */
								}	/*  if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS)) */
								else {
			     /***********************************************/
									/* Tor counter acquisition mode cycle is wrong */
			     /***********************************************/

									DPRINTK("Tor counter acquisition mode cycle is wrong\n");
									i_ReturnValue
										=
										-8;
								}	/*  if ((b_CycleMode == APCI1710_SINGLE) || (b_CycleMode == APCI1710_CONTINUOUS)) */
							}	/*  if (b_ExternGate >= 0 && b_ExternGate <= 1) */
							else {
			  /***********************************/
								/* Extern gate input mode is wrong */
			  /***********************************/

								DPRINTK("Extern gate input mode is wrong\n");
								i_ReturnValue =
									-7;
							}	/*  if (b_ExternGate >= 0 && b_ExternGate <= 1) */
						}	/*  if (b_InputMode >= 0 && b_InputMode <= 1) */
						else {
		       /***************************************/
							/* Tor input signal selection is wrong */
		       /***************************************/

							DPRINTK("Tor input signal selection is wrong\n");
							i_ReturnValue = -6;
						}
					} else {
		    /*******************************/
						/* Tor counter not initialised */
		    /*******************************/

						DPRINTK("Tor counter not initialised\n");
						i_ReturnValue = -5;
					}
					break;

				case APCI1710_DISABLE:
			 /***********************************/
					/* Test if tor counter initialised */
		 /***********************************/

					dw_Status = inl(devpriv->s_BoardInfos.
						ui_Address + 8 +
						(16 * b_TorCounter) +
						(64 * b_ModulNbr));

		 /*******************************/
					/* Test if counter initialised */
		 /*******************************/

					if (dw_Status & 0x10) {
		    /***************************/
						/* Test if counter enabled */
		    /***************************/

						if (dw_Status & 0x1) {
		       /****************************/
							/* Clear the interrupt mode */
		       /****************************/
							devpriv->
								s_ModuleInfo
								[b_ModulNbr].
								s_TorCounterModuleInfo.
								s_TorCounterInfo
								[b_TorCounter].
								b_InterruptEnable
								=
								APCI1710_DISABLE;

		       /******************/
							/* Clear the gate */
		       /******************/

							outl(0, devpriv->
								s_BoardInfos.
								ui_Address + 8 +
								(16 * b_TorCounter) + (64 * b_ModulNbr));
						}	/*  if (dw_Status & 0x1) */
						else {
		       /***************************/
							/* Tor counter not enabled */
		       /***************************/

							DPRINTK("Tor counter not enabled \n");
							i_ReturnValue = -6;
						}	/*  if (dw_Status & 0x1) */
					}	/*  if (dw_Status & 0x10) */
					else {
		    /*******************************/
						/* Tor counter not initialised */
		    /*******************************/

						DPRINTK("Tor counter not initialised\n");
						i_ReturnValue = -5;
					}	/*  // if (dw_Status & 0x10) */

				}	/*  switch */
			}	/*  if (b_TorCounter <= 1) */
			else {
		 /**********************************/
				/* Tor counter selection is wrong */
		 /**********************************/

				DPRINTK("Tor counter selection is wrong\n");
				i_ReturnValue = -4;
			}	/*  if (b_TorCounter <= 1) */
		} else {
	      /******************************************/
			/* The module is not a tor counter module */
	      /******************************************/

			DPRINTK("The module is not a tor counter module \n");
			i_ReturnValue = -3;
		}
	} else {
	   /***********************/
		/* Module number error */
	   /***********************/

		DPRINTK("Module number error \n");
		i_ReturnValue = -2;
	}

	return i_ReturnValue;
}

/*
+----------------------------------------------------------------------------+
| Function Name     : _INT_ i_APCI1710_GetTorCounterInitialisation           |
|                                               (unsigned char_     b_BoardHandle,    |
|                                                unsigned char_     b_ModulNbr,       |
|						 unsigned char_     b_TorCounter,     |
|                                        	 unsigned char *_   pb_TimingUnit,     |
|                                        	 PULONG_ pul_TimingInterval, |
|						 unsigned char *_   pb_InputMode,      |
|						 unsigned char *_   pb_ExternGate,     |
|                                                unsigned char *_   pb_CycleMode,      |
|						 unsigned char *_   pb_Enable,         |
|                                                unsigned char *_   pb_InterruptEnable)|
+----------------------------------------------------------------------------+
| Task              : Enable the tor counter (b_TorCounter) from selected    |
|		      module (b_ModulNbr). You must calling the              |
|                     "i_APCI1710_InitTorCounter" function be for you call   |
|		      this function.                                         |
|                     If you enable the tor counter interrupt, the           |
|                     tor counter generate a interrupt after the timing cycle|
|                     See function "i_APCI1710_SetBoardIntRoutineX" and the  |
|                     Interrupt mask description chapter from this manual.   |
|                     The b_CycleMode parameter determine if you will        |
|                     measured a single or more cycle.                       |
+----------------------------------------------------------------------------+
| Input Parameters  : unsigned char_ b_BoardHandle  : Handle of board APCI-1710       |
|                     unsigned char_ b_ModulNbr     : Selected module number (0 to 3) |
|                     unsigned char_ b_TorCounter   : Tor counter selection (0 or 1)

	b_ModulNbr			=	CR_AREF(insn->chanspec);
	b_TorCounter		=	CR_CHAN(insn->chanspec);
. |
+----------------------------------------------------------------------------+
| Output Parameters : unsigned char *_  pb_TimingUnit    : Base timing unit (0 to 4)   |
|                                                 0 : ns                     |
|                                                 1 : µs                     |
|                                                 2 : ms                     |
|                                                 3 : s                      |
|                                                 4 : mn                     |
|                     PULONG_ pul_TimingInterval : Base timing value.        |
|		      unsigned char *_ pb_InputMode        : Input signal level        |
|						   selection  		     |
|						0 : Tor count each low level |
|						1 : Tor count each high level|
|		      unsigned char *_ pb_ExternGate	: Extern gate action         |
|						  selection                  |
|						  0 : Extern gate signal not |
|						      used                   |
|						  1 : Extern gate signal used|
|                     unsigned char *_ pb_CycleMode       : Tor counter acquisition    |
|						  mode           	     |
|		      unsigned char *_ pb_Enable		: Indicate if the tor counter|
|						  is enabled or no           |
|						  0 : Tor counter disabled   |
|						  1 : Tor counter enabled    |
|                     unsigned char *_ pb_InterruptEnable : Enable or disable the      |
|                                                 tor counter interrupt.     |
|                                                 APCI1710_ENABLE:           |
|                                                 Enable the tor counter     |
|                                                 interrupt                  |
|                                                 APCI1710_DISABLE:          |
|                                                 Disable the tor counter    |
|                                                 interrupt
	pb_TimingUnit		=	(unsigned char *) &data[0];
	pul_TimingInterval	=  (unsigned int *) &data[1];
	pb_InputMode		=	(unsigned char *) &data[2];
	pb_ExternGate		=	(unsigned char *) &data[3];
	pb_CycleMode		=	(unsigned char *) &data[4];
	pb_Enable			=	(unsigned char *) &data[5];
	pb_InterruptEnable	=	(unsigned char *) &data[6];
                 |
+----------------------------------------------------------------------------+
| Return Value      :  0: No error                                           |
|                     -1: The handle parameter of the board is wrong         |
|                     -2: Module selection wrong                             |
|                     -3: The module is not a tor counter module             |
|                     -4: Tor counter selection is wrong                     |
|                     -5: Tor counter not initialised see function           |
|                         "i_APCI1710_InitTorCounter"                        |
+----------------------------------------------------------------------------+
*/

static int i_APCI1710_InsnReadGetTorCounterInitialisation(struct comedi_device *dev,
							  struct comedi_subdevice *s,
							  struct comedi_insn *insn,
							  unsigned int *data)
{
	struct addi_private *devpriv = dev->private;
	int i_ReturnValue = 0;
	unsigned int dw_Status;
	unsigned char b_ModulNbr;
	unsigned char b_TorCounter;
	unsigned char *pb_TimingUnit;
	unsigned int *pul_TimingInterval;
	unsigned char *pb_InputMode;
	unsigned char *pb_ExternGate;
	unsigned char *pb_CycleMode;
	unsigned char *pb_Enable;
	unsigned char *pb_InterruptEnable;

	i_ReturnValue = insn->n;
	b_ModulNbr = CR_AREF(insn->chanspec);
	b_TorCounter = CR_CHAN(insn->chanspec);

	pb_TimingUnit = (unsigned char *) &data[0];
	pul_TimingInterval = (unsigned int *) &data[1];
	pb_InputMode = (unsigned char *) &data[2];
	pb_ExternGate = (unsigned char *) &data[3];
	pb_CycleMode = (unsigned char *) &data[4];
	pb_Enable = (unsigned char *) &data[5];
	pb_InterruptEnable = (unsigned char *) &data[6];

	/**************************/
	/* Test the module number */
	/**************************/

	if (b_ModulNbr < 4) {
	   /***********************/
		/* Test if tor counter */
	   /***********************/

		if ((devpriv->s_BoardInfos.
				dw_MolduleConfiguration[b_ModulNbr] &
				0xFFFF0000UL) == APCI1710_TOR_COUNTER) {
	      /**********************************/
			/* Test the tor counter selection */
	      /**********************************/

			if (b_TorCounter <= 1) {

		 /***********************************/
				/* Test if tor counter initialised */
		 /***********************************/

				dw_Status = inl(devpriv->s_BoardInfos.
					ui_Address + 8 + (16 * b_TorCounter) +
					(64 * b_ModulNbr));

				if (dw_Status & 0x10) {
					*pb_Enable = dw_Status & 1;

		    /********************/
					/* Get the commando */
		    /********************/

					dw_Status = inl(devpriv->s_BoardInfos.
						ui_Address + 4 +
						(16 * b_TorCounter) +
						(64 * b_ModulNbr));

					*pb_CycleMode =
						(unsigned char) ((dw_Status >> 4) & 1);
					*pb_InterruptEnable =
						(unsigned char) ((dw_Status >> 5) & 1);

		    /******************************************************/
					/* Test if extern gate used for clock or for signal B */
		    /******************************************************/

					if (dw_Status & 0x600) {
		       /*****************************************/
						/* Test if extern gate used for signal B */
		       /*****************************************/

						if (dw_Status & 0x400) {
			  /***********************/
							/* Test if simple mode */
			  /***********************/

							if ((dw_Status & 0x7800)
								== 0x7800) {
								*pb_InputMode =
									APCI1710_TOR_SIMPLE_MODE;
							}

			  /***********************/
							/* Test if double mode */
			  /***********************/

							if ((dw_Status & 0x7800)
								== 0x1800) {
								*pb_InputMode =
									APCI1710_TOR_DOUBLE_MODE;
							}

			  /**************************/
							/* Test if quadruple mode */
			  /**************************/

							if ((dw_Status & 0x7800)
								== 0x0000) {
								*pb_InputMode =
									APCI1710_TOR_QUADRUPLE_MODE;
							}
						}	/*  if (dw_Status & 0x400) */
						else {
							*pb_InputMode = 1;
						}	/*  // if (dw_Status & 0x400) */

		       /************************/
						/* Extern gate not used */
		       /************************/

						*pb_ExternGate = 0;
					}	/*  if (dw_Status & 0x600) */
					else {
						*pb_InputMode =
							(unsigned char) ((dw_Status >> 6)
							& 1);
						*pb_ExternGate =
							(unsigned char) ((dw_Status >> 7)
							& 1);
					}	/*  if (dw_Status & 0x600) */

					*pb_TimingUnit =
						devpriv->
						s_ModuleInfo[b_ModulNbr].
						s_TorCounterModuleInfo.
						s_TorCounterInfo[b_TorCounter].
						b_TimingUnit;

					*pul_TimingInterval =
						devpriv->
						s_ModuleInfo[b_ModulNbr].
						s_TorCounterModuleInfo.
						s_TorCounterInfo[b_TorCounter].
						ul_RealTimingInterval;
				} else {
		    /*******************************/
					/* Tor counter not initialised */
		    /*******************************/

					DPRINTK("Tor counter not initialised\n");
					i_ReturnValue = -5;
				}

			}	/*  if (b_TorCounter <= 1) */
			else {
		 /**********************************/
				/* Tor counter selection is wrong */
		 /**********************************/

				DPRINTK("Tor counter selection is wrong \n");
				i_ReturnValue = -4;
			}	/*  if (b_TorCounter <= 1) */
		} else {
	      /******************************************/
			/* The module is not a tor counter module */
	      /******************************************/

			DPRINTK("The module is not a tor counter module\n");
			i_ReturnValue = -3;
		}
	} else {
	   /***********************/
		/* Module number error */
	   /***********************/

		DPRINTK("Module number error\n");
		i_ReturnValue = -2;
	}

	return i_ReturnValue;
}

/*
+----------------------------------------------------------------------------+
| Function Name     : _INT_ i_APCI1710_ReadTorCounterValue                   |
|                               (unsigned char_     b_BoardHandle,                    |
|                                unsigned char_     b_ModulNbr,                       |
|				 unsigned char_     b_TorCounter,                     |
|                                unsigned int_    ui_TimeOut,                        |
|                                unsigned char *_   pb_TorCounterStatus,               |
|                                PULONG_ pul_TorCounterValue)                |
+----------------------------------------------------------------------------+
| Task        	case APCI1710_TOR_GETPROGRESSSTATUS: Return the tor counter
(b_TorCounter) status (pb_TorCounterStatus) from selected tor counter        |
|		      module (b_ModulNbr).

				 case APCI1710_TOR_GETCOUNTERVALUE :
  Return the tor counter (b_TorCounter) status           |
|		      (pb_TorCounterStatus) and the timing value             |
|		      (pul_TorCounterValue) after a conting cycle stop       |
|                     from selected tor counter module (b_ModulNbr).         |
+----------------------------------------------------------------------------+
| Input Parameters  : unsigned char_ b_BoardHandle  : Handle of board APCI-1710       |
|                     unsigned char_ b_ModulNbr     : Selected module number (0 to 3) |
|                     unsigned char_ b_TorCounter   : Tor counter selection (0 or 1).
	b_ModulNbr    = CR_AREF(insn->chanspec);
	b_ReadType    = (unsigned char) data[0];
	b_TorCounter  =	(unsigned char) data[1];
	ui_TimeOut	  = (unsigned int) data[2]; |
+----------------------------------------------------------------------------+
| Output Parameters : unsigned char *_  pb_TorCounterStatus : Return the tor counter   |
|                                                    status.                 |
|                                               0 : Conting cycle not started|
|                                                   Software gate not set.   |
|                                               1 : Conting cycle started.   |
|                                                   Software gate set.       |
|                                               2 : Conting cycle stopped.   |
|                                                   The conting cycle is     |
|                                                   terminate.               |
|                                               3 : A overflow occur. You    |
|                                                   must change the base     |
|                                                   timing witch the         |
|                                                   function                 |
|                                                 "i_APCI1710_InitTorCounter"|
|						4 : Timeeout occur           |
|                     unsigned int *  pul_TorCounterValue  : Tor counter value.
	pb_TorCounterStatus=(unsigned char *) &data[0];
	pul_TorCounterValue=(unsigned int *) &data[1];    |
+----------------------------------------------------------------------------+
| Return Value      :  0: No error                                           |
|                     -1: The handle parameter of the board is wrong         |
|                     -2: Module selection wrong                             |
|                     -3: The module is not a tor counter module             |
|                     -4: Tor counter selection is wrong                     |
|                     -5: Tor counter not initialised see function           |
|                         "i_APCI1710_InitTorCounter"                        |
|                     -6: Tor counter not enabled see function               |
|                         "i_APCI1710_EnableTorCounter"                      |
|                     -7: Timeout parameter is wrong (0 to 65535)            |
+----------------------------------------------------------------------------+
*/

static int i_APCI1710_InsnBitsGetTorCounterProgressStatusAndValue(struct comedi_device *dev,
								  struct comedi_subdevice *s,
								  struct comedi_insn *insn,
								  unsigned int *data)
{
	struct addi_private *devpriv = dev->private;
	int i_ReturnValue = 0;
	unsigned int dw_Status;
	unsigned int dw_TimeOut = 0;
	unsigned char b_ModulNbr;
	unsigned char b_TorCounter;
	unsigned char b_ReadType;
	unsigned int ui_TimeOut;
	unsigned char *pb_TorCounterStatus;
	unsigned int *pul_TorCounterValue;

	i_ReturnValue = insn->n;
	b_ModulNbr = CR_AREF(insn->chanspec);
	b_ReadType = (unsigned char) data[0];
	b_TorCounter = (unsigned char) data[1];
	ui_TimeOut = (unsigned int) data[2];
	pb_TorCounterStatus = (unsigned char *) &data[0];
	pul_TorCounterValue = (unsigned int *) &data[1];

	/**************************/
	/* Test the module number */
	/**************************/

	if (b_ReadType == APCI1710_TOR_READINTERRUPT) {

		data[0] = devpriv->s_InterruptParameters.
			s_FIFOInterruptParameters[devpriv->
			s_InterruptParameters.ui_Read].b_OldModuleMask;
		data[1] = devpriv->s_InterruptParameters.
			s_FIFOInterruptParameters[devpriv->
			s_InterruptParameters.ui_Read].ul_OldInterruptMask;
		data[2] = devpriv->s_InterruptParameters.
			s_FIFOInterruptParameters[devpriv->
			s_InterruptParameters.ui_Read].ul_OldCounterLatchValue;

			   /**************************/
		/* Increment the read FIFO */
			   /***************************/

		devpriv->
			s_InterruptParameters.
			ui_Read = (devpriv->
			s_InterruptParameters.
			ui_Read + 1) % APCI1710_SAVE_INTERRUPT;

		return insn->n;
	}

	if (b_ModulNbr < 4) {
	   /***********************/
		/* Test if tor counter */
	   /***********************/

		if ((devpriv->s_BoardInfos.
				dw_MolduleConfiguration[b_ModulNbr] &
				0xFFFF0000UL) == APCI1710_TOR_COUNTER) {
	      /**********************************/
			/* Test the tor counter selection */
	      /**********************************/

			if (b_TorCounter <= 1) {
		 /***********************************/
				/* Test if tor counter initialised */
		 /***********************************/

				dw_Status = inl(devpriv->s_BoardInfos.
					ui_Address + 8 + (16 * b_TorCounter) +
					(64 * b_ModulNbr));

		 /*******************************/
				/* Test if counter initialised */
		 /*******************************/

				if (dw_Status & 0x10) {
		    /***************************/
					/* Test if counter enabled */
		    /***************************/

					if (dw_Status & 0x1) {

						switch (b_ReadType) {

						case APCI1710_TOR_GETPROGRESSSTATUS:
		       /*******************/
							/* Read the status */
		       /*******************/

							dw_Status =
								inl(devpriv->
								s_BoardInfos.
								ui_Address + 4 +
								(16 * b_TorCounter) + (64 * b_ModulNbr));

							dw_Status =
								dw_Status & 0xF;

		       /*****************/
							/* Test if start */
		       /*****************/

							if (dw_Status & 1) {
								if (dw_Status &
									2) {
									if (dw_Status & 4) {
				/************************/
										/* Tor counter overflow */
				/************************/

										*pb_TorCounterStatus
											=
											3;
									} else {
				/***********************/
										/* Tor counter started */
				/***********************/

										*pb_TorCounterStatus
											=
											2;
									}
								} else {
			     /***********************/
									/* Tor counter started */
			     /***********************/

									*pb_TorCounterStatus
										=
										1;
								}
							} else {
			  /***************************/
								/* Tor counter not started */
			  /***************************/

								*pb_TorCounterStatus
									= 0;
							}
							break;

						case APCI1710_TOR_GETCOUNTERVALUE:

		       /*****************************/
							/* Test the timout parameter */
		       /*****************************/

							if ((ui_TimeOut >= 0)
								&& (ui_TimeOut
									<=
									65535UL))
							{
								for (;;) {
			     /*******************/
									/* Read the status */
			     /*******************/

									dw_Status
										=
										inl
										(devpriv->
										s_BoardInfos.
										ui_Address
										+
										4
										+
										(16 * b_TorCounter) + (64 * b_ModulNbr));
			     /********************/
									/* Test if overflow */
			     /********************/

									if ((dw_Status & 4) == 4) {
				/******************/
										/* Overflow occur */
				/******************/

										*pb_TorCounterStatus
											=
											3;

				/******************/
										/* Read the value */
				/******************/

										*pul_TorCounterValue
											=
											inl
											(devpriv->
											s_BoardInfos.
											ui_Address
											+
											0
											+
											(16 * b_TorCounter) + (64 * b_ModulNbr));
										break;
									}	/*  if ((dw_Status & 4) == 4) */
									else {
				/*******************************/
										/* Test if measurement stopped */
				/*******************************/

										if ((dw_Status & 2) == 2) {
				   /***********************/
											/* A stop signal occur */
				   /***********************/

											*pb_TorCounterStatus
												=
												2;

				   /******************/
											/* Read the value */
				   /******************/

											*pul_TorCounterValue
												=
												inl
												(devpriv->
												s_BoardInfos.
												ui_Address
												+
												0
												+
												(16 * b_TorCounter) + (64 * b_ModulNbr));

											break;
										}	/*  if ((dw_Status & 2) == 2) */
										else {
				   /*******************************/
											/* Test if measurement started */
				   /*******************************/

											if ((dw_Status & 1) == 1) {
				      /************************/
												/* A start signal occur */
				      /************************/

												*pb_TorCounterStatus
													=
													1;
											}	/*  if ((dw_Status & 1) == 1) */
											else {
				      /***************************/
												/* Measurement not started */
				      /***************************/

												*pb_TorCounterStatus
													=
													0;
											}	/*  if ((dw_Status & 1) == 1) */
										}	/*  if ((dw_Status & 2) == 2) */
									}	/*  if ((dw_Status & 8) == 8) */

									if (dw_TimeOut == ui_TimeOut) {
				/*****************/
										/* Timeout occur */
				/*****************/

										break;
									} else {
				/*************************/
										/* Increment the timeout */
				/*************************/

										dw_TimeOut
											=
											dw_TimeOut
											+
											1;

										mdelay(1000);
									}
								}	/*  for (;;) */

			  /*************************/
								/* Test if timeout occur */
			  /*************************/

								if ((*pb_TorCounterStatus != 3) && (dw_TimeOut == ui_TimeOut) && (ui_TimeOut != 0)) {
			     /*****************/
									/* Timeout occur */
			     /*****************/

									*pb_TorCounterStatus
										=
										4;
								}
							} else {
			  /******************************/
								/* Timeout parameter is wrong */
			  /******************************/

								DPRINTK("Timeout parameter is wrong\n");
								i_ReturnValue =
									-7;
							}
							break;

						default:
							printk("Inputs wrong\n");
						}	/*  switch end */
					}	/*  if (dw_Status & 0x1) */
					else {
		       /***************************/
						/* Tor counter not enabled */
		       /***************************/

						DPRINTK("Tor counter not enabled\n");
						i_ReturnValue = -6;
					}	/*  if (dw_Status & 0x1) */
				} else {
		    /*******************************/
					/* Tor counter not initialised */
		    /*******************************/

					DPRINTK("Tor counter not initialised\n");
					i_ReturnValue = -5;
				}
			}	/*  if (b_TorCounter <= 1) */
			else {
		 /**********************************/
				/* Tor counter selection is wrong */
		 /**********************************/

				DPRINTK("Tor counter selection is wrong\n");
				i_ReturnValue = -4;
			}	/*  if (b_TorCounter <= 1) */
		} else {
	      /******************************************/
			/* The module is not a tor counter module */
	      /******************************************/

			DPRINTK("The module is not a tor counter module\n");
			i_ReturnValue = -3;
		}
	} else {
	   /***********************/
		/* Module number error */
	   /***********************/

		DPRINTK("Module number error\n");
		i_ReturnValue = -2;
	}

	return i_ReturnValue;
}
