
/*
 *
  Copyright (c) Eicon Networks, 2002.
 *
  This source file is supplied for the use with
  Eicon Networks range of DIVA Server Adapters.
 *
  Eicon File Revision :    2.1
 *
  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, or (at your option)
  any later version.
 *
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
  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., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */
/*
 *  some macros for detailed trace management
 */
#include "di_dbg.h"
/*****************************************************************************/
#define XMOREC 0x1f
#define XMOREF 0x20
#define XBUSY  0x40
#define RMORE  0x80
#define DIVA_MISC_FLAGS_REMOVE_PENDING    0x01
#define DIVA_MISC_FLAGS_NO_RC_CANCELLING  0x02
#define DIVA_MISC_FLAGS_RX_DMA            0x04
        /* structure for all information we have to keep on a per   */
        /* adapater basis                                           */
typedef struct adapter_s ADAPTER;
struct adapter_s {
  void * io;
  byte IdTable[256];
  byte IdTypeTable[256];
  byte FlowControlIdTable[256];
  byte FlowControlSkipTable[256];
  byte ReadyInt;
  byte RcExtensionSupported;
  byte misc_flags_table[256];
  dword protocol_capabilities;
  byte ( * ram_in)(ADAPTER * a, void * adr);
  word ( * ram_inw)(ADAPTER * a, void * adr);
  void (* ram_in_buffer)(ADAPTER * a, void * adr, void  * P, word length);
  void (* ram_look_ahead)(ADAPTER * a, PBUFFER * RBuffer, ENTITY  * e);
  void ( * ram_out)(ADAPTER * a, void * adr, byte data);
  void ( * ram_outw)(ADAPTER * a, void * adr, word data);
  void (* ram_out_buffer)(ADAPTER * a, void * adr, void  * P, word length);
  void ( * ram_inc)(ADAPTER * a, void * adr);
#if defined(DIVA_ISTREAM)
  dword rx_stream[256];
  dword tx_stream[256];
  word tx_pos[256];
  word rx_pos[256];
  byte stream_buffer[2512];
  dword ( * ram_offset)(ADAPTER * a);
  void ( * ram_out_dw) (ADAPTER *a,
                                    void *addr,
                                    const dword* data,
                                    int dwords);
  void ( * ram_in_dw) (ADAPTER *a,
                                   void *addr,
                                   dword* data,
                                   int dwords);
  void ( * istream_wakeup)(ADAPTER* a);
#else
  byte stream_buffer[4];
#endif
};
/*------------------------------------------------------------------*/
/* public functions of IDI common code                              */
/*------------------------------------------------------------------*/
void pr_out(ADAPTER * a);
byte pr_dpc(ADAPTER * a);
byte scom_test_int(ADAPTER * a);
void scom_clear_int(ADAPTER * a);
/*------------------------------------------------------------------*/
/* OS specific functions used by IDI common code                    */
/*------------------------------------------------------------------*/
void free_entity(ADAPTER * a, byte e_no);
void assign_queue(ADAPTER * a, byte e_no, word ref);
byte get_assign(ADAPTER * a, word ref);
void req_queue(ADAPTER * a, byte e_no);
byte look_req(ADAPTER * a);
void next_req(ADAPTER * a);
ENTITY  * entity_ptr(ADAPTER * a, byte e_no);
#if defined(DIVA_ISTREAM)
struct _diva_xdi_stream_interface;
void diva_xdi_provide_istream_info (ADAPTER* a,
                                    struct _diva_xdi_stream_interface* pI);
void pr_stream (ADAPTER * a);
int diva_istream_write (void* context,
                        int Id,
                        void* data,
                        int length,
                        int final,
                        byte usr1,
                        byte usr2);
int diva_istream_read (void* context,
                        int Id,
                        void* data,
                        int max_length,
                        int* final,
                        byte* usr1,
                        byte* usr2);
#if defined(DIVA_IDI_RX_DMA)
#include "diva_dma.h"
#endif
#endif
