[Pkg-voip-commits] r2294 - in zaptel/branches/sarge: debian/patches qozap ztgsm

Tzafrir Cohen tzafrir-guest at costa.debian.org
Thu Aug 24 05:46:34 UTC 2006


Author: tzafrir-guest
Date: 2006-08-24 05:46:23 +0000 (Thu, 24 Aug 2006)
New Revision: 2294

Modified:
   zaptel/branches/sarge/debian/patches/bristuff.dpatch
   zaptel/branches/sarge/qozap/qozap.c
   zaptel/branches/sarge/ztgsm/ztgsm.c
   zaptel/branches/sarge/ztgsm/ztgsm.h
Log:
* bristuff 0.3.0-PRE1s
* The bristuff patch sets the default echo canceller to MG2
  (Which is Digium's recommendation anyway)


Modified: zaptel/branches/sarge/debian/patches/bristuff.dpatch
===================================================================
--- zaptel/branches/sarge/debian/patches/bristuff.dpatch	2006-08-24 00:29:29 UTC (rev 2293)
+++ zaptel/branches/sarge/debian/patches/bristuff.dpatch	2006-08-24 05:46:23 UTC (rev 2294)
@@ -3,13 +3,52 @@
 ##
 ## All lines beginning with `## DP:' are a description of the patch.
 ## DP: This is the patch zaptel.patch from bristuff, with the Makefile
-## DP: patch removed. Version: 0.3.0-PRE1q
+## DP: patch removed. Version: 0.3.0-PRE1s
 
 @DPATCH@
-diff -urN zaptel-1.2.5.orig/zaptel.c zaptel-1.2.5/zaptel.c
---- zaptel-1.2.5.orig/zaptel.c	2005-12-17 03:04:05.000000000 +0100
-+++ zaptel-1.2.5/zaptel.c	2006-04-10 10:39:37.000000000 +0200
-@@ -4913,11 +4913,40 @@
+diff -urN zaptel-1.2.6.orig/zaptel.c zaptel-1.2.6/zaptel.c
+--- zaptel-1.2.6.orig/zaptel.c	2005-12-17 03:04:05.000000000 +0100
++++ zaptel-1.2.6/zaptel.c	2006-07-31 14:12:08.000000000 +0200
+@@ -139,6 +139,7 @@
+ EXPORT_SYMBOL(zt_qevent_lock);
+ EXPORT_SYMBOL(zt_hooksig);
+ EXPORT_SYMBOL(zt_alarm_notify);
++EXPORT_SYMBOL(zt_alarm_notify_no_master_change);
+ EXPORT_SYMBOL(zt_set_dynamic_ioctl);
+ EXPORT_SYMBOL(zt_ec_chunk);
+ EXPORT_SYMBOL(zt_ec_span);
+@@ -2685,6 +2686,30 @@
+ 	}
+ }
+ 
++void zt_alarm_notify_no_master_change(struct zt_span *span)
++{
++	int j;
++	int x;
++
++	span->alarms &= ~ZT_ALARM_LOOPBACK;
++	/* Determine maint status */
++	if (span->maintstat || span->mainttimer)
++		span->alarms |= ZT_ALARM_LOOPBACK;
++	/* DON'T CHANGE THIS AGAIN. THIS WAS DONE FOR A REASON.
++ 	   The expression (a != b) does *NOT* do the same thing
++	   as ((!a) != (!b)) */
++	/* if change in general state */
++	if ((!span->alarms) != (!span->lastalarms)) {
++		if (span->alarms)
++			j = ZT_EVENT_ALARM;
++		else
++			j = ZT_EVENT_NOALARM;
++		span->lastalarms = span->alarms;
++		for (x=0;x < span->channels;x++)
++			zt_qevent_lock(&span->chans[x], j);
++	}
++}
++
+ #define VALID_SPAN(j) do { \
+ 	if ((j >= ZT_MAX_SPANS) || (j < 1)) \
+ 		return -EINVAL; \
+@@ -4913,11 +4938,40 @@
  					*(txb++) = fasthdlc_tx_run_nocheck(&ms->txhdlc);
  				}
  				bytes -= left;
@@ -50,7 +89,7 @@
  			}
  			/* Check buffer status */
  			if (ms->writeidx[ms->outwritebuf] >= ms->writen[ms->outwritebuf]) {
-@@ -4962,6 +4991,17 @@
+@@ -4962,6 +5016,17 @@
  				/* Transmit a flag if this is an HDLC channel */
  				if (ms->flags & ZT_FLAG_HDLC)
  					fasthdlc_tx_frame_nocheck(&ms->txhdlc);
@@ -68,7 +107,7 @@
  #ifdef CONFIG_ZAPATA_NET
  				if (ms->flags & ZT_FLAG_NETDEV)
  					netif_wake_queue(ztchan_to_dev(ms));
-@@ -4972,7 +5012,7 @@
+@@ -4972,7 +5037,7 @@
  					tasklet_schedule(&ms->ppp_calls);
  				}
  #endif
@@ -77,7 +116,7 @@
  		} else if (ms->curtone && !(ms->flags & ZT_FLAG_PSEUDO)) {
  			left = ms->curtone->tonesamples - ms->tonep;
  			if (left > bytes)
-@@ -5018,6 +5058,10 @@
+@@ -5018,6 +5083,10 @@
  				memset(txb, 0xFF, bytes);
  			}
  			bytes = 0;
@@ -88,7 +127,7 @@
  		} else {
  			memset(txb, ZT_LIN2X(0, ms), bytes);	/* Lastly we use silence on telephony channels */
  			bytes = 0;
-@@ -5743,6 +5787,13 @@
+@@ -5743,6 +5812,13 @@
  	int left, x;
  
  	int bytes = ZT_CHUNKSIZE;
@@ -102,7 +141,7 @@
  
  	while(bytes) {
  #if defined(CONFIG_ZAPATA_NET)  || defined(CONFIG_ZAPATA_PPP)
-@@ -5801,6 +5852,19 @@
+@@ -5801,6 +5877,19 @@
  						}
  					}
  				}
@@ -122,9 +161,9 @@
  			} else {
  				/* Not HDLC */
  				memcpy(buf + ms->readidx[ms->inreadbuf], rxb, left);
-diff -urN zaptel-1.2.5.orig/zaptel.h zaptel-1.2.5/zaptel.h
---- zaptel-1.2.5.orig/zaptel.h	2005-12-17 03:04:05.000000000 +0100
-+++ zaptel-1.2.5/zaptel.h	2006-04-10 10:39:37.000000000 +0200
+diff -urN zaptel-1.2.6.orig/zaptel.h zaptel-1.2.6/zaptel.h
+--- zaptel-1.2.6.orig/zaptel.h	2005-12-17 03:04:05.000000000 +0100
++++ zaptel-1.2.6/zaptel.h	2006-07-31 12:58:04.000000000 +0200
 @@ -994,6 +994,13 @@
  	int do_ppp_error;
  	struct sk_buff_head ppp_rq;
@@ -159,9 +198,28 @@
  struct zt_span {
  	spinlock_t lock;
  	void *pvt;			/* Private stuff */
-diff -urN zaptel-1.2.5.orig/zconfig.h zaptel-1.2.5/zconfig.h
---- zaptel-1.2.5.orig/zconfig.h	2005-11-29 19:42:08.000000000 +0100
-+++ zaptel-1.2.5/zconfig.h	2006-04-10 10:39:37.000000000 +0200
+@@ -1404,6 +1415,9 @@
+ /* Notify a change possible change in alarm status */
+ extern void zt_alarm_notify(struct zt_span *span);
+ 
++/* Notify a change possible change in alarm status, DONT change the zaptel master! */
++extern void zt_alarm_notify_no_master_change(struct zt_span *span);
++
+ /* Initialize a tone state */
+ extern void zt_init_tone_state(struct zt_tone_state *ts, struct zt_tone *zt);
+ 
+diff -urN zaptel-1.2.6.orig/zconfig.h zaptel-1.2.6/zconfig.h
+--- zaptel-1.2.6.orig/zconfig.h	2005-11-29 19:42:08.000000000 +0100
++++ zaptel-1.2.6/zconfig.h	2006-08-02 20:34:43.000000000 +0200
+@@ -53,7 +53,7 @@
+ /* MG2 is a version of KB1 that has some changes to it that are
+  * supposed to improve how it performs.  If you have echo problems,
+  * try it out! */
+-/* #define ECHO_CAN_MG2 */
++#define ECHO_CAN_MG2
+ 
+ /*
+  * Uncomment for aggressive residual echo supression under 
 @@ -152,4 +152,10 @@
   */
  /* #define FXSFLASH */
@@ -173,9 +231,9 @@
 +#define CONFIG_ZAPATA_BRI_DCHANS
 +
  #endif
-diff -urN zaptel-1.2.5.orig/ztpty.c zaptel-1.2.5/ztpty.c
---- zaptel-1.2.5.orig/ztpty.c	1970-01-01 01:00:00.000000000 +0100
-+++ zaptel-1.2.5/ztpty.c	2006-05-09 12:23:57.000000000 +0200
+diff -urN zaptel-1.2.6.orig/ztpty.c zaptel-1.2.6/ztpty.c
+--- zaptel-1.2.6.orig/ztpty.c	1970-01-01 01:00:00.000000000 +0100
++++ zaptel-1.2.6/ztpty.c	2006-06-06 14:54:33.000000000 +0200
 @@ -0,0 +1,112 @@
 +#include <stdio.h>
 +#include <stdlib.h>

Modified: zaptel/branches/sarge/qozap/qozap.c
===================================================================
--- zaptel/branches/sarge/qozap/qozap.c	2006-08-24 00:29:29 UTC (rev 2293)
+++ zaptel/branches/sarge/qozap/qozap.c	2006-08-24 05:46:23 UTC (rev 2294)
@@ -18,6 +18,10 @@
 #include <zaptel.h>
 #include "qozap.h"
 
+#ifdef LINUX26
+#include <linux/moduleparam.h>
+#endif
+
 #if CONFIG_PCI
 
 static int doubleclock=0;
@@ -186,7 +190,7 @@
 
 void qoz_resetCard(struct qoz_card *qoztmp) {
     unsigned long flags;
-    unsigned char i=0;
+    unsigned int i=0;
     spin_lock_irqsave(&(qoztmp->lock),flags);
     pci_write_config_word(qoztmp->pcidev, PCI_COMMAND, PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
     
@@ -223,6 +227,11 @@
 	qoz_outb(qoztmp,qoz_R_PCM_MD0, 0x1);
     }
 
+    for (i=0; i<256; i++) {
+	qoz_outb(qoztmp,qoz_R_SLOT, i);
+	qoz_outb(qoztmp,qoz_A_SL_CFG, 0x0);
+    }
+
     /* all state changes */
     qoz_outb(qoztmp,qoz_R_SCI_MSK, 0xff); 
 
@@ -276,7 +285,7 @@
 	qoztmp->wdp = 0;
     }
 
-    for (i=0;i<qoztmp->stports;i++) {
+/*    for (i=0;i<qoztmp->stports;i++) {
 	if (qoztmp->st[i].nt_mode) {
 	    qoz_outb(qoztmp,qoz_R_ST_SYNC,0x8 | i);
 	    if (debug)
@@ -284,9 +293,9 @@
 	    break;
 	}
     }
-    if (i == qoztmp->stports) {
+    if (i == qoztmp->stports) { */
 	qoz_outb(qoztmp,qoz_R_ST_SYNC,0x0);
-    }
+/*   } */
     spin_unlock_irqrestore(&(qoztmp->lock),flags);
 }
 
@@ -512,7 +521,104 @@
     return 0;
 }
 
+static void qoz_assign(struct qoz_card *qoztmp, int src_span, int src_chan, int dst_span, int dst_chan) {
+    int timeslot = src_span * 2 + (src_chan - 1);
+    int dst_fifo = dst_span * 2 + (dst_chan - 1); 
+    int src_fifo = src_span * 2 + (src_chan - 1); 
+    int src_hfc_chan = src_span * 4 + (src_chan - 1);
+    int dst_hfc_chan = dst_span * 4 + (dst_chan - 1);
 
+    qoz_outb(qoztmp,qoz_R_FIFO,(src_fifo << 1) | 1); 
+    qoz_waitbusy(qoztmp);
+    qoz_outb(qoztmp,qoz_R_INC_RES_FIFO,0x2);
+    qoz_waitbusy(qoztmp);
+    qoz_outb(qoztmp,qoz_A_CHANNEL,(src_hfc_chan << 1) | 1); 
+    qoz_outb(qoztmp,qoz_A_CON_HDLC,0xDE); // was c2
+
+    qoz_outb(qoztmp,qoz_R_SLOT,timeslot << 1);
+    qoz_outb(qoztmp,qoz_A_SL_CFG, (src_hfc_chan << 1) | 0 | 0x40);
+
+    qoz_outb(qoztmp,qoz_R_FIFO, dst_fifo << 1);
+    qoz_waitbusy(qoztmp);
+    qoz_outb(qoztmp,qoz_R_INC_RES_FIFO,0x2);
+    qoz_waitbusy(qoztmp);
+    qoz_outb(qoztmp,qoz_A_CHANNEL,dst_hfc_chan << 1);
+    qoz_outb(qoztmp,qoz_A_CON_HDLC,0xDE); // was c2
+    
+    qoz_outb(qoztmp,qoz_R_SLOT,(timeslot << 1) | 1); 
+    qoz_outb(qoztmp,qoz_A_SL_CFG, (dst_hfc_chan << 1) | 1 | 0x40);
+
+}
+
+static void qoz_unassign(struct qoz_card *qoztmp, int span, int chan) {
+    int timeslot = span * 2 + (chan - 1);
+    int fifo = span * 2 + (chan - 1);
+    int hfc_chan = span * 4 + (chan - 1);
+
+    qoz_outb(qoztmp,qoz_R_FIFO,(fifo << 1));
+    qoz_waitbusy(qoztmp);
+    qoz_outb(qoztmp,qoz_R_INC_RES_FIFO,0x2);
+    qoz_waitbusy(qoztmp);
+    qoz_outb(qoztmp,qoz_A_CON_HDLC,0x02);
+    qoz_outb(qoztmp,qoz_A_CHANNEL,(hfc_chan << 1)); 
+    qoz_outb(qoztmp,qoz_A_IRQ_MSK,0x1);
+
+    qoz_outb(qoztmp,qoz_R_FIFO,(fifo << 1) | 1);
+    qoz_waitbusy(qoztmp);
+    qoz_outb(qoztmp,qoz_R_INC_RES_FIFO,0x2);
+    qoz_waitbusy(qoztmp);
+    qoz_outb(qoztmp,qoz_A_CON_HDLC,0x02);
+    qoz_outb(qoztmp,qoz_A_CHANNEL,(hfc_chan << 1) | 1); 
+    qoz_outb(qoztmp,qoz_A_IRQ_MSK,0x1);
+
+    qoz_outb(qoztmp,qoz_R_SLOT,(timeslot << 1) | 1);
+    qoz_outb(qoztmp,qoz_A_SL_CFG, 0x0);
+
+    qoz_outb(qoztmp,qoz_R_SLOT,timeslot << 1);
+    qoz_outb(qoztmp,qoz_A_SL_CFG, 0x0);
+}
+
+
+static int ztqoz_dacs(struct zt_chan *dst, struct zt_chan *src)
+{
+	struct zt_qoz *ztqoz = NULL;
+	struct qoz_card *qoztmp = NULL;
+	if (src) { 
+	    ztqoz = src->pvt;
+	    qoztmp = ztqoz->card;
+	}
+	if (src && (src->pvt != dst->pvt)) {
+		/* cross card bridging */
+		if (debug)
+		    printk("Not Assigning %d/%d -> %d/%d, different cards!\n", src->span->offset, src->chanpos, dst->span->offset, dst->chanpos);
+		return -1;
+	}
+
+	if (src) {
+		if ((src->chanpos == 3) || (dst->chanpos == 3)) {
+		    if (debug)
+			printk("Not Assigning D-channel %d/%d -> %d/%d!\n", src->span->offset, src->chanpos, dst->span->offset, dst->chanpos);
+		} else {
+		    if (debug)
+			printk("Assigning channel %d/%d -> %d/%d!\n", src->span->offset, src->chanpos, dst->span->offset, dst->chanpos);
+		    qoz_assign(qoztmp, src->span->offset, src->chanpos, dst->span->offset, dst->chanpos);
+		}
+	} else {
+		ztqoz = dst->pvt;
+		qoztmp = ztqoz->card;
+		if (dst->chanpos == 3) {
+		    if (debug)
+			printk("Not Unassigning D-channel %d/%d!\n", dst->span->offset, dst->chanpos);
+		} else {
+		    qoz_unassign(qoztmp, dst->span->offset, dst->chanpos);
+		    if (debug)
+			printk("Unassigning channel %d/%d!\n", dst->span->offset, dst->chanpos);
+		}
+	}
+	return 0;
+}
+
+
 static inline void qoz_run(struct qoz_card *qoztmp) {
     int s=0;
     if (qoztmp->ztdev != NULL) {
@@ -528,7 +634,8 @@
 
 		if ((qoztmp->st[s].layer1state != 7) && (qoztmp->ztdev->chans[s][2].bytes2transmit > 0) && (qoztmp->st[s].nt_mode != 1)) {
 		    if (qoztmp->st[s].t3 == -1) {
-			printk(KERN_INFO "qozap: activating layer 1, span %d\n",s);
+			if (debug > 2)
+			    printk(KERN_INFO "qozap: activating layer 1, span %d\n",s);
 			qoztmp->st[s].t3 = 0;
 			qoz_outb(qoztmp,qoz_R_ST_SEL, s);
 			qoz_outb(qoztmp,qoz_A_ST_WR_STA,0x60); 
@@ -542,9 +649,10 @@
 		} else {
 		    if ((qoztmp->st[s].t3 == -1) && (qoztmp->st[s].t4 == -1) && (qoztmp->st[s].layer1state == 3) && (qoztmp->st[s].nt_mode != 1)) {
 			/* clear alarms */
-			printk(KERN_INFO "qozap: clearing alarms on span %d\n",s);
+			if (debug > 2)
+			    printk(KERN_INFO "qozap: clearing alarms on span %d\n",s);
 			qoztmp->ztdev->spans[s].alarms = ZT_ALARM_NONE;
-			zt_alarm_notify(&qoztmp->ztdev->spans[s]);
+			zt_alarm_notify_no_master_change(&qoztmp->ztdev->spans[s]);
 		    }
 		}
 
@@ -672,6 +780,11 @@
 	if (debug > 1) {
 	    printk(KERN_INFO "R_BERT_STA = %#x\n", qoz_inb(qoztmp, qoz_R_BERT_STA) & 7);
 	}
+	if (qoztmp->type == 0xb552) {
+	    offset = 24;
+        } else {
+	    offset = 28;
+	}
 	for (st=0;st<qoztmp->stports;st++) {
 	    if (irq_sci & (1 << st)) {
 		qoz_outb(qoztmp,qoz_R_ST_SEL,st);
@@ -709,11 +822,13 @@
 			if (qoztmp->st[st].t3 > -1)  {
 			    /* keep layer1 up, if the span is started. */
 			    if (qoztmp->ztdev->spans[st].flags & ZT_FLAG_RUNNING) {
-printk("qozap: re-activating layer1 span %d\n", st);
+				if (debug > 2) 
+				    printk("qozap: re-activating layer1 span %d\n", st);
     				qoz_outb(qoztmp,qoz_A_ST_WR_STA,0x60);
 			    }
 			} else {
-printk("qozap: not re-activating layer1 span %d\n", st);
+				if (debug > 2) 
+				    printk("qozap: not re-activating layer1 span %d\n", st);
     				qoz_outb(qoztmp,qoz_A_ST_WR_STA,0x40);
 			    /* if we tried to activate layer 1 and it failed make this an alarm */
 //			    qoztmp->ztdev->spans[st].alarms = ZT_ALARM_RED;
@@ -727,6 +842,11 @@
 			    sprintf(ztqoz->spans[st].desc,"quadBRI PCI ISDN Card %d Span %d [TE] (cardID %d) Layer 1 DEACTIVATED (F%d)",qoztmp->cardno ,st + 1,ztqoz->card->cardID, l1state);
 			}
 		    } else if (l1state == 7) {
+			/* reset D RX fifo */
+			qoz_outb(qoztmp,qoz_R_FIFO,((st + offset) << 1) | 1);
+			qoz_waitbusy(qoztmp);
+			qoz_outb(qoztmp,qoz_R_INC_RES_FIFO,0x2);
+			qoz_waitbusy(qoztmp);
 			/* activation complete, stop timer t3 */
 			qoztmp->st[st].t3 = -1;
 			qoztmp->ztdev->spans[st].alarms = ZT_ALARM_NONE;
@@ -739,7 +859,8 @@
 			}
 		    } else if (l1state == 8) {
 			/* lost framing */
-			printk(KERN_INFO "qozap: starting t4 for span %d\n", st);
+			if (debug > 2)
+			    printk(KERN_INFO "qozap: starting t4 for span %d\n", st);
 			qoztmp->st[st].t4 = 0;
 		    } else {
 			if (qoztmp->stports == 8) {
@@ -779,12 +900,13 @@
 		    if (qoztmp->st[j].nt_mode != 1) {
 			if ((qoztmp->st[j].t3 > qoz_T3) && (qoztmp->st[j].layer1state != 7)) {
 			    /* deactivate layer 1 */
-			    printk(KERN_INFO "qozap: t3 timer expired for span %d\n", j);
+			    if (debug > 2)
+				printk(KERN_INFO "qozap: t3 timer expired for span %d\n", j);
 			    qoz_outb(qoztmp,qoz_R_ST_SEL, j);
 			    qoz_outb(qoztmp,qoz_A_ST_WR_STA, 0x40 );
 			    qoztmp->st[j].t3 = -1;
 			    qoztmp->ztdev->spans[j].alarms = ZT_ALARM_RED;
-			    zt_alarm_notify(&qoztmp->ztdev->spans[j]);
+			    zt_alarm_notify_no_master_change(&qoztmp->ztdev->spans[j]);
 			    qoz_waitbusy(qoztmp);
 			}
 		    }
@@ -795,12 +917,13 @@
 		    if (qoztmp->st[j].nt_mode != 1) {
 			if ((qoztmp->st[j].t4 > qoz_T4) && (qoztmp->st[j].layer1state != 7)) {
 			    /* deactivate layer 1 */
-			    printk(KERN_INFO "qozap: t4 timer expired for span %d\n", j);
+			    if (debug > 2)
+				printk(KERN_INFO "qozap: t4 timer expired for span %d\n", j);
 			    qoz_outb(qoztmp,qoz_R_ST_SEL, j);
 			    qoz_outb(qoztmp,qoz_A_ST_WR_STA, 0x40 );
 			    qoztmp->st[j].t4 = -1;
 			    qoztmp->ztdev->spans[j].alarms = ZT_ALARM_RED;
-			    zt_alarm_notify(&qoztmp->ztdev->spans[j]);
+			    zt_alarm_notify_no_master_change(&qoztmp->ztdev->spans[j]);
 			    qoz_waitbusy(qoztmp);
 			}
 		    }
@@ -1193,6 +1316,7 @@
         ztqoz->spans[s].open = ztqoz_open;
         ztqoz->spans[s].close = ztqoz_close;
         ztqoz->spans[s].ioctl = ztqoz_ioctl;
+	ztqoz->spans[s].dacs = ztqoz_dacs;
 
         ztqoz->spans[s].chans = ztqoz->chans[s];
         ztqoz->spans[s].channels = 3;

Modified: zaptel/branches/sarge/ztgsm/ztgsm.c
===================================================================
--- zaptel/branches/sarge/ztgsm/ztgsm.c	2006-08-24 00:29:29 UTC (rev 2293)
+++ zaptel/branches/sarge/ztgsm/ztgsm.c	2006-08-24 05:46:23 UTC (rev 2294)
@@ -17,6 +17,10 @@
 #include <zaptel.h>
 #include "ztgsm.h"
 
+#ifdef LINUX26
+#include <linux/moduleparam.h>
+#endif
+
 #if CONFIG_PCI
 
 static int debug=0;
@@ -41,6 +45,7 @@
     
     printk(KERN_INFO "ztgsm: Powering up span %d ...", span);
     spin_lock_irqsave(&(gsmtmp->lock),flags);
+	gsmtmp->gsmspan[span].led = 0xC1;
 	dtr_on_off = ztgsm_indw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF);
 	dtr_on_off |= (1 << span) | (1 << (span+4));
 	ztgsm_outdw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF, dtr_on_off);
@@ -82,6 +87,7 @@
 	rts_o &= ~(1 << span);
         ztgsm_outdw_io(gsmtmp, ztgsm_SER_RTS_O, 0x0);
 	gsmtmp->power[span] = 1;
+	gsmtmp->gsmspan[span].led = 0x81;
     spin_unlock_irqrestore(&(gsmtmp->lock),flags);
 
     printk(" done.\n");
@@ -92,6 +98,7 @@
     unsigned long flags;
 
     spin_lock_irqsave(&(gsmtmp->lock),flags);
+	gsmtmp->gsmspan[span].led = 0xC0;
 	dtr_on_off = ztgsm_indw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF);
 	printk(KERN_INFO "ztgsm: Powering down span %d (SER_DTR_ON_OFF %x)...", span, dtr_on_off);
     
@@ -107,33 +114,45 @@
         dtr_on_off |= (1 << span);
 	ztgsm_outdw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF, dtr_on_off);
 	gsmtmp->power[span] = 0;
+	gsmtmp->gsmspan[span].led = 0x80;
     spin_unlock_irqrestore(&(gsmtmp->lock),flags);
     printk(" done.\n");
 }
 
 void ztgsm_switch_on_all(struct ztgsm_card *gsmtmp) {
+    unsigned long flags;
     printk(KERN_INFO "ztgsm: Powering up all spans...");
+    spin_lock_irqsave(&(gsmtmp->lock),flags);
+	gsmtmp->gsmspan[0].led = 0xC1;
+        gsmtmp->gsmspan[1].led = 0xC1;
+	gsmtmp->gsmspan[2].led = 0xC1;
+        gsmtmp->gsmspan[3].led = 0xC1;
 
-    ztgsm_outdw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF, 0xff);
+	ztgsm_outdw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF, 0xff);
     
-    ztgsm_outdw_io(gsmtmp, ztgsm_SER_RTS_O, 0x0f);
+	ztgsm_outdw_io(gsmtmp, ztgsm_SER_RTS_O, 0x0f);
+    spin_unlock_irqrestore(&(gsmtmp->lock),flags);
 
     set_current_state(TASK_UNINTERRUPTIBLE);
     schedule_timeout((1000 * HZ) / 1000);
 
-    ztgsm_outdw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF, 0xf0);
+    spin_lock_irqsave(&(gsmtmp->lock),flags);
+	ztgsm_outdw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF, 0xf0);
+    spin_unlock_irqrestore(&(gsmtmp->lock),flags);
 
     set_current_state(TASK_UNINTERRUPTIBLE);
     schedule_timeout((800 * HZ) / 1000);
 
-    ztgsm_outdw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF, 0xff);
+    spin_lock_irqsave(&(gsmtmp->lock),flags);
+	ztgsm_outdw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF, 0xff);
+    spin_unlock_irqrestore(&(gsmtmp->lock),flags);
 
     set_current_state(TASK_UNINTERRUPTIBLE);
     schedule_timeout((8000 * HZ) / 1000);
 
-//    ztgsm_outdw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF, 0x0f);
-    ztgsm_outdw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF, 0xff);
-    ztgsm_outdw_io(gsmtmp, ztgsm_SER_RTS_O, 0x0); /* 1 == -12 v */
+    spin_lock_irqsave(&(gsmtmp->lock),flags);
+	ztgsm_outdw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF, 0xff);
+	ztgsm_outdw_io(gsmtmp, ztgsm_SER_RTS_O, 0x0); /* 1 == -12 v */
     
 /* new
     ztgsm_outdw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF, 0x00);
@@ -144,22 +163,38 @@
     ztgsm_outdw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF, 0x0f);
 */    
 
+	gsmtmp->power[0] = 1;
+	gsmtmp->power[1] = 1;
+        gsmtmp->power[2] = 1;
+	gsmtmp->power[3] = 1;
+
+	gsmtmp->gsmspan[0].led = 0x81;
+	gsmtmp->gsmspan[1].led = 0x81;
+	gsmtmp->gsmspan[2].led = 0x81;
+	gsmtmp->gsmspan[3].led = 0x81;
+    spin_unlock_irqrestore(&(gsmtmp->lock),flags);
+
     printk(" done.\n");
-
-    gsmtmp->power[0] = 1;
-    gsmtmp->power[1] = 1;
-    gsmtmp->power[2] = 1;
-    gsmtmp->power[3] = 1;
 }
 
 void ztgsm_switch_off_all(struct ztgsm_card *gsmtmp) {
+    unsigned long flags;
+
     if (gsmtmp->power[0] || gsmtmp->power[1] || gsmtmp->power[2] || gsmtmp->power[3]) { 
+    spin_lock_irqsave(&(gsmtmp->lock),flags);
+	gsmtmp->gsmspan[0].led = 0xC0;
+        gsmtmp->gsmspan[1].led = 0xC0;
+	gsmtmp->gsmspan[2].led = 0xC0;
+        gsmtmp->gsmspan[3].led = 0xC0;
+	
 	printk(KERN_INFO "ztgsm: Powering down all spans...");
 	ztgsm_outdw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF, 0x0);
+    spin_unlock_irqrestore(&(gsmtmp->lock),flags);
 
 	set_current_state(TASK_UNINTERRUPTIBLE);
 	schedule_timeout((5000 * HZ) / 1000);
 
+    spin_lock_irqsave(&(gsmtmp->lock),flags);
 	ztgsm_outdw_io(gsmtmp, ztgsm_SER_DTR_ON_OFF, 0xf);
 	printk(" done.\n");
 
@@ -167,6 +202,12 @@
 	gsmtmp->power[1] = 0;
         gsmtmp->power[2] = 0;
 	gsmtmp->power[3] = 0;
+
+	gsmtmp->gsmspan[0].led = 0x80;
+	gsmtmp->gsmspan[1].led = 0x80;
+        gsmtmp->gsmspan[2].led = 0x80;
+	gsmtmp->gsmspan[3].led = 0x80;
+    spin_unlock_irqrestore(&(gsmtmp->lock),flags);
     }
 }
 
@@ -180,6 +221,8 @@
 	return;
     }
 
+    ztgsm_switch_off_all(gsmtmp);
+
     spin_lock_irqsave(&gsmtmp->lock,flags);
 
     gsmtmp->dead = 1;
@@ -191,7 +234,6 @@
     ztgsm_outdw_io(gsmtmp, ztgsm_PCM_FC_TOG_BIT, 0x0);
     ztgsm_outdw_io(gsmtmp, ztgsm_PCM_SAP_EN, 0x0);
 
-    ztgsm_switch_off_all(gsmtmp);
 
 /*    for (i=0; i < gsmtmp->gsmspans; i++) {
 	ztgsm_switch_off(gsmtmp, i);
@@ -556,7 +598,8 @@
 	}
 
 	if (fraddr & 3) {
-	    printk(KERN_EMERG "ztgsm: RX span %d unaligned word address %#x (fraddr & 3 = %d)\n", span, fraddr, (fraddr & 3));
+	    if (debug > 0)
+	        printk(KERN_INFO "ztgsm: RX span %d unaligned word address %#x (fraddr & 3 = %d)\n", span, fraddr, (fraddr & 3));
 	    fraddr -= fraddr & 3; /* align */
 	} 
 	if (len == ZT_CHUNKSIZE) {
@@ -574,10 +617,10 @@
 	    *((unsigned int *)&gsmtmp->rxbuf[span][4]) = data;
 //    ztgsm_outdw_io(gsmtmp, ztgsm_LED_DUAL, 0xf);
 	} else {
-	    printk(KERN_EMERG "ztgsm: dropped audio span %d fraddr %d addr %d\n", span, fraddr, addr);
+	    printk(KERN_INFO "ztgsm: dropped audio span %d fraddr %d addr %d\n", span, fraddr, addr);
 	}
 if (!(gsmtmp->ticks % 1000) && (debug > 4)) {
-	printk(KERN_EMERG "ztgsm: RX DATA:");
+	printk(KERN_INFO "ztgsm: RX DATA:");
 	for (i=0; i < ZT_CHUNKSIZE; i++) {
 	    printk("%x", gsmtmp->rxbuf[span][i]);
 	}
@@ -644,7 +687,24 @@
     return 0;
 }
 
-static void ztgsm_leds(struct ztgsm_card *gsmtmp, int leds) {
+static void ztgsm_leds(struct ztgsm_card *gsmtmp, int tick) {
+    int i = 0;
+    unsigned int leds = 0;
+    unsigned int color = 0;
+    for (i=0; i<gsmtmp->gsmspans; i++) {
+//	printk(KERN_INFO "ztgsm: led = %x\n",gsmtmp->gsmspan[i].led);
+	color = gsmtmp->gsmspan[i].led & 0x1;
+	leds |= (color << i);
+	if (!(gsmtmp->gsmspan[i].led & 0x80)) {
+	    leds |= (1 << (i+8));
+	}
+	if ((gsmtmp->gsmspan[i].led & 0x40)) {
+	    if (tick == 300)
+		leds |= (1 << (i+8));
+	}
+
+    }
+//    printk(KERN_INFO "ztgsm: leds = %d\n",leds);
     ztgsm_outdw_io(gsmtmp, ztgsm_LED_DUAL, leds);
 }
 
@@ -654,16 +714,12 @@
     for (s=0;s<gsmtmp->gsmspans;s++) {
         gsmspan = &gsmtmp->gsmspan[s];
         if (gsmspan) {
+	    if (!(gsmtmp->ticks % 1000)) {
+	        gsmtmp->ticks = 0;
+    	    }
+	    if (gsmtmp->ticks % 300 == 0)
+	        ztgsm_leds(gsmtmp, gsmtmp->ticks);
 	    if (gsmspan->span.flags & ZT_FLAG_RUNNING) {
-		if (!(gsmtmp->ticks % 1000)) {
-		    gsmtmp->ticks = 0;
-    	        }
-		if (gsmtmp->ticks >= 300)
-		    ztgsm_leds(gsmtmp, 0x000f);
-		if (gsmtmp->ticks >= 600)
-		    ztgsm_leds(gsmtmp, 0x0000);
-		if (gsmtmp->ticks == 900)
-		    ztgsm_leds(gsmtmp, 0xff00);
 		/* oh zaptel! tell us what to transmit... */
     		zt_transmit(&gsmspan->span);
 		if (debug && (gsmspan->chans[1].bytes2transmit > 0))
@@ -1066,9 +1122,10 @@
 	for (i=0; i < gsmtmp->gsmspans; i++) {
 	    gsmspan = &gsmtmp->gsmspan[i];
 	    ztgsm_init(gsmspan, gsmtmp, i);
+	    gsmspan->led = 0x80;
 	}
+        ztgsm_leds(gsmtmp, 0);
 
-	ztgsm_switch_on_all(gsmtmp);
 
 	gsmtmp->version = ztgsm_indw_io(gsmtmp, ztgsm_VERS_A);
 	printk(KERN_INFO "ztgsm: VERSION %x\n", gsmtmp->version);
@@ -1078,9 +1135,9 @@
 	    printk(KERN_INFO "ztgsm: tx_wm_sen %d\n", ztgsm_indw_io(gsmtmp, ztgsm_SER_TX_WM_SEN));
 	}
 	
-	ztgsm_outdw_io(gsmtmp, ztgsm_LED_DUAL, 0xf);
 
 	ztgsm_startCard(gsmtmp);
+	ztgsm_switch_on_all(gsmtmp);
 
     }
     return 0;

Modified: zaptel/branches/sarge/ztgsm/ztgsm.h
===================================================================
--- zaptel/branches/sarge/ztgsm/ztgsm.h	2006-08-24 00:29:29 UTC (rev 2293)
+++ zaptel/branches/sarge/ztgsm/ztgsm.h	2006-08-24 05:46:23 UTC (rev 2294)
@@ -5,6 +5,8 @@
 #define ztgsm_FRAMES	0x100
 
 typedef struct ztgsm_span {
+    int led;	/* 0 == RED 1 == GREEN  0x80 == on 0x40 == blink */
+    int sim_led;
     /* zaptel resources */
     struct zt_span span;
     struct zt_chan chans[2];




More information about the Pkg-voip-commits mailing list