[Pkg-voip-commits] r2297 - in zaptel/trunk: debian/patches qozap
ztgsm
Tzafrir Cohen
tzafrir-guest at costa.debian.org
Thu Aug 24 06:01:15 UTC 2006
Author: tzafrir-guest
Date: 2006-08-24 06:01:12 +0000 (Thu, 24 Aug 2006)
New Revision: 2297
Modified:
zaptel/trunk/debian/patches/bristuff.dpatch
zaptel/trunk/qozap/qozap.c
zaptel/trunk/ztgsm/ztgsm.c
zaptel/trunk/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/trunk/debian/patches/bristuff.dpatch
===================================================================
--- zaptel/trunk/debian/patches/bristuff.dpatch 2006-08-24 05:59:24 UTC (rev 2296)
+++ zaptel/trunk/debian/patches/bristuff.dpatch 2006-08-24 06:01:12 UTC (rev 2297)
@@ -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/trunk/qozap/qozap.c
===================================================================
--- zaptel/trunk/qozap/qozap.c 2006-08-24 05:59:24 UTC (rev 2296)
+++ zaptel/trunk/qozap/qozap.c 2006-08-24 06:01:12 UTC (rev 2297)
@@ -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/trunk/ztgsm/ztgsm.c
===================================================================
--- zaptel/trunk/ztgsm/ztgsm.c 2006-08-24 05:59:24 UTC (rev 2296)
+++ zaptel/trunk/ztgsm/ztgsm.c 2006-08-24 06:01:12 UTC (rev 2297)
@@ -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/trunk/ztgsm/ztgsm.h
===================================================================
--- zaptel/trunk/ztgsm/ztgsm.h 2006-08-24 05:59:24 UTC (rev 2296)
+++ zaptel/trunk/ztgsm/ztgsm.h 2006-08-24 06:01:12 UTC (rev 2297)
@@ -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