/* <St> *******************************************************************

  cif_dev.h

  -------------------------------------------------------------------------
  CREATETED     : D. Tsaava,  Hilscher GmbH
  DATE          : 18.07.2000
  PROJEKT       : CIF device driver
  =========================================================================

  DISCRIPTION

    Include file for CIF device driver, DPM layout                 .

  =========================================================================

  CHANGES

  version name      date        Discription
                 March 2001
    		    Juli  2004     Redesigned for the 2.6 Kernel
 		                   Copyright changed to GNU Lesser GPL
-------------------------------------------------------------------------

  V2.601

  NOTE: as groundwork for this header served Windows version of 
        the CIF device driver

  ======================== Copyright =====================================

  Copyright (C) 2004  Hilscher GmbH

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library 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
  Lesser General Public License for more details.
   
  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA

  ========================================================================
******************************************************************** <En> */
#ifndef  CIF_DEV_H
# define CIF_DEV_H

#ifndef STRICT             /* Check Typdefinition */
   #define STRICT
#endif

#ifndef	_GNUC_
#    define  _GNUC_
#endif	/* _GNUC_ */

/* ---------------------------------------------------------------------------------- */
/* DEV definitions                                                                    */
/* ---------------------------------------------------------------------------------- */

#define DRV_ACTIV_STATE1      2           /* DEV board is in the registery            */
#define DRV_ACTIV_STATE2      TRUE        /* DEV board is tested and ready            */

#define NUM_OF_DRV_NAMES      3           /* Number of possible driver names          */
#define DEVNAMELEN            3           /* Size of DEV name in DPM                  */

#define HW_INTERRUPT_DISABLE  0x00
#define HW_INTERRUPT_ENABLE   0x01

#define BUS_TYPE_PCI          0x01
#define BUS_TYPE_ISA          0x02

/* ------------------------------------------------------------------------------------ */
/* PCI/CPCI card definitions                                                                 */
/* ------------------------------------------------------------------------------------ */

#define VENDOR_ID        0x10B5        /* PLX technology                            */
#define SUBVENDOR_ID     0x10B5        /* PLX-PCI chip                              */

#define SUBSYSTEM_ID_1   0x1080        /* Hilscher CIF50 boards                     */ 
#define DEVICE_ID_1      0x9050        /* PLX-PCI chip                              */

#define SUBSYSTEM_ID_2   0x2695        /* Hilscher newer CIF50 & CIF80 boards       */ 
#define DEVICE_ID_2      0x9030        /* PLX-PCI chip                              */
/* ------------------------------------------------------------------------------------ */

/* Local Control Register Offsets */
#define PCI_INTCTRLSTS_REG  0x4C

#ifndef CIF_MAJOR
#define CIF_MAJOR 0   /* dynamic major by default */
#endif

#ifndef CIF_MAX_BOARDS
#define CIF_MAX_BOARDS   4  /* Board-0 through Board-3 */
#endif

/* ------------------------------------------------------------------------------------ */
/* DPM structure                                                                        */
/* ------------------------------------------------------------------------------------ */
#ifdef		_GNUC_
#  ifndef	PACKED
#    define	PACKED	__attribute__((packed, aligned(1)))
#  endif	/* PACKED */
#else
#  define	PACKED
#endif

typedef struct tagDPM_MEMORY{
  /* DPM size is flexible, now using pointers      */
  /* for addressing the send and receive area      */
  MSG_STRUC     tDevMbx     PACKED;                /* Mailbox PC  --> DEV                (288 Bytes)*/
  VERSIONINFO   tDevVersion PACKED;                /* DEV version information            ( 32 Bytes)*/
  MSG_STRUC     tPcMbx      PACKED;                /* Mailbox DEV --> PC                 (288 Bytes)*/
  FIRMWAREINFO  tFiwInfo    PACKED;                /* Firmware info                      ( 32 Bytes)*/
  TASKPARAM     tKpt1Param  PACKED;                /* Task 1 interface parameter         ( 64 Bytes)*/
  TASKPARAM     tKpt2Param  PACKED;                /* Task 2 interface parameter         ( 64 Bytes)*/
  TASKSTATE     tKpt1State  PACKED;                /* Task 1 state                       ( 64 Bytes)*/
  TASKSTATE     tKpt2State  PACKED;                /* Task 2 state                       ( 64 Bytes)*/
  TASKINFO      tTaskInfo   PACKED;                /* Task 1 to 7 info field             (112 Bytes)*/
  RCSINFO       tRcsInfo    PACKED;                /* RCS information                    (  8 Bytes)*/
  DEVINFO       tDevInfo    PACKED;                /* DEV information                    (  6 Bytes)*/
  unsigned char HostFlags   PACKED;                /* DPM communication DEV->PC(PcFlags) (  1 Byte )*/
  unsigned char DevFlags    PACKED;                /* DPM communication PC->DEV(CifFlags)(  1 Byte )*/
} DPM_MEMORY;

/* ------------------------------------------------------------------------------------ */
/*   DPM flag definition                                                                */
/* ------------------------------------------------------------------------------------ */

// Host flags (HOST_FLAGS) written by the device
#define HOSTCOM_FLAG            0x01
#define DEVACK_FLAG             0x02
#define PDACK_FLAG              0x04
#define STATECOM_FLAG           0x08
#define SPCACK_FLAG             0x10
#define COM_FLAG                0x20
#define RUN_FLAG                0x40
#define READY_FLAG              0x80

// Device flags (DEV_FLAGS) written by the host 
#define HOSTACK_FLAG            0x01
#define DEVCOM_FLAG             0x02
#define PDCOM_FLAG              0x04
#define STATEACK_FLAG           0x08
#define SPCCOM_FLAG             0x10
#define NOTREADY_FLAG           0x20
#define INIT_FLAG               0x40
#define RESET_FLAG              0x80

/* ------------------------------------------------------------------------------------ */
/*   driver state definitions                                                           */
/* ------------------------------------------------------------------------------------ */

#define INI_MSG_WAIT            0x00
#define INI_MSG_RUN             0x40
#define INI_MSG_RDY             0x80
#define INI_MSG_RDYRUN          0xC0

#define COM_FLAG_RDY            0x20

#define RESET_MSG_NON           0x00
#define RESET_MSG_RUN           0x01

#define EXCHGIO_NON             0x00
#define EXCHGIO_EQUAL           0x01
#define EXCHGIO_NOT_EQUAL       0x02

#ifndef CIF_NR_DEVS
#define CIF_NR_DEVS   4 
#endif

/*
 * Split minors in two parts
 */
#define TYPE(dev)  (MINOR(dev) >> 4)  /* high nibble */
#define NUM(dev)   (MINOR(dev) & 0xf) /* low  nibble */
/* ------------------------------------------------------------------------------------ */
/* DEV instance structure                                                               */
/* ------------------------------------------------------------------------------------ */
typedef struct tagDEV_INSTANCE {
  struct tagDEV_INSTANCE  *next;               /* linked list of Devices, see CIF_MAX_BOARDS = 4 */ 
  unsigned short        usBoard;               // Internal board number 
  void *                pvIntSynch;            // Interrupt synchronization
  unsigned char         ucPCIBusNumber;        // PCI bus number 
  unsigned char         ucBusType;             // PCI, ISA
  unsigned long         ulBoardAddress;        // physical memory address
  unsigned long         ulDPMSize;             // DPM size of the DEV
  unsigned long         ulDPMByteSize;         // DPM size in bytes
  unsigned short        usBoardIrq;            // Interrupt number of the DEV
  unsigned short        usBoardIrq_scanned;    // Interrupt number of the DEV
  unsigned char *       IrqCtrlRegAddr;        // 
  void *                pvVirtualIrq;          // Virtual Interrupt
  unsigned short        usRcsError;            // DEV-Error during startup
  short                 sDrvInitError;         // DRV-Error during startup
  unsigned char         bActive;               // Board is active
  unsigned char *       pDpmBase;              // Virtual DPM start address
  DPM_MEMORY *          ptDpmAddress;          // Virtual DPM address last kbyte
  unsigned char *       pbDpmSendArea;         // Virtual DPM IO address send area
  unsigned char *       pbDpmReceiveArea;      // Virtual DPM IO address receive area
  unsigned char *       pbHostFlags;           // Pointer to HostFlags (PcFlags)
  unsigned char *       pbDevFlags;            // Pointer to DevFlags  (CifFlags)
  unsigned short        usOpenCounter;         // Number of Applikations
  spinlock_t            mutex;                 // SMP synchronization 
  wait_queue_head_t     pInitSemaphore;
  wait_queue_head_t     pReadSemaphore;
  wait_queue_head_t     pWriteSemaphore;
  wait_queue_head_t     pExIOSemaphore;
  unsigned char         bInitState;            // Driver init state
  unsigned char         bReadState;            // Driver read state
  unsigned char         bWriteState;           // Driver write state
  unsigned char         bExIOEqState;          // Driver exchange IO EQUAL state
  unsigned char         bExIONeqState;         // Driver exchange IO NOT EQUAL state
  unsigned char         bCOMEqState;           // Driver COM state wait on EQUAL
  unsigned char         bCOMNeqState;          // Driver COM state wait on NOT EQUAL
  unsigned char         bInitMsgFlag;          // Init  message activ flag
  unsigned char         bReadMsgFlag;          // Read  message available flag
  unsigned char         bWriteMsgFlag;         // Write message done flag
  unsigned char         bStateFlag;            // State flag
  unsigned char         bExIOFlag;             // Exchange IO flag
  unsigned char         bHostFlags;
  unsigned char         bMyDevFlags;
  unsigned short        usSpecialRcsError;     // DEV-Error during startup
  DRIVERINFO            tStateInfo;
  /* Structure extention for PCMCIA kernel 2.6.18 */
  struct pcmcia_device	*p_dev;
  dev_node_t			node;	
} DEV_INSTANCE;

#endif /* CIF_DEV_H */
