diff -ruN linux-2.2.5-ante/drivers/isdn/Config.in linux-2.2.5-post/drivers/isdn/Config.in
--- linux-2.2.5-ante/drivers/isdn/Config.in	Tue Mar 16 01:11:29 1999
+++ linux-2.2.5-post/drivers/isdn/Config.in	Thu Apr 15 23:24:39 1999
@@ -26,6 +26,7 @@
     bool 'HiSax Support for Teles 16.0/8.0' CONFIG_HISAX_16_0
     bool 'HiSax Support for Teles 16.3 or PNP or PCMCIA' CONFIG_HISAX_16_3
     bool 'HiSax Support for Teles 16.3c' CONFIG_HISAX_TELES3C 
+    bool 'HiSax Support for Gazel cards' CONFIG_HISAX_GAZEL
     bool 'HiSax Support for AVM A1 (Fritz)' CONFIG_HISAX_AVM_A1
     bool 'HiSax Support for Elsa cards' CONFIG_HISAX_ELSA
     bool 'HiSax Support for ITK ix1-micro Revision 2' CONFIG_HISAX_IX1MICROR2
diff -ruN linux-2.2.5-ante/drivers/isdn/hisax/Makefile linux-2.2.5-post/drivers/isdn/hisax/Makefile
--- linux-2.2.5-ante/drivers/isdn/hisax/Makefile	Tue Mar 16 01:11:29 1999
+++ linux-2.2.5-post/drivers/isdn/hisax/Makefile	Thu Apr 15 22:51:50 1999
@@ -43,6 +43,12 @@
 	 HSCX_OBJ := hscx.o
 endif
 
+ifeq ($(CONFIG_HISAX_GAZEL),y)
+         O_OBJS += gazel.o
+         ISAC_OBJ := isac.o
+         HSCX_OBJ := hscx.o
+endif
+
 ifeq ($(CONFIG_HISAX_AVM_A1),y)
 	 O_OBJS += avm_a1.o
 	 ISAC_OBJ := isac.o
diff -ruN linux-2.2.5-ante/drivers/isdn/hisax/config.c linux-2.2.5-post/drivers/isdn/hisax/config.c
--- linux-2.2.5-ante/drivers/isdn/hisax/config.c	Tue Mar 16 01:11:30 1999
+++ linux-2.2.5-post/drivers/isdn/hisax/config.c	Thu Apr 15 23:01:04 1999
@@ -114,6 +114,12 @@
 #define DEFAULT_CARD ISDN_CTYPE_16_3
 #define DEFAULT_CFG {15,0x180,0,0}
 #endif
+#ifdef CONFIG_HISAX_GAZEL
+#undef DEFAULT_CARD
+#undef DEFAULT_CFG
+#define DEFAULT_CARD ISDN_CTYPE_GAZEL_R647
+#define DEFAULT_CFG {15,0x180,0,0}
+#endif
 #ifdef CONFIG_HISAX_16_0
 #undef DEFAULT_CARD
 #undef DEFAULT_CFG
@@ -487,6 +493,7 @@
 			case ISDN_CTYPE_SPORTSTER:
 			case ISDN_CTYPE_MIC:
 			case ISDN_CTYPE_TELES3C:
+			case ISDN_CTYPE_GAZEL_R647:
 				cards[i].para[0] = irq[i];
 				cards[i].para[1] = io[i];
 				break;
diff -ruN linux-2.2.5-ante/drivers/isdn/hisax/gazel.c linux-2.2.5-post/drivers/isdn/hisax/gazel.c
--- linux-2.2.5-ante/drivers/isdn/hisax/gazel.c	Thu Jan  1 01:00:00 1970
+++ linux-2.2.5-post/drivers/isdn/hisax/gazel.c	Thu Apr 15 23:40:54 1999
@@ -0,0 +1,786 @@
+/* $Id: gazel.c,v 1.11.2.9 1998/04/08 21:58:52 keil Exp $
+
+ * gazel.c     low level stuff for Gazel isdn cards
+ *
+ *              based on the teles driver from Jan den Ouden
+ *
+ * Author       BeWan Systems
+ *              based on source code from Karsten Keil
+ *
+ * $Log: gazel.c,v $
+ * Revision 0.05  1999/26/03
+ * Add support for ISA R742 and PCI R753
+ *
+ * Revision 0.04  1999/02/02
+ * Support both ISA R647/648 and PCI R685
+ *
+ * Revision 0.02  1998/11/30
+ *
+ * Revision 0.01  1998/11/10
+ * Initial revision
+ *
+ */
+#define __NO_VERSION__
+#include "hisax.h"
+#include "isac.h"
+#include "hscx.h"
+#include "isdnl1.h"
+#include "ipac.h"
+#include <linux/pci.h>
+#include <linux/bios32.h>
+
+extern const char *CardType[];
+const char *gazel_revision = "$Revision: 0.5 $";
+
+#define R647      1
+#define R685      2
+#define R753      3
+#define R742      4
+
+/* Gazel R685 stuff */
+#define GAZEL_MANUFACTURER     0x10b5
+#define GAZEL_R685             0x1030
+#define GAZEL_R753             0x1152
+#define GAZEL_DJINN_ITOO       0x1151
+
+#define PLX_CNTRL    0x50 /* registre de controle PLX */
+#define RESET_GAZEL  0x4
+#define RESET_9050   0x40000000
+#define PLX_INCSR    0x4C /* registre d'IT du 9050 */
+#define INT_ISAC_EN  0x8 /* 1 = enable IT isac */
+#define INT_ISAC     0x20 /* 1 = IT isac en cours */
+#define INT_HSCX_EN  0x1 /* 1 = enable IT hscx */
+#define INT_HSCX     0x4 /* 1 = IT hscx en cours */
+#define INT_PCI_EN   0x40 /* 1 = enable IT PCI */ 
+#define INT_IPAC_EN  0x3 /* enable IT ipac */
+
+
+#define byteout(addr,val) outb(val,addr)
+#define bytein(addr) inb(addr)
+
+static inline u_char
+readreg(unsigned int adr, u_short off)
+{
+  return bytein(adr + off);
+}
+
+static inline void
+writereg(unsigned int adr, u_short off, u_char data)
+{
+  byteout(adr + off, data);
+}
+
+
+static inline void
+read_fifo(unsigned int adr, u_char * data, int size)
+{
+  insb(adr, data, size);
+}
+
+static void
+write_fifo(unsigned int adr, u_char * data, int size)
+{
+  outsb(adr, data, size);
+}
+
+static inline u_char
+readreg_ipac(unsigned int adr, u_short off)
+{
+  register u_char ret;
+  long flags;
+
+  save_flags(flags);
+  cli();
+  byteout(adr, off);
+  ret = bytein(adr + 4);
+  restore_flags(flags);
+  return ret;
+}
+
+static inline void
+writereg_ipac(unsigned int adr, u_short off, u_char data)
+{
+  long flags;
+
+  save_flags(flags);
+  cli();
+  byteout(adr, off);
+  byteout(adr + 4, data);
+  restore_flags(flags);
+}
+
+
+static inline void
+read_fifo_ipac(unsigned int adr, u_short off, u_char * data, int size)
+{
+  byteout(adr, off);
+  insb(adr + 4, data, size);
+}
+
+static void
+write_fifo_ipac(unsigned int adr, u_short off, u_char * data, int size)
+{
+  byteout(adr, off);
+  outsb(adr + 4, data, size);
+}
+
+/* Interface functions */
+
+static u_char
+ReadISAC(struct IsdnCardState *cs, u_char offset)
+{
+  u_short off2 = offset;
+  
+  switch (cs->subtyp) {
+  case R647: 
+    off2 = ((off2 << 8 & 0xf000) | (off2 & 0xf));
+  case R685:
+    return (readreg(cs->hw.gazel.isac, off2));
+  case R753:
+  case R742:
+    return (readreg_ipac(cs->hw.gazel.ipac, 0x80 + off2));
+  }
+  return 0;
+}
+
+static void
+WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
+{
+  u_short off2 = offset;
+  
+  switch (cs->subtyp) {
+  case R647: 
+    off2 = ((off2 << 8 & 0xf000) | (off2 & 0xf));
+  case R685:
+    writereg(cs->hw.gazel.isac, off2, value);
+    break; 
+  case R753:
+  case R742:
+    writereg_ipac(cs->hw.gazel.ipac, 0x80 + off2, value);
+    break;
+  }
+}
+
+static void
+ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+{
+  switch (cs->subtyp) {
+  case R647: 
+  case R685:
+    read_fifo(cs->hw.gazel.isacfifo, data, size);
+    break; 
+  case R753:
+  case R742:
+    read_fifo_ipac(cs->hw.gazel.ipac, 0x80, data, size);
+    break;
+   }
+}
+
+static void
+WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
+{
+  switch (cs->subtyp) {
+  case R647: 
+  case R685:
+    write_fifo(cs->hw.gazel.isacfifo, data, size);
+    break; 
+  case R753:
+  case R742:
+    write_fifo_ipac(cs->hw.gazel.ipac, 0x80, data, size);
+    break;
+   }	
+}
+
+static void
+ReadHSCXfifo(struct IsdnCardState *cs, int hscx, u_char * data, int size)
+{
+ switch (cs->subtyp) {
+  case R647: 
+  case R685:
+    read_fifo(cs->hw.gazel.hscxfifo[hscx], data, size);
+    break; 
+  case R753:
+  case R742:
+    read_fifo_ipac(cs->hw.gazel.ipac, hscx * 0x40, data, size);
+    break;
+   }
+}
+
+static void
+WriteHSCXfifo(struct IsdnCardState *cs, int hscx, u_char * data, int size)
+{
+  switch (cs->subtyp) {
+  case R647: 
+  case R685:
+    write_fifo(cs->hw.gazel.hscxfifo[hscx], data, size);
+    break; 
+  case R753:
+  case R742:
+    write_fifo_ipac(cs->hw.gazel.ipac, hscx * 0x40, data, size);
+    break;
+   }	
+}
+
+static u_char
+ReadHSCX(struct IsdnCardState *cs, int hscx, u_char offset)
+{
+  u_short off2 = offset;
+  
+  switch (cs->subtyp) {
+  case R647: 
+    off2 = ((off2 << 8 & 0xf000) | (off2 & 0xf));
+  case R685:
+    return (readreg(cs->hw.gazel.hscx[hscx], off2));
+  case R753:
+  case R742:
+    return (readreg_ipac(cs->hw.gazel.ipac, hscx * 0x40 + off2));
+  }
+  return 0;
+}
+
+static void
+WriteHSCX(struct IsdnCardState *cs, int hscx, u_char offset, u_char value)
+{
+  u_short off2 = offset;
+  
+  switch (cs->subtyp) {
+  case R647: 
+    off2 = ((off2 << 8 & 0xf000) | (off2 & 0xf));
+  case R685:
+    writereg(cs->hw.gazel.hscx[hscx], off2, value);
+    break; 
+  case R753:
+  case R742:
+    writereg_ipac(cs->hw.gazel.ipac, hscx * 0x40 + off2, value);
+    break;
+   }
+}
+
+/*
+ * fast interrupt HSCX stuff goes here
+ */
+
+#define READHSCX(cs, nr, reg) ReadHSCX(cs, nr, reg)
+#define WRITEHSCX(cs, nr, reg, data) WriteHSCX(cs, nr, reg, data)
+#define READHSCXFIFO(cs, nr, ptr, cnt) ReadHSCXfifo(cs, nr, ptr, cnt)
+#define WRITEHSCXFIFO(cs, nr, ptr, cnt) WriteHSCXfifo(cs, nr, ptr, cnt)
+
+#include "hscx_irq.c"
+
+static void
+gazel_interrupt(int intno, void *dev_id, struct pt_regs *regs)
+{
+#define MAXCOUNT 20
+	struct IsdnCardState *cs = dev_id;
+	u_char valisac, valhscx, stat = 0;
+	int count = 0;
+
+	if (!cs) {
+		printk(KERN_WARNING "Gazel: Spurious interrupt!\n");
+		return;
+	}
+
+	do {
+
+	  valhscx = ReadHSCX(cs, 1, HSCX_ISTA);
+	  if (valhscx) {
+	    hscx_int_main(cs, valhscx);
+	    stat |= 1;
+	  }
+
+	  valisac = ReadISAC(cs, ISAC_ISTA);
+	  if (valisac) {
+	    isac_interrupt(cs, valisac);
+	    stat |= 2;
+	  }
+	  count++;
+	 }
+	while ((valhscx || valisac) && (count < MAXCOUNT));
+
+	if (stat & 1) {
+		WriteHSCX(cs, 0, HSCX_MASK, 0xFF);
+		WriteHSCX(cs, 1, HSCX_MASK, 0xFF);
+		WriteHSCX(cs, 0, HSCX_MASK, 0x0);
+		WriteHSCX(cs, 1, HSCX_MASK, 0x0);
+	}
+	if (stat & 2) {
+		WriteISAC(cs, ISAC_MASK, 0xFF);
+		WriteISAC(cs, ISAC_MASK, 0x0);
+	}
+}
+
+
+static void
+gazel_interrupt_ipac(int intno, void *dev_id, struct pt_regs *regs)
+{
+	struct IsdnCardState *cs = dev_id;
+	u_char ista,val;
+	int count = 0;
+
+	if (!cs) {
+		printk(KERN_WARNING "Diva: Spurious interrupt!\n");
+		return;
+	}
+
+	ista = ReadISAC(cs, IPAC_ISTA - 0x80);
+	do {
+	  if (ista & 0x0f) {
+	    val = ReadHSCX(cs, 1,  HSCX_ISTA);
+	    if (ista & 0x01)
+	      val |= 0x01;
+	    if (ista & 0x04)
+	      val |= 0x02;
+	    if (ista & 0x08)
+	      val |= 0x04;
+	    if (val) { 
+	      hscx_int_main(cs, val);
+	    }
+	  }
+	  if (ista & 0x20) {
+	    val = 0xfe & ReadISAC(cs, ISAC_ISTA);
+	    if (val) {
+	      isac_interrupt(cs, val);
+	    }
+	  }
+	  if (ista & 0x10) {
+	    val = 0x01;
+	    isac_interrupt(cs, val);
+	  }
+
+	  ista  = ReadISAC(cs, IPAC_ISTA - 0x80);
+	  count++;
+	}
+	while ((ista & 0x3f) && (count < MAXCOUNT));
+	
+      	WriteISAC(cs, IPAC_MASK - 0x80, 0xFF);
+	WriteISAC(cs, IPAC_MASK - 0x80, 0xC0);
+}
+
+
+inline static void
+release_ioregs(struct IsdnCardState *cs, int mask)
+{
+  switch (cs->subtyp) {
+  case R647:
+  case R685:
+    if (mask & 1)
+      release_region(cs->hw.gazel.isac, 0x20);
+    if (mask & 2)
+      release_region(cs->hw.gazel.hscx[0], 0x20);
+    if (mask & 4)
+      release_region(cs->hw.gazel.hscx[1], 0x20);
+    break;
+  case R742:
+  case R753:
+    if (mask & 1)
+      release_region(cs->hw.gazel.ipac, 0xE0);
+    break;
+  }
+}
+
+void
+release_io_gazel(struct IsdnCardState *cs)
+{
+  switch (cs->subtyp) {
+  case R647:
+  case R685:
+  case R753:
+    if (cs->hw.gazel.cfg_reg)
+      release_region(cs->hw.gazel.cfg_reg, 8);
+    break;
+  case R742:
+    break;
+  }
+  release_ioregs(cs, 0x7);
+	
+}
+
+static int
+reset_gazel(struct IsdnCardState *cs)
+{
+  long flags;
+  unsigned long plxcntrl, addr = cs->hw.gazel.cfg_reg;
+  
+  switch (cs->subtyp) {
+  case R647:
+    save_flags(flags);
+    cli();
+    writereg(addr, 0, 0);
+    HZDELAY(10);
+    writereg(addr, 0, 1);
+    HZDELAY(2);
+    restore_flags(flags);
+    break;
+  case R685:
+    plxcntrl = inl(addr + PLX_CNTRL);
+    plxcntrl |= (RESET_9050 + RESET_GAZEL);
+    outl(plxcntrl, addr + PLX_CNTRL);
+    plxcntrl &= ~(RESET_9050 + RESET_GAZEL);
+    HZDELAY(4);
+    outl(plxcntrl, addr + PLX_CNTRL);
+    HZDELAY(10);
+    outb(INT_ISAC_EN + INT_HSCX_EN + INT_PCI_EN, addr + PLX_INCSR);
+    break; 
+  case R753:
+    plxcntrl = inl(addr + PLX_CNTRL);
+    plxcntrl |= (RESET_9050 + RESET_GAZEL);
+    outl(plxcntrl, addr + PLX_CNTRL);
+    plxcntrl &= ~(RESET_9050 + RESET_GAZEL);
+    WriteISAC(cs, IPAC_POTA2 - 0x80, 0x20);
+    HZDELAY(4);
+    outl(plxcntrl, addr + PLX_CNTRL);
+    HZDELAY(10);
+    WriteISAC(cs, IPAC_POTA2 - 0x80, 0x00);
+    WriteISAC(cs, IPAC_ACFG - 0x80, 0xff);
+    WriteISAC(cs, IPAC_AOE - 0x80, 0x0);
+    WriteISAC(cs, IPAC_MASK - 0x80, 0xff);
+    WriteISAC(cs, IPAC_CONF - 0x80, 0x1);
+    outb(INT_IPAC_EN + INT_PCI_EN, addr + PLX_INCSR);
+    WriteISAC(cs, IPAC_MASK - 0x80, 0xc0);
+    break; 
+  case R742:
+    WriteISAC(cs, IPAC_POTA2 - 0x80, 0x20);
+    HZDELAY(4);
+    WriteISAC(cs, IPAC_POTA2 - 0x80, 0x00);
+    WriteISAC(cs, IPAC_ACFG - 0x80, 0xff);
+    WriteISAC(cs, IPAC_AOE - 0x80, 0x0);
+    WriteISAC(cs, IPAC_MASK - 0x80, 0xff);
+    WriteISAC(cs, IPAC_CONF - 0x80, 0x1);
+    WriteISAC(cs, IPAC_MASK - 0x80, 0xc0);
+    break; 
+  }
+  return(0);
+}
+
+static int
+Gazel_card_msg(struct IsdnCardState *cs, int mt, void *arg)
+{
+  switch (mt) {
+  case CARD_RESET:
+    reset_gazel(cs);
+    return(0);
+  case CARD_RELEASE:
+    release_io_gazel(cs);
+    return(0);
+  case CARD_SETIRQ:
+    switch (cs->subtyp) {
+    case R647:
+    case R685:
+      return request_irq(cs->irq, &gazel_interrupt,
+			 I4L_IRQ_FLAG, "HiSax", cs) ;
+    case R753:
+    case R742:
+      return request_irq(cs->irq, &gazel_interrupt_ipac, 
+			 I4L_IRQ_FLAG, "HiSax", cs);
+    }
+    return(0);
+  case CARD_INIT:
+    initisac(cs);
+    inithscx(cs);
+    return(0);
+  case CARD_TEST:
+    return(0);
+  }
+  return(0);
+}
+
+static int 
+reserve_regions(struct IsdnCard *card, struct IsdnCardState *cs) 
+{
+
+  switch (cs->subtyp) {
+  case R647:
+  case R685:
+
+    if (check_region((cs->hw.gazel.cfg_reg), 8)) {
+      printk(KERN_WARNING "Gazel: %s config port %x-%x already in use\n",
+	     CardType[card->typ], cs->hw.gazel.cfg_reg,  cs->hw.gazel.cfg_reg + 8);
+      return (1);
+    } else
+      request_region(cs->hw.gazel.cfg_reg, 8, "gazel cfg");
+    
+    if (check_region((cs->hw.gazel.isac), 0x20)) {
+      printk(KERN_WARNING "Gazel: %s isac ports 0x%x-0x%x already in use\n",
+	     CardType[cs->typ], cs->hw.gazel.isac, cs->hw.gazel.isac + 0x20);
+      if (cs->hw.gazel.cfg_reg)
+	release_region(cs->hw.gazel.cfg_reg, 8);
+      return (1);
+    } else
+      request_region(cs->hw.gazel.isac, 0x20, "HiSax isac");
+		
+    if (check_region((cs->hw.gazel.hscx[0]), 0x20)) {
+      printk(KERN_WARNING "Gazel: %s hscx A ports 0x%x-0x%x already in use\n",
+	     CardType[cs->typ], cs->hw.gazel.hscx[0], cs->hw.gazel.hscx[0] + 0x20);
+      if (cs->hw.gazel.cfg_reg)
+	release_region(cs->hw.gazel.cfg_reg, 8);
+      release_ioregs(cs, 1);
+      return (1);
+    } else
+      request_region(cs->hw.gazel.hscx[0], 0x20, "HiSax hscx A");
+		
+    if (check_region((cs->hw.gazel.hscx[1]), 0x20)) {
+      printk(KERN_WARNING "Gazel: %s hscx B ports 0x%x-0x%x already in use\n",
+	     CardType[cs->typ], cs->hw.gazel.hscx[1], cs->hw.gazel.hscx[1] + 0x20);
+      if (cs->hw.gazel.cfg_reg)
+	release_region(cs->hw.gazel.cfg_reg, 8);
+      release_ioregs(cs, 3);
+      return (1);
+    } else
+      request_region(cs->hw.gazel.hscx[1], 0x20, "HiSax hscx B");
+
+    break;
+
+  case R753:
+    if (check_region((cs->hw.gazel.cfg_reg), 8)) {
+      printk(KERN_WARNING "Gazel: %s config port %x-%x already in use\n",
+	     CardType[card->typ], cs->hw.gazel.cfg_reg,  cs->hw.gazel.cfg_reg + 8);
+      return (1);
+    } else
+      request_region(cs->hw.gazel.cfg_reg, 8, "gazel cfg");
+    // no break
+
+  case R742:
+    
+    if (check_region((cs->hw.gazel.ipac), 0xE0)) {
+      printk(KERN_WARNING "Gazel: %s ipac ports %x-%x already in use\n",
+	     CardType[cs->typ], cs->hw.gazel.ipac, cs->hw.gazel.ipac + 0xE0);
+      if ((cs->subtyp == R753) && cs->hw.gazel.cfg_reg)
+	release_region(cs->hw.gazel.cfg_reg, 8);
+      return (1);
+    } else
+      request_region(cs->hw.gazel.ipac, 0xE0, "HiSax ipac");
+
+    break;
+  }
+  return (0);
+}
+
+static int
+setup_gazelisa(struct IsdnCard *card, struct IsdnCardState *cs)
+{
+ 
+  printk(KERN_INFO "Gazel: ISA PnP card automatic recognition\n");
+  // we got an irq parameter, assume it is an ISA card
+  // R742 decodes address even in not started...
+  // R647 returns FF if not present or not started
+  // eventually needs improvment
+  if (readreg_ipac(card->para[1], IPAC_ID) == 1)
+    cs->subtyp = R742;
+  else
+    cs->subtyp = R647;
+
+  cs->hw.gazel.cfg_reg = card->para[1] + 0xC000;
+  cs->hw.gazel.ipac = card->para[1];
+  cs->hw.gazel.isac = card->para[1] + 0x8000;
+  cs->hw.gazel.hscx[0] = card->para[1];
+  cs->hw.gazel.hscx[1] = card->para[1] + 0x4000;
+  cs->irq = card->para[0];
+  cs->hw.gazel.isacfifo = cs->hw.gazel.isac;
+  cs->hw.gazel.hscxfifo[0] = cs->hw.gazel.hscx[0];
+  cs->hw.gazel.hscxfifo[1] = cs->hw.gazel.hscx[1];
+  
+  switch (cs->subtyp) {
+  case R647:
+    printk(KERN_INFO "Gazel: Card ISA R647/R648 found\n");
+    cs->iom2_adf2 = 0x87;
+    cs->hscx0_tsaxr = 0x1f;
+    cs->hscx1_tsaxr = 0x23;
+    
+    printk(KERN_INFO
+	   "Gazel: config irq:%d isac:0x%X  cfg:0x%X\n",
+	   cs->irq, cs->hw.gazel.isac, cs->hw.gazel.cfg_reg);
+    printk(KERN_INFO
+	   "Gazel: hscx A:0x%X  hscx B:0x%X\n",
+	   cs->hw.gazel.hscx[0], cs->hw.gazel.hscx[1]);
+    
+    break;
+
+  case R742:
+    printk(KERN_INFO "Gazel: Card ISA R742 found\n");
+    test_and_set_bit(HW_IPAC, &cs->HW_Flags);
+    printk(KERN_INFO
+	   "Gazel: config irq:%d ipac:0x%X\n",
+	   cs->irq, cs->hw.gazel.ipac);
+    break;
+  }
+  
+  return (0);
+}
+
+static int
+setup_gazelpci(struct IsdnCardState *cs)
+{
+  u_int   pci_ioaddr0, pci_ioaddr1;
+  u_char  pci_bus, pci_device_fn, pci_irq, found;
+  u_int   pci_index, nbseek, seekcard;
+
+  printk(KERN_WARNING "Gazel: PCI card automatic recognition\n");
+
+  found = 0;
+  pci_index = 0;
+  seekcard = GAZEL_R685;
+  for (nbseek = 0; nbseek < 3; nbseek++) {
+    for (; pci_index < 0xff; pci_index++) {
+      if (pcibios_find_device (GAZEL_MANUFACTURER, seekcard,
+			       pci_index, &pci_bus, &pci_device_fn)
+	  == PCIBIOS_SUCCESSFUL) {
+	found = 1;
+      } else {
+	break;
+      }
+      pcibios_read_config_dword(pci_bus, pci_device_fn,
+				PCI_BASE_ADDRESS_1, &pci_ioaddr0);
+      pcibios_read_config_dword(pci_bus, pci_device_fn,
+				PCI_BASE_ADDRESS_2, &pci_ioaddr1);
+      pcibios_read_config_byte(pci_bus, pci_device_fn,
+			       PCI_INTERRUPT_LINE, &pci_irq);
+      
+      break;
+    }
+    if (found)
+      break;
+    else {
+      switch(seekcard) {
+      case GAZEL_R685:
+	seekcard = GAZEL_R753;
+	break;
+      case GAZEL_R753:
+	seekcard = GAZEL_DJINN_ITOO;
+	break;
+      }
+    }
+  }
+  if (!found) {
+    printk(KERN_WARNING "Gazel: No PCI card found\n");
+    return(1);
+  }
+
+  pci_ioaddr1 &= 0xfffe;
+  cs->hw.gazel.cfg_reg = pci_ioaddr0 & 0xfffe;
+  cs->hw.gazel.ipac = pci_ioaddr1;
+  cs->hw.gazel.isac = pci_ioaddr1 + 0x80;
+  cs->hw.gazel.hscx[0] = pci_ioaddr1;
+  cs->hw.gazel.hscx[1] = pci_ioaddr1 + 0x40;
+  cs->hw.gazel.isacfifo = cs->hw.gazel.isac;
+  cs->hw.gazel.hscxfifo[0] = cs->hw.gazel.hscx[0];
+  cs->hw.gazel.hscxfifo[1] = cs->hw.gazel.hscx[1];
+  cs->irq = pci_irq;
+
+  switch (seekcard) {
+  case GAZEL_R685:
+    printk(KERN_INFO "Gazel: Card PCI R685 found\n");
+    cs->subtyp = R685;
+    cs->iom2_adf2 = 0x87;
+    cs->hscx0_tsaxr = 0x1f;
+    cs->hscx1_tsaxr = 0x23;
+    printk(KERN_INFO
+	   "Gazel: config irq:%d isac:0x%X  cfg:0x%X\n",
+	   cs->irq, cs->hw.gazel.isac, cs->hw.gazel.cfg_reg);
+    printk(KERN_INFO
+	   "Gazel: hscx A:0x%X  hscx B:0x%X\n",
+	   cs->hw.gazel.hscx[0], cs->hw.gazel.hscx[1]);
+    break;
+  case GAZEL_R753: 
+  case GAZEL_DJINN_ITOO:
+    printk(KERN_INFO "Gazel: Card PCI R753 found\n");
+    cs->subtyp = R753;
+    test_and_set_bit(HW_IPAC, &cs->HW_Flags);
+    printk(KERN_INFO
+	   "Gazel: config irq:%d ipac:0x%X  cfg:0x%X\n",
+	    cs->irq, cs->hw.gazel.ipac, cs->hw.gazel.cfg_reg);
+    break;
+  }	
+  
+  return (0);
+}
+
+__initfunc(int
+setup_gazel(struct IsdnCard *card))
+{
+	struct IsdnCardState *cs = card->cs;
+	char    tmp[64];
+	u_char  val;
+	
+	strcpy(tmp, gazel_revision);
+	printk(KERN_INFO "Gazel: Driver Revision %s\n", HiSax_getrev(tmp));	
+	
+        if (cs->typ != ISDN_CTYPE_GAZEL_R647)
+		return (0);
+
+        if (card->para[0]) {
+
+	  if (setup_gazelisa(card, cs))
+	    return (0);
+      	} 
+	else {
+
+#if CONFIG_PCI
+	  if (setup_gazelpci(cs))
+	    return (0);
+#else
+	  printk(KERN_WARNING "Gazel: Card PCI requested and NO_PCI_BIOS, unable to config\n");
+	  return (1);
+#endif /* CONFIG_PCI */
+	}
+
+	if (reserve_regions(card, cs)) {
+	  return (0);
+	}			
+
+	if (reset_gazel(cs)) {
+	  printk(KERN_WARNING "Gazel: wrong IRQ\n");
+	  release_io_gazel(cs);
+	  return (0);
+	}
+
+	cs->readisac = &ReadISAC;
+	cs->writeisac = &WriteISAC;
+	cs->readisacfifo = &ReadISACfifo;
+	cs->writeisacfifo = &WriteISACfifo;
+	cs->BC_Read_Reg = &ReadHSCX;
+	cs->BC_Write_Reg = &WriteHSCX;
+	cs->BC_Send_Data = &hscx_fill_fifo;
+	cs->cardmsg = &Gazel_card_msg;
+
+	switch (cs->subtyp) {
+	case R647:
+	case R685:
+	  ISACVersion(cs, "Gazel:");
+	  if (HscxVersion(cs, "Gazel:")) {
+	    printk(KERN_WARNING
+		   "Gazel: wrong HSCX versions check IO address\n");
+	    release_io_gazel(cs);
+	    return (0);
+	  }
+	  break;
+	case R742:
+	case R753:
+	  val = ReadISAC(cs, IPAC_ID - 0x80);
+	  printk(KERN_INFO "Gazel: IPAC version %x\n", val);
+	  break;
+	}
+
+	return (1);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -ruN linux-2.2.5-ante/drivers/isdn/hisax/hisax.h linux-2.2.5-post/drivers/isdn/hisax/hisax.h
--- linux-2.2.5-ante/drivers/isdn/hisax/hisax.h	Tue Mar 16 01:11:30 1999
+++ linux-2.2.5-post/drivers/isdn/hisax/hisax.h	Fri Apr 16 21:43:17 1999
@@ -490,6 +490,17 @@
 	u_char ctrl_reg;
 };	
 
+struct gazel_hw {
+	unsigned int cfg_reg;
+	signed int ipac;
+	signed int isac;
+	signed int hscx[2];
+	signed int isacfifo;
+	signed int hscxfifo[2];
+	unsigned char timeslot;
+	unsigned char iom2;
+};
+
 struct teles3_hw {
 	unsigned int cfg_reg;
 	unsigned int isac;
@@ -624,12 +635,16 @@
 	unsigned char subtyp;
 	int protocol;
 	unsigned int irq;
+	u_char iom2_adf2;
+	u_char hscx0_tsaxr;
+	u_char hscx1_tsaxr;
 	int HW_Flags; 
 	int *busy_flag;
 	union {
 		struct elsa_hw elsa;
 		struct teles0_hw teles0;
 		struct teles3_hw teles3;
+		struct gazel_hw gazel;
 		struct avm_hw avm;
 		struct ix1_hw ix1;
 		struct diva_hw diva;
@@ -713,8 +728,9 @@
 #define  ISDN_CTYPE_AMD7930	23
 #define  ISDN_CTYPE_NICCY	24
 #define  ISDN_CTYPE_DBRI	25
+#define  ISDN_CTYPE_GAZEL_R647  26
 
-#define  ISDN_CTYPE_COUNT	25
+#define  ISDN_CTYPE_COUNT	26
 
 #ifdef ISDN_CHIP_ISAC
 #undef ISDN_CHIP_ISAC
@@ -844,6 +860,15 @@
 #define  CARD_TELES3C  0
 #endif
 
+#ifdef  CONFIG_HISAX_GAZEL
+#define  CARD_GAZEL (1<< ISDN_CTYPE_GAZEL_R647)
+#ifndef  ISDN_CHIP_ISAC
+#define  ISDN_CHIP_ISAC 1
+#endif
+#else
+#define  CARD_GAZEL  0
+#endif
+
 #ifdef  CONFIG_HISAX_AMD7930
 #define CARD_AMD7930 (1 << ISDN_CTYPE_AMD7930)
 #else
@@ -870,7 +895,7 @@
 			 | CARD_IX1MICROR2 | CARD_DIEHLDIVA | CARD_ASUSCOM \
 			 | CARD_TELEINT | CARD_SEDLBAUER | CARD_SPORTSTER \
 			 | CARD_MIC | CARD_NETJET | CARD_TELES3C | CARD_AMD7930 \
-			 | CARD_NICCY | CARD_DBRI)
+			 | CARD_NICCY | CARD_DBRI | CARD_GAZEL)
 
 #define TEI_PER_CARD 0
 
diff -ruN linux-2.2.5-ante/drivers/isdn/hisax/isdnl1.c linux-2.2.5-post/drivers/isdn/hisax/isdnl1.c
--- linux-2.2.5-ante/drivers/isdn/hisax/isdnl1.c	Tue Mar 16 01:11:30 1999
+++ linux-2.2.5-post/drivers/isdn/hisax/isdnl1.c	Thu Apr 15 22:59:31 1999
@@ -100,6 +100,10 @@
 extern int setup_teles3(struct IsdnCard *card);
 #endif
 
+#if CARD_GAZEL
+extern int setup_gazel(struct IsdnCard *card);
+#endif
+
 #if CARD_AVM_A1
 extern int setup_avm_a1(struct IsdnCard *card);
 #endif
@@ -163,7 +167,7 @@
  "Elsa PCMCIA", "Eicon.Diehl Diva", "ISDNLink", "TeleInt", "Teles 16.3c", 
  "Sedlbauer Speed Card", "USR Sportster", "ith mic Linux", "Elsa PCI",
  "Compaq ISA", "NETjet", "Teles PCI", "Sedlbauer Speed Star (PCMCIA)",
- "AMD 7930", "NICCY", "DBRI"
+ "AMD 7930", "NICCY", "DBRI", "Gazel"
 };
 
 extern struct IsdnCard cards[];
@@ -692,6 +696,10 @@
 #endif
 	cs->protocol = card->protocol;
 
+	cs->iom2_adf2 = 0x80;
+	cs->hscx0_tsaxr = 0x2f;
+	cs->hscx1_tsaxr = 0x03;
+
 	if ((card->typ > 0) && (card->typ < 31)) {
 		if (!((1 << card->typ) & SUPORTED_CARDS)) {
 			printk(KERN_WARNING
@@ -776,6 +784,11 @@
 		case ISDN_CTYPE_TELESPCMCIA:
 		case ISDN_CTYPE_COMPAQ_ISA:
 			ret = setup_teles3(card);
+			break;
+#endif
+#if CARD_GAZEL
+		case ISDN_CTYPE_GAZEL_R647:
+			ret = setup_gazel(card);
 			break;
 #endif
 #if CARD_AVM_A1
