# SHORT DESC: Zapata Telephony Driver
# LONG DESC: Zaptel is an open source telephony hardware driver API for various cards.
# Cleanup files that do not get managed
rm -f /lib/firmware/.zaptel-*
# Apply BRI D-Channel Patch
## http://updates.xorcom.com/astribank/bristuff/1.4/bristuff-current/patches/zaptel/bri_dchan
cat <<\__EOF__ > /tmp/bri_dchan-1tza.diff
# Translate the D channels to a standard channel data.
# The HFC chipset provides us the D channel as data, but
# Zaptel expects it as a standard channel with 1000 samples
# per second.
Index: zaptel-1.2.22/zaptel.h
===================================================================
--- zaptel-1.2.22.orig/zaptel.h 2007-12-04 10:40:30.000000000 +0100
+++ zaptel-1.2.22/zaptel.h 2007-12-04 14:35:14.545043151 +0100
@@ -1056,6 +1056,13 @@
int do_ppp_error;
struct sk_buff_head ppp_rq;
#endif
+#ifdef CONFIG_ZAPATA_BRI_DCHANS
+ int bytes2receive;
+ int maxbytes2transmit; /* size of the tx buffer in the card driver */
+ int bytes2transmit;
+ int eofrx;
+ int eoftx;
+#endif
spinlock_t lock;
char name[40]; /* Name */
/* Specified by zaptel */
@@ -1294,6 +1301,10 @@
#define ZT_FLAG_T1PPP (1 << 15)
#define ZT_FLAG_SIGFREEZE (1 << 16) /* Freeze signalling */
+#if defined(CONFIG_ZAPATA_BRI_DCHANS)
+#define ZT_FLAG_BRIDCHAN (1 << 19)
+#endif
+
struct zt_span {
spinlock_t lock;
void *pvt; /* Private stuff */
Index: zaptel-1.2.22/zconfig.h
===================================================================
--- zaptel-1.2.22.orig/zconfig.h 2007-12-04 10:40:29.000000000 +0100
+++ zaptel-1.2.22/zconfig.h 2007-12-04 14:35:01.329541263 +0100
@@ -166,4 +166,10 @@
*/
/* #define FXSFLASH */
+/*
+ * Uncomment the following for BRI D channels
+ *
+ */
+#define CONFIG_ZAPATA_BRI_DCHANS
+
#endif
Index: zaptel-1.2.22/zaptel-base.c
===================================================================
--- zaptel-1.2.22.orig/zaptel-base.c 2007-12-04 10:40:31.000000000 +0100
+++ zaptel-1.2.22/zaptel-base.c 2007-12-04 14:35:14.553042850 +0100
@@ -5226,11 +5255,40 @@
*(txb++) = fasthdlc_tx_run_nocheck(&ms->txhdlc);
}
bytes -= left;
+#ifdef CONFIG_ZAPATA_BRI_DCHANS
+ } else if (ms->flags & ZT_FLAG_BRIDCHAN) {
+ /*
+ * Let's get this right, we want to transmit complete frames only.
+ * The card driver will do the dirty HDLC work for us.
+ * txb (transmit buffer) is supposed to be big enough to store one frame
+ * we will make this as big as the D fifo (1KB or 2KB)
+ */
+
+ /* there are 'left' bytes in the user buffer left to transmit */
+ left = ms->writen[ms->outwritebuf] - ms->writeidx[ms->outwritebuf] - 2;
+ if (left > ms->maxbytes2transmit) {
+ memcpy(txb, buf + ms->writeidx[ms->outwritebuf], ms->maxbytes2transmit);
+ ms->writeidx[ms->outwritebuf] += ms->maxbytes2transmit;
+ txb += ms->maxbytes2transmit;
+ ms->bytes2transmit = ms->maxbytes2transmit;
+ ms->eoftx = 0;
+ } else {
+ memcpy(txb, buf + ms->writeidx[ms->outwritebuf], left);
+ ms->writeidx[ms->outwritebuf] += left + 2;
+ txb += left + 2;
+ ms->bytes2transmit = left;
+ ms->eoftx = 1;
+ }
+ bytes = 0;
+#endif
} else {
memcpy(txb, buf + ms->writeidx[ms->outwritebuf], left);
ms->writeidx[ms->outwritebuf]+=left;
txb += left;
bytes -= left;
+#if defined(CONFIG_ZAPATA_BRI_DCHANS)
+ ms->bytes2transmit=ZT_CHUNKSIZE;
+#endif
}
/* Check buffer status */
if (ms->writeidx[ms->outwritebuf] >= ms->writen[ms->outwritebuf]) {
@@ -5275,6 +5333,17 @@
/* Transmit a flag if this is an HDLC channel */
if (ms->flags & ZT_FLAG_HDLC)
fasthdlc_tx_frame_nocheck(&ms->txhdlc);
+#if defined(CONFIG_ZAPATA_BRI_DCHANS)
+ if(ms->flags & ZT_FLAG_BRIDCHAN) {
+ // if (ms->bytes2transmit > 0) {
+ // txb += 2;
+ // ms->bytes2transmit -= 2;
+ bytes=0;
+ ms->eoftx = 1;
+// printk(KERN_CRIT "zaptel EOF(%d) bytes2transmit %d\n",ms->eoftx,ms->bytes2transmit);
+ // }
+ }
+#endif
#ifdef CONFIG_ZAPATA_NET
if (ms->flags & ZT_FLAG_NETDEV)
netif_wake_queue(ztchan_to_dev(ms));
@@ -5335,6 +5404,12 @@
memset(txb, 0xFF, bytes);
}
bytes = 0;
+#if defined(CONFIG_ZAPATA_BRI_DCHANS)
+ } else if(ms->flags & ZT_FLAG_BRIDCHAN) {
+ ms->bytes2transmit = 0;
+ ms->eoftx = 0;
+ bytes = 0;
+#endif
} else {
memset(txb, ZT_LIN2X(0, ms), bytes); /* Lastly we use silence on telephony channels */
bytes = 0;
@@ -6153,6 +6228,14 @@
int res;
int left, x;
+#if defined(CONFIG_ZAPATA_BRI_DCHANS)
+ if (ms->flags & ZT_FLAG_BRIDCHAN) {
+ bytes = ms->bytes2receive;
+ if (bytes < 1) return;
+// printk(KERN_CRIT "bytes2receive %d\n",ms->bytes2receive);
+ }
+#endif
+
while(bytes) {
#if defined(CONFIG_ZAPATA_NET) || defined(CONFIG_ZAPATA_PPP)
skb = NULL;
@@ -6210,6 +6293,19 @@
}
}
}
+#ifdef CONFIG_ZAPATA_BRI_DCHANS
+ } else if (ms->flags & ZT_FLAG_BRIDCHAN) {
+ memcpy(buf + ms->readidx[ms->inreadbuf], rxb, left);
+ rxb += left;
+ ms->readidx[ms->inreadbuf] += left;
+ bytes -= left;
+ if (ms->eofrx == 1) {
+ eof=1;
+ }
+// printk(KERN_CRIT "receiving %d bytes\n",ms->bytes2receive);
+ ms->bytes2receive = 0;
+ ms->eofrx = 0;
+#endif
} else {
/* Not HDLC */
memcpy(buf + ms->readidx[ms->inreadbuf], rxb, left);
__EOF__
# Apply BRI D-Channel Patch
(
if echo "${pkgver}" | grep '^1\.4\.' >/dev/null; then
cd kernel || exit 1
fi
patch -p1 < /tmp/bri_dchan-1tza.diff || exit 1
rm -f /tmp/bri_dchan-1tza.diff
exit 0
) || exit 1
./configure --prefix=/usr --libdir="${libdir}" --sysconfdir=/etc --localstatedir=/var || exit 1
COMPILE_KVERS=$(cat /usr/src/linux/include/config/kernel.release 2>/dev/null)
if [ -z "${COMPILE_KVERS}" ]; then
eval $(grep -B30 '^KERNELRELEASE=' /usr/src/linux/Makefile | sed 's@ @@g;s@\$(@${@g;s@)@}@g') >/dev/null 2>/dev/null
COMPILE_KVERS="${KERNELRELEASE}"
fi
if [ -z "${COMPILE_KVERS}" ] || echo "${COMPILE_KVERS}" | grep '^2\.4\.' >/dev/null; then
echo ' *** We have LINUX 2.4 or unknown -- _NOT_ compiling kernel modules' "(kvers=${COMPILE_KVERS})"
make KVERS="${COMPILE_KVERS}" programs || exit 1
make KVERS="${COMPILE_KVERS}" install-programs || exit 1
else
echo ' *** We have LINUX 2.6 or better -- compiling kernel modules' "(kvers=${COMPILE_KVERS})"
rm -rf /etc/hotplug/usb
make KVERS="${COMPILE_KVERS}" || exit 1
make KVERS="${COMPILE_KVERS}" install || exit 1
make KVERS="${COMPILE_KVERS}" UPDATE_RCD=true config || exit 1
fi
if [ -f /etc/init.d/zaptel ]; then
# Fixups for broken Zaptel script
sed 's@system=redhat@system=debian@g;s@^ *\. \$initdir@test -f $initdir/functions \&\& . $initdir@' /etc/init.d/zaptel > /tmp/zaptel.new
cat /tmp/zaptel.new > /etc/init.d/zaptel
rm -f /tmp/zaptel.new
fi
# Cleanup files that do not get managed
rm -f /lib/firmware/.zaptel-*
exit 0
|