/* $Id: xdi_adapter.h,v 1.7 2004/03/21 17:26:01 armin Exp $ */

#ifndef __DIVA_OS_XDI_ADAPTER_H__
#define __DIVA_OS_XDI_ADAPTER_H__

#define DIVAS_XDI_ADAPTER_BUS_PCI  0
#define DIVAS_XDI_ADAPTER_BUS_ISA  1

typedef struct _divas_pci_card_resources {
	byte bus;
	byte func;
	void *hdev;

	dword bar[8];		/* contains context of appropriate BAR Register */
	void __iomem *addr[8];		/* same bar, but mapped into memory */
	dword length[8];	/* bar length */
	int mem_type_id[MAX_MEM_TYPE];
	unsigned int qoffset;
	byte irq;
} divas_pci_card_resources_t;

typedef union _divas_card_resources {
	divas_pci_card_resources_t pci;
} divas_card_resources_t;

struct _diva_os_xdi_adapter;
typedef int (*diva_init_card_proc_t)(struct _diva_os_xdi_adapter *a);
typedef int (*diva_cmd_card_proc_t)(struct _diva_os_xdi_adapter *a,
				    diva_xdi_um_cfg_cmd_t *data,
				    int length);
typedef void (*diva_xdi_clear_interrupts_proc_t)(struct
						 _diva_os_xdi_adapter *);

#define DIVA_XDI_MBOX_BUSY			1
#define DIVA_XDI_MBOX_WAIT_XLOG	2

typedef struct _xdi_mbox_t {
	dword status;
	diva_xdi_um_cfg_cmd_data_t cmd_data;
	dword data_length;
	void *data;
} xdi_mbox_t;

typedef struct _diva_os_idi_adapter_interface {
	diva_init_card_proc_t cleanup_adapter_proc;
	diva_cmd_card_proc_t cmd_proc;
} diva_os_idi_adapter_interface_t;

typedef struct _diva_os_xdi_adapter {
	struct list_head link;
	int CardIndex;
	int CardOrdinal;
	int controller;		/* number of this controller */
	int Bus;		/* PCI, ISA, ... */
	divas_card_resources_t resources;
	char port_name[24];
	ISDN_ADAPTER xdi_adapter;
	xdi_mbox_t xdi_mbox;
	diva_os_idi_adapter_interface_t interface;
	struct _diva_os_xdi_adapter *slave_adapters[3];
	void *slave_list;
	void *proc_adapter_dir;	/* adapterX proc entry */
	void *proc_info;	/* info proc entry     */
	void *proc_grp_opt;	/* group_optimization  */
	void *proc_d_l1_down;	/* dynamic_l1_down     */
	volatile diva_xdi_clear_interrupts_proc_t clear_interrupts_proc;
	dword dsp_mask;
} diva_os_xdi_adapter_t;

#endif
