## beronet by Tzafrir Cohen <tzafrir.cohen@xorcom.com>
##
## Support bero.net cards in qozap and cwain Zaptel drivers.
## Source: http://blog.eth0.cc/zaptel-patchwork/

diff -urNad zaptel-1.4.7.1~dfsg~/cwain/cwain.c zaptel-1.4.7.1~dfsg/cwain/cwain.c
--- zaptel-1.4.7.1~dfsg~/kernel/cwain/cwain.c	2007-12-30 10:26:20.000000000 +0200
+++ zaptel-1.4.7.1~dfsg/kernel/cwain/cwain.c	2007-12-30 10:44:27.000000000 +0200
@@ -12,6 +12,13 @@
  * This program is free software and may be modified and
  * distributed under the terms of the GNU Public License.
  *
+ * Patched to recognize and support BN1E1 and BN2E1(+) boards
+ * by Daniel Scheller <scheller@loca.net> or <www@eth0.cc>
+ *
+ * The patch is (C) 2007 LocaNet oHG. It is free software and
+ * may be modified and distributed under the terms of the GNU 
+ * General Public License.
+ *
  */
 #include <linux/kernel.h>
 #include <linux/module.h>
@@ -153,7 +160,7 @@
     if (!(cwaintmp->span.flags & ZT_FLAG_RUNNING)) {
 	return;
     }
-    if ((cwaintmp->type == 0xb553) || (cwaintmp->type == 0xb554)) {
+    if ((cwaintmp->type == 0xb553) || (cwaintmp->type == 0xb554) || (cwaintmp->type == 0xb563) || (cwaintmp->type == 0xb564) || (cwaintmp->type == 0xb565)) {
 	/* sync status */
 	if (((cwaintmp->sync_sta & 0x07) == 0x07) && cwaintmp->sync) {
 	    cwaintmp->leds[0] = 1;    
@@ -294,7 +301,7 @@
     }
     spin_unlock(&cwain_span_registerlock);
 
-    if (cwainspan->type == 0xb553) {
+    if ((cwainspan->type == 0xb553) || (cwainspan->type == 0xb563)) {
 	cwaintmp = kmalloc(sizeof(struct zt_cwain_card),GFP_KERNEL);
 	if (!cwaintmp) {
 	    printk(KERN_WARNING "cwain: unable to kmalloc!\n");
@@ -309,10 +316,20 @@
 	cwaintmp->spans = 1;
 	cwaintmp->cardID = cwainspan->cardID;
 	cwain_register_card(cwaintmp);
-	printk(KERN_INFO
-	        "cwain: Junghanns.NET singleE1 PCI ISDN card configured at mem %lx IRQ %d HZ %d CardID %d\n",
-	          (unsigned long) cwainspan->pci_io,
-	        cwaintmp->span[0]->irq, HZ, cwainspan->cardID);
+
+	switch(cwainspan->type)
+	{
+		case 0xb553 : printk(KERN_INFO
+			        "cwain: Junghanns.NET singleE1 PCI ISDN card configured at mem %lx IRQ %d HZ %d CardID %d\n",
+				(unsigned long) cwainspan->pci_io,
+				cwaintmp->span[0]->irq, HZ, cwainspan->cardID);
+			      break;
+		case 0xb563 : printk(KERN_INFO
+			        "cwain: BeroNet BN1E1 (single HFC-E1) PCI ISDN card configured at mem %lx IRQ %d HZ %d CardID %d\n",
+				(unsigned long) cwainspan->pci_io,
+				cwaintmp->span[0]->irq, HZ, cwainspan->cardID);
+			      break;
+	}
     } else {
 	cwaintmp = cwain_get_card(cwainspan->pcibus);
 	if (!cwaintmp) {
@@ -325,13 +342,21 @@
 	
 	    spin_lock_init(&cwaintmp->lock);
 	    cwaintmp->pcibus = cwainspan->pcibus;
-	    cwaintmp->spans = cwainspan->type - 46419;
+	    cwaintmp->spans = 1;
 	    cwaintmp->span[0] = cwainspan;
 	    cwaintmp->cardID = cwainspan->cardID;
 	    cwaintmp->syncs[0] = -1;
 	    cwain_register_card(cwaintmp);
 	} else {
-	    cwaintmp->spans = cwainspan->type - 46418;
+	    switch (cwainspan->type) {
+		case 0xb554 :
+		case 0xb564 :
+		case 0xb565 : cwaintmp->spans = 2;
+			      break;
+		default     : cwaintmp->spans = 0;
+			      break;
+	    }
+
 	    if (cwainspan->cardID < cwaintmp->cardID) {
 		cwaintmp->cardID = cwainspan->cardID;
 		cwaintmp->span[1] = cwaintmp->span[0];
@@ -341,10 +366,30 @@
 	        cwaintmp->span[1] = cwainspan;
 		cwaintmp->syncs[1] = -1;
 	    }
-	    printk(KERN_INFO
-	        "cwain: Junghanns.NET doubleE1 PCI ISDN card configured at mem (%lx / %lx) IRQ %d HZ %d CardID (%d / %d) bus %#x\n",
-	          (unsigned long) cwaintmp->span[0]->pci_io, (unsigned long) cwaintmp->span[1]->pci_io,
-	        cwaintmp->span[0]->irq, HZ, cwaintmp->span[0]->cardID, cwaintmp->span[1]->cardID, cwaintmp->pcibus);
+
+	    switch (cwainspan->type) {
+		case 0xb554 : printk(KERN_INFO
+				"cwain: Junghanns.NET doubleE1 PCI ISDN card configured at mem (%lx / %lx) IRQ %d HZ %d CardID (%d / %d) bus %#x\n",
+				(unsigned long) cwaintmp->span[0]->pci_io, (unsigned long) cwaintmp->span[1]->pci_io,
+				cwaintmp->span[0]->irq, HZ, cwaintmp->span[0]->cardID, cwaintmp->span[1]->cardID, cwaintmp->pcibus);
+			      break;
+		case 0xb564 : printk(KERN_INFO
+				"cwain: BeroNet BN2E1 (dual HFC-E1) PCI ISDN card configured at mem (%lx / %lx) IRQ %d HZ %d CardID (%d / %d) bus %#x\n",
+				(unsigned long) cwaintmp->span[0]->pci_io, (unsigned long) cwaintmp->span[1]->pci_io,
+				cwaintmp->span[0]->irq, HZ, cwaintmp->span[0]->cardID, cwaintmp->span[1]->cardID, cwaintmp->pcibus);
+			      break;
+		case 0xb565 : printk(KERN_INFO
+				"cwain: BeroNet BN2E1 (+) (dual HFC-E1 w/failover) PCI ISDN card configured at mem (%lx / %lx) IRQ %d HZ %d CardID (%d / %d) bus %#x\n",
+				(unsigned long) cwaintmp->span[0]->pci_io, (unsigned long) cwaintmp->span[1]->pci_io,
+				cwaintmp->span[0]->irq, HZ, cwaintmp->span[0]->cardID, cwaintmp->span[1]->cardID, cwaintmp->pcibus);
+			      break;
+		default     : printk(KERN_INFO
+				"cwain: Unknown HFC-E1 PCI ISDN card configured at mem (%lx / %lx) IRQ %d HZ %d CardID (%d / %d) bus %#x\n",
+				(unsigned long) cwaintmp->span[0]->pci_io, (unsigned long) cwaintmp->span[1]->pci_io,
+				cwaintmp->span[0]->irq, HZ, cwaintmp->span[0]->cardID, cwaintmp->span[1]->cardID, cwaintmp->pcibus);
+			      break;
+	    }
+
 	}
     }
     return 0;
@@ -1232,6 +1277,15 @@
     		case 0xb554:
 		    sprintf(cwainspan->span.desc,"Junghanns.NET doubleE1 PCI ISDN Card %d (cardID %d) (1 E1 port) SYNCED",cwainspan->cardno,cwainspan->cardID);
 		    break;
+		case 0xb563:
+		    sprintf(cwainspan->span.desc,"BeroNet BN1E1 (single HFC-E1) PCI ISDN Card %d (cardID %d) SYNCED",cwainspan->cardno,cwainspan->cardID);
+	    	    break;
+    		case 0xb564:
+		    sprintf(cwainspan->span.desc,"BeroNet BN2E1 (dual HFC-E1) PCI ISDN Card %d (cardID %d) (1 E1 port) SYNCED",cwainspan->cardno,cwainspan->cardID);
+		    break;
+    		case 0xb565:
+		    sprintf(cwainspan->span.desc,"BeroNet BN2E1 (+) (dual HFC-E1 w/failover) PCI ISDN Card %d (cardID %d) (1 E1 port) SYNCED",cwainspan->cardno,cwainspan->cardID);
+		    break;
 	    }
 	} else {
 	    switch (cwainspan->type) {
@@ -1241,6 +1295,15 @@
     		case 0xb554:
 		    sprintf(cwainspan->span.desc,"Junghanns.NET doubleE1 PCI ISDN Card %d (cardID %d) (1 E1 port) NO SYNC (sync_sta = %#x)",cwainspan->cardno,cwainspan->cardID, sync_sta);
 	    	    break;
+		case 0xb563:
+		    sprintf(cwainspan->span.desc,"BeroNet BN1E1 (single HFC-E1) PCI ISDN Card %d (cardID %d) NO SYNC (sync_sta = %#x)",cwainspan->cardno,cwainspan->cardID, sync_sta);
+		    break;
+    		case 0xb564:
+		    sprintf(cwainspan->span.desc,"BeroNet BN2E1 (dual HFC-E1) PCI ISDN Card %d (cardID %d) (1 E1 port) NO SYNC (sync_sta = %#x)",cwainspan->cardno,cwainspan->cardID, sync_sta);
+	    	    break;
+    		case 0xb565:
+		    sprintf(cwainspan->span.desc,"BeroNet BN2E1 (+) (dual HFC-E1 w/failover) PCI ISDN Card %d (cardID %d) (1 E1 port) NO SYNC (sync_sta = %#x)",cwainspan->cardno,cwainspan->cardID, sync_sta);
+	    	    break;
 	    }
 	}
 	cwain_doLEDs(cwainspan);
@@ -1862,6 +1925,15 @@
 	    case 0xb554:
 		sprintf(cwaintmp->span.desc,"Junghanns.NET doubleE1 PCI ISDN Card %d (cardID %d) (1 E1 port)",cwaintmp->cardno,cwaintmp->cardID);
 		break;
+	    case 0xb563:
+		sprintf(cwaintmp->span.desc,"BeroNet BN1E1 (single HFC-E1) PCI ISDN Card %d (cardID %d)",cwaintmp->cardno,cwaintmp->cardID);
+		break;
+	    case 0xb564:
+		sprintf(cwaintmp->span.desc,"BeroNet BN2E1 (dual HFC-E1) PCI ISDN Card %d (cardID %d) (1 E1 port)",cwaintmp->cardno,cwaintmp->cardID);
+		break;
+	    case 0xb565:
+		sprintf(cwaintmp->span.desc,"BeroNet BN2E1 (+) (dual HFC-E1 w/failover) PCI ISDN Card %d (cardID %d) (1 E1 port)",cwaintmp->cardno,cwaintmp->cardID);
+		break;
 	    default:
 		return -1;
 	}
@@ -2038,7 +2110,7 @@
 	/* disable interrupts */
 	cwain_outb(cwaintmp,cwain_R_IRQ_CTRL, 0); 
 
-        if (((tmp->subsystem_device==0xb553) || (tmp->subsystem_device==0xb554))&& (pcidid == PCI_DEVICE_ID_CCD_E)) {
+        if (((tmp->subsystem_device==0xb553) || (tmp->subsystem_device==0xb554) || (tmp->subsystem_device==0xb563) || (tmp->subsystem_device==0xb564) || (tmp->subsystem_device==0xb565))&& (pcidid == PCI_DEVICE_ID_CCD_E)) {
 	    dips = (cwain_inb(cwaintmp,cwain_R_GPI_IN0) >> 5);
 	    cid = 7;
 	    for (i=0;i<3;i++) {
diff -urNad qozap/qozap.c qozap/qozap.c
--- a/kernel/qozap/qozap.c	2007-12-30 10:26:21.000000000 +0200
+++ b/kernel/qozap/qozap.c	2007-12-30 10:44:21.000000000 +0200
@@ -9,6 +9,14 @@
  * This program is free software and may be modified and
  * distributed under the terms of the GNU Public License.
  *
+ * Patched to recognize and support BN2S0, BN4S0, BN8S0 and BN8S0+
+ * by Daniel Scheller <scheller@loca.net> or <www@eth0.cc> and
+ * Henning Holtschneider <henning@loca.net>
+ *
+ * The patch is (C) 2006, 2007 LocaNet oHG. It is free software and
+ * may be modified and distributed under the terms of the GNU Public
+ * License.
+ *
  */
 #include <linux/kernel.h>
 #include <linux/module.h>
@@ -112,7 +120,7 @@
     unsigned long flags;
     spin_lock_irqsave(&qoztmp->lock,flags);
 
-    if ((qoztmp->type == 0xb520) && (qoztmp->stports == 4)){
+    if (((qoztmp->type == 0xb520) || (qoztmp->type == 0xb560)) && (qoztmp->stports == 4)){
 	    qoz_outb(qoztmp,qoz_R_GPIO_SEL,0x20 | 0x10);
     	    qoz_outb(qoztmp,qoz_R_GPIO_EN1,0xf);
 	    qoz_outb(qoztmp,qoz_R_GPIO_OUT1,(qoztmp->leds[0] | (qoztmp->leds[1] << 1) | (qoztmp->leds[2] << 2) | (qoztmp->leds[3] << 3)));
@@ -147,7 +155,7 @@
     */
 	    qoz_outb(qoztmp,qoz_R_GPIO_OUT1, leds);
 
-    } else if (((qoztmp->type == 0xb556) || (qoztmp->type == 0xb751)) && (qoztmp->stports == 2)){
+    } else if (((qoztmp->type == 0xb556) || (qoztmp->type == 0xb566) || (qoztmp->type == 0xb751)) && (qoztmp->stports == 2)){
 	    qoz_outb(qoztmp,qoz_R_GPIO_SEL,0x80 | 0x40 | 0x20 | 0x10);
     	    qoz_outb(qoztmp,qoz_R_GPIO_EN1,0xff);
 	    leds = 0x0;
@@ -159,7 +167,7 @@
 	    }
 	    qoz_outb(qoztmp,qoz_R_GPIO_OUT1, leds);
 
-    } else if (qoztmp->type == 0xb558) {
+    } else if ((qoztmp->type == 0xb558) || (qoztmp->type == 0xb568)) {
 	    qoz_outb(qoztmp,qoz_R_GPIO_SEL,0x80 | 0x40 | 0x20);
     	    qoz_outb(qoztmp,qoz_R_GPIO_EN1,0x80 | 0x40 | 0x20 | 0x4);
 	    if (qoztmp->leds[0] == 1) {
@@ -182,7 +190,7 @@
 	    gpio_15 2
 	    gpio_14 3
 	*/	    
-    } else if (qoztmp->type == 0xb55b) {
+    } else if ((qoztmp->type == 0xb55b) || (qoztmp->type == 0xb56b)) {
 	qoz_outb(qoztmp,qoz_R_BRG_PCM_CFG,0x21); 
     /* 0x01 g1 st1
        0x02 g2 st2
@@ -302,9 +310,9 @@
 
     /* set S0 amplitude */
     qoz_outb(qoztmp,qoz_R_PWM_MD,0xa0);
-    if (qoztmp->type == 0xb552) {
+    if ((qoztmp->type == 0xb552) || (qoztmp->type == 0xb562)) {
 	qoz_outb(qoztmp,qoz_R_PWM0,0x19);
-    } else if (qoztmp->type == 0xb55b) {
+    } else if ((qoztmp->type == 0xb55b) || (qoztmp->type == 0xb56b)) {
 	qoz_outb(qoztmp,qoz_R_PWM0,0x19);
     } else {
 	qoz_outb(qoztmp,qoz_R_PWM0,0x1E);
@@ -318,9 +326,9 @@
     /* all state changes */
     qoz_outb(qoztmp,qoz_R_SCI_MSK, 0xff); 
 
-    if (qoztmp->type == 0xb552) {
+    if ((qoztmp->type == 0xb552) || (qoztmp->type == 0xb562)) {
         qoz_outb(qoztmp,qoz_R_FIFO_MD,0x16);
-    } else if (qoztmp->type == 0xb55b) {
+    } else if ((qoztmp->type == 0xb55b) || (qoztmp->type == 0xb56b)) {
         qoz_outb(qoztmp,qoz_R_FIFO_MD,0x16);
     } else {
         qoz_outb(qoztmp,qoz_R_FIFO_MD,0x26);
@@ -360,11 +368,11 @@
     qoztmp->leds[6] = 0x0;
     qoztmp->leds[7] = 0x0;
 
-    if (qoztmp->type == 0xb552) {
+    if ((qoztmp->type == 0xb552) || (qoztmp->type == 0xb562)) {
 	qoztmp->stports = 8;
-    } else if (qoztmp->type == 0xb55b) {
+    } else if ((qoztmp->type == 0xb55b) || (qoztmp->type == 0xb56b)) {
 	qoztmp->stports = 8;
-    } else if (qoztmp->type == 0xb556) {
+    } else if ((qoztmp->type == 0xb556) || (qoztmp->type == 0xb566)) {
 	qoztmp->stports = 2;
     } else if (qoztmp->type == 0xb557) {
 	qoztmp->stports = 2;
@@ -373,7 +381,7 @@
     }
     qoztmp->ticks = 0;
     qoztmp->clicks = 0;
-    if ((qoztmp->type == 0xb550) || (qoztmp->type == 0xb556)) {
+    if ((qoztmp->type == 0xb550) || (qoztmp->type == 0xb556) || (qoztmp->type == 0xb566)) {
 	printk(KERN_INFO "qozap: Starting hardware watchdog.\n");
 	qoztmp->wdp = 2;
     } else {
@@ -427,9 +435,9 @@
     unsigned long flags;
 
 
-    if (qoztmp->type == 0xb552) {
+    if ((qoztmp->type == 0xb552) || (qoztmp->type == 0xb562)) {
 	offset = 24;
-    } else if (qoztmp->type == 0xb55b) {
+    } else if ((qoztmp->type == 0xb55b) || (qoztmp->type == 0xb56b)) {
 	offset = 24;
     } else {
 	offset = 28;
@@ -493,9 +501,9 @@
     char offset = 0;
     unsigned long flags;
 
-    if (qoztmp->type == 0xb552) {
+    if ((qoztmp->type == 0xb552) || (qoztmp->type == 0xb562)) {
 	offset = 24;
-    } else if (qoztmp->type == 0xb55b) {
+    } else if ((qoztmp->type == 0xb55b) || (qoztmp->type == 0xb56b)) {
 	offset = 24;
     } else {
 	offset = 28;
@@ -526,7 +534,7 @@
     while ((oz1 != z1) && (oz2 != z2)) {
         oz1 = z1;
         oz2 = z2;
-	if ((qoztmp->type != 0xb552) && (qoztmp->type != 0xb55b)){
+	if ((qoztmp->type != 0xb552) && (qoztmp->type != 0xb55b) && (qoztmp->type != 0xb562) && (qoztmp->type != 0xb56b)){
     	    z1 = qoz_inw(qoztmp,qoz_A_Z1) & 0x7ff;
 	    z2 = qoz_inw(qoztmp,qoz_A_Z2) & 0x7ff;
 	} else {
@@ -535,7 +543,7 @@
 	}
     }
     
-    if ((qoztmp->type == 0xb552)|| (qoztmp->type == 0xb55b)) {
+    if ((qoztmp->type == 0xb552) || (qoztmp->type == 0xb55b) || (qoztmp->type == 0xb562) || (qoztmp->type == 0xb56b)) {
 	len = z1 - z2;
 	if (len < 0) {
 	    len += qoz_DFIFO_SIZE8;
@@ -944,9 +952,9 @@
 	if (debug > 1) {
 	    printk(KERN_INFO "qozap: card %d R_BERT_STA = %#x\n", qoztmp->cardno, qoz_inb(qoztmp, qoz_R_BERT_STA) & 7);
 	}
-	if (qoztmp->type == 0xb552) {
+	if ((qoztmp->type == 0xb552) || (qoztmp->type == 0xb562)) {
 	    offset = 24;
-	} else if (qoztmp->type == 0xb55b) {
+	} else if ((qoztmp->type == 0xb55b) || (qoztmp->type == 0xb56b)) {
 	    offset = 24;
         } else {
 	    offset = 28;
@@ -1131,7 +1139,7 @@
 	/* fifo irq */
 	spin_lock_irqsave(&(qoztmp->lock), flags);
 	irq_foview = qoz_inb(qoztmp,qoz_R_IRQ_OVIEW);
-        if ((qoztmp->type == 0xb552) || (qoztmp->type == 0xb55b)) {
+        if ((qoztmp->type == 0xb552) || (qoztmp->type == 0xb55b) || (qoztmp->type == 0xb562) || (qoztmp->type == 0xb56b)) {
 	    if (irq_foview & 0x60) {
 		offset = 0;
 		fi = qoz_inb(qoztmp,qoz_R_IRQ_FIFO_BL6);
@@ -1278,9 +1286,9 @@
     // irqs off
     qoz_outb(qoztmp,qoz_R_IRQ_CTRL, 0); 
 
-    if (qoztmp->type == 0xb552) {
+    if ((qoztmp->type == 0xb552) || (qoztmp->type == 0xb562)) {
 	offset = 24;
-    } else if (qoztmp->type == 0xb55b) {
+    } else if ((qoztmp->type == 0xb55b) || (qoztmp->type == 0xb56b)) {
 	offset = 24;
     } else {
 	offset = 28;
@@ -1411,9 +1419,9 @@
 
     spin_lock_irqsave(&qoztmp->lock,flags);
     // turn off irqs for all fifos
-    if (qoztmp->type == 0xb552) {
+    if ((qoztmp->type == 0xb552) || (qoztmp->type == 0xb562)) {
 	offset = 24;
-    } else if (qoztmp->type == 0xb55b) {
+    } else if ((qoztmp->type == 0xb55b) || (qoztmp->type == 0xb56b)) {
 	offset = 24;
     } else {
 	offset = 28;
@@ -1642,7 +1650,7 @@
 	qoz_resetCard(qoztmp);
 	
 
-        if ((tmp->subsystem_device==0xb520) && (pcidid == PCI_DEVICE_ID_CCD_M4)) {
+        if (((tmp->subsystem_device==0xb520) || (tmp->subsystem_device==0xb560)) && (pcidid == PCI_DEVICE_ID_CCD_M4)) {
 	//    printk(KERN_INFO "MODES = %#x.\n",modes);
 	    qoz_outb(qoztmp,qoz_R_GPIO_SEL,0x80 | 0x40);
 	    qoz_outb(qoztmp,qoz_R_GPIO_EN1,0x00);
@@ -1670,7 +1678,7 @@
 		    }
 		}
 
-        } else if ((tmp->subsystem_device==0xb556) && (pcidid == PCI_DEVICE_ID_CCD_M4)) {
+        } else if (((tmp->subsystem_device==0xb556) || (tmp->subsystem_device==0xb566)) && (pcidid == PCI_DEVICE_ID_CCD_M4)) {
 		/* duoBRI */
 
 		/* gpi27 1 gpi23 2 */
@@ -1686,7 +1694,7 @@
 		qoz_outw_io(qoztmp,0x0,0x0);  */
 
 
-        } else if ((tmp->subsystem_device==0xb558) && (pcidid == PCI_DEVICE_ID_CCD_M4)) {
+        } else if (((tmp->subsystem_device==0xb558) || (tmp->subsystem_device==0xb568)) && (pcidid == PCI_DEVICE_ID_CCD_M4)) {
 		/* quadBRI minipCI */
 		qoz_outb(qoztmp,qoz_R_GPIO_SEL,0xF0);
 		qoz_outb(qoztmp,qoz_R_GPIO_EN0,0x00);
@@ -1706,7 +1714,7 @@
 		}
 //	    printk(KERN_INFO "DIPS = %#x CID= %#x\n",dips,cid);
 
-	} else if ((tmp->subsystem_device==0xb55b) && (pcidid == PCI_DEVICE_ID_CCD_M)){
+	} else if (((tmp->subsystem_device==0xb55b) || (tmp->subsystem_device==0xb56b)) && (pcidid == PCI_DEVICE_ID_CCD_M)){
 		qoz_outb(qoztmp,qoz_R_BRG_PCM_CFG,0x21); 
 
 		dips = ~qoz_inb_io(qoztmp,0x4000);
@@ -1730,7 +1738,7 @@
         }
 
 	if (ports == -1) {
-    	    if ((tmp->subsystem_device==0xb520) && (pcidid == PCI_DEVICE_ID_CCD_M4)) {
+    	    if (((tmp->subsystem_device==0xb520) || (tmp->subsystem_device==0xb560)) && (pcidid == PCI_DEVICE_ID_CCD_M4)) {
 		modes = qoz_inb(qoztmp,qoz_R_GPI_IN3) >> 4;
     	    } else if ((tmp->subsystem_device==0xb550) && (pcidid == PCI_DEVICE_ID_CCD_M4)) {
 		qoz_outb(qoztmp,qoz_R_GPIO_SEL,0xf0);
@@ -1743,7 +1751,7 @@
 		    printk(KERN_CRIT "gpi_in3 %#x \n", qoz_inb(qoztmp,qoz_R_GPI_IN3));
 		}
 		modes = qoz_inb(qoztmp,qoz_R_GPI_IN3) >> 4;	    
-    	    } else if ((tmp->subsystem_device==0xb558) && (pcidid == PCI_DEVICE_ID_CCD_M4)) {
+    	    } else if (((tmp->subsystem_device==0xb558) || (tmp->subsystem_device==0xb568)) && (pcidid == PCI_DEVICE_ID_CCD_M4)) {
 		qoz_outb(qoztmp,qoz_R_GPIO_SEL,0xf0);
 		qoz_outb(qoztmp,qoz_R_GPIO_EN0,0x00);
 		if (debug) {
@@ -1754,7 +1762,7 @@
 		    printk(KERN_CRIT "gpi_in3 %#x \n", qoz_inb(qoztmp,qoz_R_GPI_IN3));
 		}
 		modes = qoz_inb(qoztmp,qoz_R_GPI_IN3) >> 4;	    
-    	    } else if ((tmp->subsystem_device==0xb556) && (pcidid == PCI_DEVICE_ID_CCD_M4)) {
+    	    } else if (((tmp->subsystem_device==0xb556) || (tmp->subsystem_device==0xb566)) && (pcidid == PCI_DEVICE_ID_CCD_M4)) {
 		qoz_outb(qoztmp,qoz_R_GPIO_SEL,0xf0);
 		qoz_outb(qoztmp,qoz_R_GPIO_EN0,0x00);
 		if (debug) {
@@ -1817,6 +1825,20 @@
 		        qoztmp->irq, HZ, cid);
 		        totalBRIs += 4;
 		    break;
+		case 0xb560:
+			printk(KERN_INFO
+			"qozap: BeroNet BN4S0 card configured at io port %#x IRQ %d HZ %d CardID %d\n",
+			  (u_int) qoztmp->ioport,
+			qoztmp->irq, HZ, cid);
+			totalBRIs += 4;
+		    break;
+		case 0xb566:
+			printk(KERN_INFO
+			"qozap: BeroNet BN2S0 card configured at io port %#x IRQ %d HZ %d CardID %d\n",
+			  (u_int) qoztmp->ioport,
+			qoztmp->irq, HZ, cid);
+			totalBRIs += 2;
+		    break;
 	    } 
 	} else {
 	    switch (tmp->subsystem_device) {
@@ -1832,6 +1854,18 @@
 		       (u_int) qoztmp->ioport,
 		       qoztmp->irq, HZ);
 	        break;
+		case 0xb562:
+		    printk(KERN_INFO
+		       "qozap: BeroNet BN8S0 card configured at io port %#x IRQ %d HZ %d\n",
+		       (u_int) qoztmp->ioport,
+		       qoztmp->irq, HZ);
+		break;
+		case 0xb56b:
+		    printk(KERN_INFO
+		       "qozap: BeroNet BN8S0 (+) card configured at io port %#x IRQ %d HZ %d\n",
+		       (u_int) qoztmp->ioport,
+		       qoztmp->irq, HZ);
+		break;
 		default:
 		    printk(KERN_INFO
 		       "qozap: wtf\n");
