[zaptel-commits] tzafrir: branch 1.4 r2244 - in /branches/1.4/xpp:
./ firmwares/ utils/ utils/...
zaptel-commits at lists.digium.com
zaptel-commits at lists.digium.com
Tue Feb 27 17:57:00 MST 2007
Author: tzafrir
Date: Tue Feb 27 18:56:59 2007
New Revision: 2244
URL: http://svn.digium.com/view/zaptel?view=rev&rev=2244
Log:
xpp rev. 3495:
------------------------------------------------------------------------
r2243 | tzafrir | 2007-02-28 02:05:59 +0200 (Wed, 28 Feb 2007) | 4 lines
* xpp rev. 3495: fix a race in the FXO driver of recent weeks.
* Add the Astribank BRI driver (though still needs bristuffed zaptel
to build and thus will not build by default)
------------------------------------------------------------------------
r2239 | tzafrir | 2007-02-27 08:14:18 +0200 (Tue, 27 Feb 2007) | 18 lines
Xorcom rev. 3491:
* Version of xpp modules is set from xpp/.version, rather than "unknown".
* Astribank devices are now initialized in parallel: faster startup
when there are multiple Astribanks.
* Re-added support for the old format of /proc/xpp/sync write:
(echo N 0 > /proc/xpp/sync ) . The new format (SYNC=NN) is preffered.
* Firmware update to fix a PCM issue.
* Fixed a build issue with kernel 2.6.8 .
* Fixed missing initialization in Zaptel::Xpp::Xbus .
* genzaptelconf will now set FXS ports as LS by default. To set them as
KS, use fxs_default_start=ks in /etc/default/zaptel / /etc/sysconfig/zaptel
(Also a workaround for #7755 ).
* Groundwork for sync from zaptel master span: if zaptel is built with
ZAPTEL_SYNC_TIC (see zaptel/team/tzafrir/sync ), xpp will report its
drift from the zaptel sync master.
* USB firmware update: had bad lines checksums (and fxload did not report).
* fpga_load can now better report bad hex file checksum ;-) .
------------------------------------------------------------------------
r2223 | tzafrir | 2007-02-24 03:05:05 +0200 (Sat, 24 Feb 2007) | 3 lines
Add the Zaptel and Zaptel::Xpp perl modules, and some simple
utilities that use them. disabled by default for now.
------------------------------------------------------------------------
r2222 | tzafrir | 2007-02-24 02:55:05 +0200 (Sat, 24 Feb 2007) | 2 lines
Make the xpp/utils/Makefile in 1.2 closer to the one in 1.4 .
Added:
branches/1.4/xpp/.version (contents, props changed)
- copied, changed from r2239, branches/1.2/xpp/.version
branches/1.4/xpp/card_bri.c (props changed)
- copied unchanged from r2243, branches/1.2/xpp/card_bri.c
branches/1.4/xpp/card_bri.h (props changed)
- copied unchanged from r2243, branches/1.2/xpp/card_bri.h
branches/1.4/xpp/utils/lszaptel (props changed)
- copied unchanged from r2223, branches/1.2/xpp/utils/lszaptel
branches/1.4/xpp/utils/xpp_sync (props changed)
- copied unchanged from r2223, branches/1.2/xpp/utils/xpp_sync
branches/1.4/xpp/utils/zconf/
- copied from r2223, branches/1.2/xpp/utils/zconf/
branches/1.4/xpp/utils/zconf/Zaptel/
- copied from r2223, branches/1.2/xpp/utils/zconf/Zaptel/
branches/1.4/xpp/utils/zconf/Zaptel.pm (props changed)
- copied unchanged from r2223, branches/1.2/xpp/utils/zconf/Zaptel.pm
branches/1.4/xpp/utils/zconf/Zaptel/Chans.pm (props changed)
- copied unchanged from r2223, branches/1.2/xpp/utils/zconf/Zaptel/Chans.pm
branches/1.4/xpp/utils/zconf/Zaptel/Span.pm (props changed)
- copied unchanged from r2223, branches/1.2/xpp/utils/zconf/Zaptel/Span.pm
branches/1.4/xpp/utils/zconf/Zaptel/Xpp/
- copied from r2223, branches/1.2/xpp/utils/zconf/Zaptel/Xpp/
branches/1.4/xpp/utils/zconf/Zaptel/Xpp.pm (props changed)
- copied unchanged from r2223, branches/1.2/xpp/utils/zconf/Zaptel/Xpp.pm
branches/1.4/xpp/utils/zconf/Zaptel/Xpp/Xbus.pm (contents, props changed)
- copied, changed from r2223, branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Xbus.pm
branches/1.4/xpp/utils/zconf/Zaptel/Xpp/Xpd.pm (props changed)
- copied unchanged from r2223, branches/1.2/xpp/utils/zconf/Zaptel/Xpp/Xpd.pm
branches/1.4/xpp/utils/zt_registration (props changed)
- copied unchanged from r2223, branches/1.2/xpp/utils/zt_registration
Modified:
branches/1.4/xpp/Makefile
branches/1.4/xpp/card_fxo.c
branches/1.4/xpp/card_fxs.c
branches/1.4/xpp/card_global.c
branches/1.4/xpp/firmwares/FPGA_1141.hex
branches/1.4/xpp/firmwares/FPGA_1151.hex
branches/1.4/xpp/firmwares/FPGA_FXS.hex
branches/1.4/xpp/firmwares/USB_1140.hex
branches/1.4/xpp/firmwares/USB_1150.hex
branches/1.4/xpp/utils/Makefile
branches/1.4/xpp/utils/fpga_load.c
branches/1.4/xpp/utils/genzaptelconf
branches/1.4/xpp/utils/hexfile.c
branches/1.4/xpp/utils/hexfile.h
branches/1.4/xpp/utils/test_parse.c
branches/1.4/xpp/utils/xpp_fxloader
branches/1.4/xpp/xbus-core.c
branches/1.4/xpp/xbus-core.h
branches/1.4/xpp/xpd.h
branches/1.4/xpp/xpp_usb.c
branches/1.4/xpp/xpp_zap.c
branches/1.4/xpp/xpp_zap.h
branches/1.4/xpp/xproto.c
branches/1.4/xpp/xproto.h
Copied: branches/1.4/xpp/.version (from r2239, branches/1.2/xpp/.version)
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/.version?view=diff&rev=2244&p1=branches/1.2/xpp/.version&r1=2239&p2=branches/1.4/xpp/.version&r2=2244
==============================================================================
--- branches/1.2/xpp/.version (original)
+++ branches/1.4/xpp/.version Tue Feb 27 18:56:59 2007
@@ -1,1 +1,1 @@
-trunk-r3489
+trunk-r3495
Propchange: branches/1.4/xpp/.version
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: branches/1.4/xpp/.version
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: branches/1.4/xpp/.version
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: branches/1.4/xpp/Makefile
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/Makefile?view=diff&rev=2244&r1=2243&r2=2244
==============================================================================
--- branches/1.4/xpp/Makefile (original)
+++ branches/1.4/xpp/Makefile Tue Feb 27 18:56:59 2007
@@ -1,5 +1,7 @@
+ZAPTEL_DIR = $(SUBDIRS)
+
EXTRA_CFLAGS = $(XPP_LOCAL_CFLAGS) \
- -g3 -I$(SUBDIRS) \
+ -g3 -I$(ZAPTEL_DIR) \
-DDEBUG \
-DPOLL_DIGITAL_INPUTS \
-DWITH_ECHO_SUPPRESSION \
@@ -8,9 +10,6 @@
ifneq (,$(filter y m,$(CONFIG_DEBUG_FS)))
EXTRA_CFLAGS += -DXPP_DEBUGFS
endif
-
-ZAPTEL_DIR = $(SUBDIRS)
-
ifneq (,$(shell grep -w echo_can_state_t $(ZAPTEL_DIR)/zaptel.h))
EXTRA_CFLAGS += -DZAPTEL_EC_TYPEDEF
endif
@@ -42,6 +41,7 @@
$(obj)/card_fxs.o $(obj)/card_fxo.o $(obj)/card_bri.o $(obj)/xpp_usb.o $(obj)/xpp.o: $(obj)/xpp_version.h
$(obj)/xpp_version.h: FORCE
+ $(Q)echo "Compile for $(XPP_VERSION_STR)"
$(Q)echo '#define XPP_VERSION $(XPP_VERSION_STR)' > $@.tmp
$(Q)if cmp -s $@.tmp $@ ; then echo; else \
mv $@.tmp $@ ; \
Propchange: branches/1.4/xpp/card_bri.c
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: branches/1.4/xpp/card_bri.c
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: branches/1.4/xpp/card_bri.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Propchange: branches/1.4/xpp/card_bri.h
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: branches/1.4/xpp/card_bri.h
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: branches/1.4/xpp/card_bri.h
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: branches/1.4/xpp/card_fxo.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/card_fxo.c?view=diff&rev=2244&r1=2243&r2=2244
==============================================================================
--- branches/1.4/xpp/card_fxo.c (original)
+++ branches/1.4/xpp/card_fxo.c Tue Feb 27 18:56:59 2007
@@ -417,6 +417,23 @@
return 0;
}
+static int FXO_card_open(xpd_t *xpd, lineno_t chan)
+{
+ struct FXO_priv_data *priv;
+
+ BUG_ON(!xpd);
+ priv = xpd->priv;
+ /*
+ * We pretend to have battery. If this is really the case
+ * than next calls to update_battery_status() won't change it.
+ * If we don't have battery, than on the next calls to
+ * update_battery_status() a battery_debounce[] cycle would start.
+ * Than, if no-battery is persistent, asterisk would be notified.
+ */
+ BIT_SET(priv->battery, chan);
+ return 0;
+}
+
static void poll_battery(xbus_t *xbus, xpd_t *xpd)
{
int i;
@@ -634,13 +651,17 @@
if(IS_SET(priv->battery, chipsel) && priv->battery_debounce[chipsel]++ > BAT_DEBOUNCE) {
DBG("%s/%s/%d: BATTERY OFF voltage=%d\n", xpd->xbus->busname, xpd->xpdname, chipsel, bat);
BIT_CLR(priv->battery, chipsel);
- update_line_status(xpd, chipsel, 0);
+ if(SPAN_REGISTERED(xpd))
+ zt_qevent_lock(&xpd->chans[chipsel], ZT_EVENT_ALARM);
+
}
} else {
priv->battery_debounce[chipsel] = 0;
if(!IS_SET(priv->battery, chipsel)) {
DBG("%s/%s/%d: BATTERY ON voltage=%d\n", xpd->xbus->busname, xpd->xpdname, chipsel, bat);
BIT_SET(priv->battery, chipsel);
+ if(SPAN_REGISTERED(xpd))
+ zt_qevent_lock(&xpd->chans[chipsel], ZT_EVENT_NOALARM);
}
}
/*
@@ -700,7 +721,6 @@
HANDLER_DEF(FXO, DAA_REPLY)
{
reg_cmd_t *info = &RPACKET_FIELD(pack, FXO, DAA_REPLY, regcmd);
- unsigned long flags;
struct FXO_priv_data *priv;
lineno_t chipsel;
@@ -709,7 +729,6 @@
__FUNCTION__, cmd->name, XPD_NUM(pack->addr));
return -EPROTO;
}
- spin_lock_irqsave(&xpd->lock, flags);
priv = xpd->priv;
BUG_ON(!priv);
chipsel = REG_FIELD(info, chipsel);
@@ -734,7 +753,6 @@
REG_FIELD(&xpd->requested_reply, subreg) == REG_FIELD(info, subreg)) {
xpd->last_reply = *info;
}
- spin_unlock_irqrestore(&xpd->lock, flags);
return 0;
}
@@ -757,12 +775,11 @@
.card_hooksig = FXO_card_hooksig,
.card_tick = FXO_card_tick,
.card_ioctl = FXO_card_ioctl,
+ .card_open = FXO_card_open,
.RING = XPROTO_CALLER(FXO, RING),
.RELAY_OUT = XPROTO_CALLER(FXO, RELAY_OUT),
.XPD_STATE = XPROTO_CALLER(FXO, XPD_STATE),
-
- .SYNC_SOURCE = XPROTO_CALLER(GLOBAL, SYNC_SOURCE),
},
.packet_is_valid = fxo_packet_is_valid,
.packet_dump = fxo_packet_dump,
Modified: branches/1.4/xpp/card_fxs.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/card_fxs.c?view=diff&rev=2244&r1=2243&r2=2244
==============================================================================
--- branches/1.4/xpp/card_fxs.c (original)
+++ branches/1.4/xpp/card_fxs.c Tue Feb 27 18:56:59 2007
@@ -34,7 +34,8 @@
static const char rcsid[] = "$Id$";
DEF_PARM(int, print_dbg, 0, 0600, "Print DBG statements"); /* must be before zap_debug.h */
-DEF_PARM_BOOL(poll_digital_inputs, 1, 0600, "Poll Digital Inputs"); /* must be before zap_debug.h */
+DEF_PARM_BOOL(poll_digital_inputs, 1, 0600, "Poll Digital Inputs");
+DEF_PARM_BOOL(reversepolarity, 0, 0600, "Reverse Line Polarity");
/* Signaling is opposite (fxo signalling for fxs card) */
#if 1
@@ -69,6 +70,22 @@
#define VALID_CHIPSEL(x) (((chipsel) >= 0 && (chipsel) <= 7) || (chipsel) == ALL_CHANS)
+/* Values of SLIC linefeed control register (0x40) */
+enum fxs_state {
+ FXS_LINE_OPEN = 0x00, /* Open */
+ FXS_LINE_ACTIVE = 0x01, /* Forward active */
+ FXS_LINE_OHTRANS = 0x02, /* Forward on-hook transmission */
+ FXS_LINE_TIPOPEN = 0x03, /* TIP open */
+ FXS_LINE_RING = 0x04, /* Ringing */
+ FXS_LINE_REV_ACTIVE = 0x05, /* Reverse active */
+ FXS_LINE_REV_OHTRANS = 0x06, /* Reverse on-hook transmission */
+ FXS_LINE_RING_OPEN = 0x07 /* RING open */
+};
+
+#define FXS_LINE_POL_ACTIVE ((reversepolarity) ? FXS_LINE_REV_ACTIVE : FXS_LINE_ACTIVE)
+#define FXS_LINE_POL_OHTRANS ((reversepolarity) ? FXS_LINE_REV_OHTRANS : FXS_LINE_OHTRANS)
+
+
/*---------------- FXS Protocol Commands ----------------------------------*/
static /* 0x0F */ DECLARE_CMD(FXS, XPD_STATE, bool on);
@@ -86,13 +103,18 @@
#define PROC_FXS_INFO_FNAME "fxs_info"
struct FXS_priv_data {
- struct proc_dir_entry *regfile;
- struct proc_dir_entry *fxs_info;
- xpp_line_t ledstate[NUM_LEDS]; /* 0 - OFF, 1 - ON */
- xpp_line_t ledcontrol[NUM_LEDS]; /* 0 - OFF, 1 - ON */
- xpp_line_t found_fsk_pattern;
- xpp_line_t msg_waiting;
- int led_counter[NUM_LEDS][CHANNELS_PERXPD];
+ struct proc_dir_entry *regfile;
+ struct proc_dir_entry *fxs_info;
+ xpp_line_t ledstate[NUM_LEDS]; /* 0 - OFF, 1 - ON */
+ xpp_line_t ledcontrol[NUM_LEDS]; /* 0 - OFF, 1 - ON */
+ xpp_line_t found_fsk_pattern;
+ xpp_line_t msg_waiting;
+ xpp_line_t update_offhook_state;
+ int led_counter[NUM_LEDS][CHANNELS_PERXPD];
+ int ohttimer[CHANNELS_PERXPD];
+#define OHT_TIMER 6000 /* How long after RING to retain OHT */
+ enum fxs_state idletxhookstate[CHANNELS_PERXPD]; /* IDLE changing hook state */
+ enum fxs_state lasttxhook[CHANNELS_PERXPD];
};
/*
@@ -108,6 +130,16 @@
#define LED_BLINK_RING (1000/8) /* in ticks */
/*---------------- FXS: Static functions ----------------------------------*/
+static int linefeed_control(xbus_t *xbus, xpd_t *xpd, lineno_t chan, enum fxs_state value)
+{
+ struct FXS_priv_data *priv;
+
+ priv = xpd->priv;
+ DBG("%s/%s/%d: value=0x%02X\n", xbus->busname, xpd->xpdname, chan, value);
+ priv->lasttxhook[chan] = value;
+ return SLIC_DIRECT_REQUEST(xbus, xpd, chan, SLIC_WRITE, 0x40, value);
+}
+
static int do_chan_power(xbus_t *xbus, xpd_t *xpd, lineno_t chan, bool on)
{
int value = (on) ? 0x06 : 0x00;
@@ -223,20 +255,19 @@
}
}
-static int do_callerid(xbus_t *xbus, xpd_t *xpd, lineno_t chan)
-{
- int ret = 0;
- int i;
-
- BUG_ON(!xbus);
- BUG_ON(!xpd);
- DBG("%s/%s/%d:\n", xbus->busname, xpd->xpdname, chan);
- ret = SLIC_DIRECT_REQUEST(xbus, xpd, chan, SLIC_WRITE, 0x40, FXS_LINE_CID);
- for_each_line(xpd, i)
- xpd->lasttxhook[i] = FXS_LINE_CID;
- return ret;
-}
-
+static void restore_leds(xpd_t *xpd)
+{
+ struct FXS_priv_data *priv;
+ int i;
+
+ priv = xpd->priv;
+ for_each_line(xpd, i) {
+ if(IS_SET(xpd->offhook, i))
+ MARK_ON(priv, i, LED_GREEN);
+ else
+ MARK_OFF(priv, i, LED_GREEN);
+ }
+}
/*---------------- FXS: Methods -------------------------------------------*/
@@ -310,6 +341,9 @@
priv->regfile->read_proc = proc_xpd_register_read;
priv->regfile->data = xpd;
#endif
+ for_each_line(xpd, i) {
+ priv->idletxhookstate[i] = FXS_LINE_POL_ACTIVE;
+ }
ret = run_initialize_registers(xpd);
if(ret < 0)
goto err;
@@ -333,6 +367,7 @@
do_led(xpd, i, LED_GREEN, 0);
msleep(50);
}
+ restore_leds(xpd);
return 0;
err:
clean_proc(xbus, xpd);
@@ -404,19 +439,26 @@
MARK_OFF(priv, i, LED_RED);
msleep(2);
}
+ restore_leds(xpd);
return 0;
}
int FXS_card_hooksig(xbus_t *xbus, xpd_t *xpd, int pos, zt_txsig_t txsig)
{
- int ret = 0;
+ struct FXS_priv_data *priv;
+ int ret = 0;
+ struct zt_chan *chan = NULL;
+ enum fxs_state txhook;
DBG("%s/%s/%d: %s\n", xbus->busname, xpd->xpdname, pos, txsig2str(txsig));
+ priv = xpd->priv;
BUG_ON(xpd->direction != TO_PHONE);
if (IS_SET(xpd->digital_inputs, pos)) {
DBG("Ignoring signal sent to digital input line\n");
return 0;
}
+ if(SPAN_REGISTERED(xpd))
+ chan = &xpd->span.chans[pos];
switch(txsig) {
case ZT_TXSIG_ONHOOK:
xpd->ringing[pos] = 0;
@@ -426,41 +468,54 @@
ret = CALL_XMETHOD(RELAY_OUT, xpd->xbus, xpd, pos-8, 0);
return ret;
}
+ if (priv->lasttxhook[pos] == FXS_LINE_OPEN) {
+ /*
+ * Restore state after KEWL hangup.
+ */
+ DBG("%s/%s/%d: KEWL STOP\n",
+ xbus->busname, xpd->xpdname, pos);
+ linefeed_control(xbus, xpd, pos, FXS_LINE_POL_ACTIVE);
+ if(IS_SET(xpd->offhook, pos))
+ MARK_ON(priv, pos, LED_GREEN);
+ }
ret = CALL_XMETHOD(RING, xbus, xpd, pos, 0); // RING off
if (!IS_SET(xpd->offhook, pos))
start_stop_vm_led(xbus, xpd, pos);
-#if 0
- switch(chan->sig) {
- case ZT_SIG_EM:
- case ZT_SIG_FXOKS:
- case ZT_SIG_FXOLS:
- xpd->lasttxhook[pos] = xpd->idletxhookstate[pos];
- break;
- case ZT_SIG_FXOGS:
- xpd->lasttxhook[pos] = FXS_LINE_TIPOPEN;
- break;
+ txhook = priv->lasttxhook[pos];
+ if(chan) {
+ switch(chan->sig) {
+ case ZT_SIG_EM:
+ case ZT_SIG_FXOKS:
+ case ZT_SIG_FXOLS:
+ txhook = priv->idletxhookstate[pos];
+ break;
+ case ZT_SIG_FXOGS:
+ txhook = FXS_LINE_TIPOPEN;
+ break;
+ }
}
-#endif
+ ret = linefeed_control(xbus, xpd, pos, txhook);
break;
case ZT_TXSIG_OFFHOOK:
+ txhook = priv->lasttxhook[pos];
if(xpd->ringing[pos]) {
BIT_SET(xpd->cid_on, pos);
- ret = do_callerid(xpd->xbus, xpd, pos); // CALLER ID
+ txhook = FXS_LINE_OHTRANS;
}
xpd->ringing[pos] = 0;
-#if 0
- switch(chan->sig) {
- case ZT_SIG_EM:
- xpd->lasttxhook[pos] = FXS_LINE_REV_ACTIVE;
- break;
- default:
- xpd->lasttxhook[pos] = xpd->idletxhookstate[pos];
- break;
+ if(chan) {
+ switch(chan->sig) {
+ case ZT_SIG_EM:
+ txhook = FXS_LINE_POL_ACTIVE;
+ break;
+ default:
+ txhook = priv->idletxhookstate[pos];
+ break;
+ }
}
-#endif
+ ret = linefeed_control(xbus, xpd, pos, txhook);
break;
case ZT_TXSIG_START:
- xpd->lasttxhook[pos] = FXS_LINE_RING;
xpd->ringing[pos] = 1;
BIT_CLR(xpd->cid_on, pos);
if(IS_SET(xpd->digital_outputs, pos)) {
@@ -471,7 +526,9 @@
ret = CALL_XMETHOD(RING, xbus, xpd, pos, 1); // RING on
break;
case ZT_TXSIG_KEWL:
- xpd->lasttxhook[pos] = FXS_LINE_DISABLED;
+ DBG("%s/%s/%d: KEWL START\n", xbus->busname, xpd->xpdname, pos);
+ linefeed_control(xbus, xpd, pos, FXS_LINE_OPEN);
+ MARK_OFF(priv, pos, LED_GREEN);
break;
default:
NOTICE("%s: Can't set tx state to %s (%d)\n", __FUNCTION__, txsig2str(txsig), txsig);
@@ -553,32 +610,63 @@
static void start_stop_vm_led(xbus_t *xbus, xpd_t *xpd, lineno_t pos)
{
+ struct FXS_priv_data *priv;
bool on;
+ BUG_ON(!xpd);
if (IS_SET(xpd->digital_outputs | xpd->digital_inputs, pos))
return;
+ priv = xpd->priv;
on = IS_SET(((struct FXS_priv_data *)xpd->priv)->msg_waiting, pos);
DBG("%s/%s/%d %s\n", xbus->busname, xpd->xpdname, pos, (on)?"ON":"OFF");
set_vm_led_mode(xbus, xpd, pos, on);
do_chan_power(xbus, xpd, pos, on);
- SLIC_DIRECT_REQUEST(xbus, xpd, pos, SLIC_WRITE, 0x40, (on) ? 0x04 : 0x01);
+ linefeed_control(xbus, xpd, pos, (on) ? FXS_LINE_RING : priv->idletxhookstate[pos]);
}
static int FXS_chan_onhooktransfer(xbus_t *xbus, xpd_t *xpd, lineno_t chan, int millies)
{
- int ret = 0;
-
- BUG_ON(!xpd);
+ struct FXS_priv_data *priv;
+ int ret = 0;
+
+ BUG_ON(!xpd);
+ priv = xpd->priv;
BUG_ON(chan == ALL_CHANS);
DBG("%s/%s/%d: (%d millies)\n", xbus->busname, xpd->xpdname, chan, millies);
- xpd->ohttimer[chan] = millies << 3;
- xpd->idletxhookstate[chan] = FXS_LINE_CID; /* OHT mode when idle */
- if (xpd->lasttxhook[chan] == FXS_LINE_ENABLED) {
- /* Apply the change if appropriate */
- ret = do_callerid(xpd->xbus, xpd, chan); // CALLER ID
- }
- start_stop_vm_led(xbus, xpd, chan);
+ if(!IS_SET(xpd->offhook, chan))
+ start_stop_vm_led(xbus, xpd, chan);
return ret;
+}
+
+static int FXS_card_open(xpd_t *xpd, lineno_t chan)
+{
+ struct FXS_priv_data *priv;
+ bool is_offhook;
+
+ BUG_ON(!xpd);
+ priv = xpd->priv;
+ is_offhook = IS_SET(xpd->offhook, chan);
+ DBG("%s/%s:%d (is %shook)\n", xpd->xbus->busname, xpd->xpdname,
+ chan, (is_offhook)?"off":"on");
+ /*
+ * Delegate updating zaptel to FXS_card_tick():
+ * The problem is that zt_hooksig() is spinlocking the channel and
+ * we are called by zaptel with the spinlock already held on the
+ * same channel.
+ */
+ BIT_SET(priv->update_offhook_state, chan);
+ return 0;
+}
+
+static int FXS_card_close(xpd_t *xpd, lineno_t chan)
+{
+ struct FXS_priv_data *priv;
+
+ BUG_ON(!xpd);
+ DBG("%s/%s:%d\n", xpd->xbus->busname, xpd->xpdname, chan);
+ priv = xpd->priv;
+ priv->idletxhookstate[chan] = FXS_LINE_POL_ACTIVE;
+ return 0;
}
/*
@@ -600,6 +688,36 @@
byte pos = input_channels[i];
SLIC_DIRECT_REQUEST(xbus, xpd, pos, SLIC_READ, 0x06, 0);
+ }
+}
+
+void handle_linefeed(xpd_t *xpd)
+{
+ struct FXS_priv_data *priv;
+ int i;
+
+ BUG_ON(!xpd);
+ priv = xpd->priv;
+ BUG_ON(!priv);
+ for_each_line(xpd, i) {
+ if (priv->lasttxhook[i] == FXS_LINE_RING) {
+ /* RINGing, prepare for OHT */
+ priv->ohttimer[i] = OHT_TIMER;
+ priv->idletxhookstate[i] = FXS_LINE_POL_OHTRANS;
+ } else {
+ if (priv->ohttimer[i]) {
+ priv->ohttimer[i]--;
+ if (!priv->ohttimer[i]) {
+ priv->idletxhookstate[i] = FXS_LINE_POL_ACTIVE;
+ if (priv->lasttxhook[i] == FXS_LINE_POL_OHTRANS) {
+ enum fxs_state txhook = FXS_LINE_POL_ACTIVE;
+ /* Apply the change if appropriate */
+ BIT_CLR(xpd->cid_on, i);
+ linefeed_control(xpd->xbus, xpd, i, txhook);
+ }
+ }
+ }
+ }
}
}
@@ -678,6 +796,28 @@
}
#endif
handle_fxs_leds(xpd);
+ handle_linefeed(xpd);
+ if(priv->update_offhook_state) { /* set in FXS_card_open() */
+ int i;
+
+ for_each_line(xpd, i) {
+ if(!IS_SET(priv->update_offhook_state, i))
+ continue;
+ /*
+ * Update LEDs and zaptel with current state of line.
+ */
+ if(IS_SET(xpd->offhook, i)) {
+ NOTICE("%s/%s/%d: Already offhook during open. OK.\n",
+ xbus->busname, xpd->xpdname, i);
+ MARK_ON(priv, i, LED_GREEN);
+ update_line_status(xpd, i, 1);
+ } else {
+ MARK_OFF(priv, i, LED_GREEN);
+ update_line_status(xpd, i, 0);
+ }
+ BIT_CLR(priv->update_offhook_state, i);
+ }
+ }
#ifndef VMWI_IOCTL
if(SPAN_REGISTERED(xpd))
detect_vmwi(xpd);
@@ -721,9 +861,8 @@
static /* 0x0F */ HOSTCMD(FXS, XPD_STATE, bool on)
{
- int ret = 0;
int i;
- enum fxs_state value = (on) ? 0x01 : 0x00;
+ enum fxs_state value = (on) ? FXS_LINE_POL_ACTIVE : FXS_LINE_OPEN;
unsigned long flags;
struct FXS_priv_data *priv;
@@ -732,23 +871,22 @@
priv = xpd->priv;
spin_lock_irqsave(&xpd->lock, flags);
DBG("%s/%s: %s\n", xbus->busname, xpd->xpdname, (on) ? "on" : "off");
- ret = SLIC_DIRECT_REQUEST(xbus, xpd, ALL_CHANS, SLIC_WRITE, 0x40, value);
for_each_line(xpd, i)
- xpd->lasttxhook[i] = value;
+ linefeed_control(xbus, xpd, i, value);
if(on) {
MARK_ON(priv, ALL_CHANS, LED_GREEN);
} else {
MARK_OFF(priv, ALL_CHANS, LED_GREEN);
}
spin_unlock_irqrestore(&xpd->lock, flags);
- return ret;
+ return 0;
}
static /* 0x0F */ HOSTCMD(FXS, RING, lineno_t chan, bool on)
{
int ret = 0;
struct FXS_priv_data *priv;
- enum fxs_state value = (on) ? 0x04 : 0x01;
+ enum fxs_state value = (on) ? FXS_LINE_RING : FXS_LINE_POL_ACTIVE;
BUG_ON(!xbus);
BUG_ON(!xpd);
@@ -756,8 +894,7 @@
priv = xpd->priv;
set_vm_led_mode(xbus, xpd, chan, 0);
do_chan_power(xbus, xpd, chan, on); // Power up (for ring)
- ret = SLIC_DIRECT_REQUEST(xbus, xpd, chan, SLIC_WRITE, 0x40, value);
- xpd->lasttxhook[chan] = value;
+ ret = linefeed_control(xbus, xpd, chan, value);
if(on) {
MARK_BLINK(priv, chan, LED_GREEN, LED_BLINK_RING);
} else {
@@ -819,7 +956,6 @@
DBG("%s/%s/%d: ONHOOK\n", xbus->busname, xpd->xpdname, i);
MARK_OFF(priv, i, LED_GREEN);
update_line_status(xpd, i, 0);
- start_stop_vm_led(xbus, xpd, i);
}
}
}
@@ -910,6 +1046,8 @@
.card_hooksig = FXS_card_hooksig,
.card_tick = FXS_card_tick,
.chan_onhooktransfer = FXS_chan_onhooktransfer,
+ .card_open = FXS_card_open,
+ .card_close = FXS_card_close,
#ifdef VMWI_IOCTL
.card_ioctl = FXS_card_ioctl,
#endif
@@ -917,8 +1055,6 @@
.RING = XPROTO_CALLER(FXS, RING),
.RELAY_OUT = XPROTO_CALLER(FXS, RELAY_OUT),
.XPD_STATE = XPROTO_CALLER(FXS, XPD_STATE),
-
- .SYNC_SOURCE = XPROTO_CALLER(GLOBAL, SYNC_SOURCE),
},
.packet_is_valid = fxs_packet_is_valid,
.packet_dump = fxs_packet_dump,
@@ -954,10 +1090,28 @@
spin_lock_irqsave(&xpd->lock, flags);
priv = xpd->priv;
BUG_ON(!priv);
- len += sprintf(page + len, "\t%-17s: ", "Channel");
+ len += sprintf(page + len, "%-8s %-10s %-10s %-10s\n",
+ "Channel",
+ "idletxhookstate",
+ "lasttxhook",
+ "ohttimer"
+ );
for_each_line(xpd, i) {
- if(!IS_SET(xpd->digital_outputs, i) && !IS_SET(xpd->digital_inputs, i))
- len += sprintf(page + len, "%d ", i % 10);
+ char pref;
+
+ if(IS_SET(xpd->digital_outputs, i))
+ pref = 'O';
+ else if(IS_SET(xpd->digital_inputs, i))
+ pref = 'I';
+ else
+ pref = ' ';
+ len += sprintf(page + len, "%c%7d %10d %10d %10d\n",
+ pref,
+ i,
+ priv->idletxhookstate[i],
+ priv->lasttxhook[i],
+ priv->ohttimer[i]
+ );
}
len += sprintf(page + len, "\n");
for(led = 0; led < NUM_LEDS; led++) {
Modified: branches/1.4/xpp/card_global.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/card_global.c?view=diff&rev=2244&r1=2243&r2=2244
==============================================================================
--- branches/1.4/xpp/card_global.c (original)
+++ branches/1.4/xpp/card_global.c Tue Feb 27 18:56:59 2007
@@ -59,6 +59,9 @@
return ret;
}
+/*
+ * The XPD parameter is totaly ignored by the driver and firmware as well.
+ */
/* 0x19 */ HOSTCMD(GLOBAL, SYNC_SOURCE, bool setit, bool is_master)
{
xframe_t *xframe;
@@ -66,14 +69,14 @@
byte mask = 0;
BUG_ON(!xbus);
- BUG_ON(!xpd);
if(is_master)
mask |= BIT(0);
if(!setit)
mask |= BIT(1);
- DBG("SYNC_SOURCE %s setit=%s is_master=%s (mask=0x%X)\n",
- xpd->xpdname, (setit)?"yes":"no", (is_master)?"yes":"no", mask);
- XFRAME_NEW(xframe, pack, xbus, GLOBAL, SYNC_SOURCE, xpd->id);
+ DBG("%s: setit=%s is_master=%s\n",
+ xbus->busname,
+ (setit)?"yes":"no", (is_master)?"yes":"no");
+ XFRAME_NEW(xframe, pack, xbus, GLOBAL, SYNC_SOURCE, 0);
RPACKET_FIELD(pack, GLOBAL, SYNC_SOURCE, mask) = mask;
xframe_send(xbus, xframe);
return 0;
@@ -94,7 +97,6 @@
xpp_line_t line_status = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, line_status);
xpd_addr_t xpd_addr = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, addr);
struct card_desc_struct *card_desc;
- unsigned long flags;
BUG_ON(!xbus);
if((card_desc = kmalloc(sizeof(struct card_desc_struct), GFP_ATOMIC)) == NULL) {
@@ -108,22 +110,10 @@
card_desc->type = type;
card_desc->rev = rev;
card_desc->xpd_addr = xpd_addr;
+ card_desc->line_status = line_status;
DBG("%s: xpd=%d-%d type=%d rev=%d line_status=0x%04X\n",
xbus->busname, xpd_addr.unit, xpd_addr.subunit, type, rev, line_status);
- spin_lock_irqsave(&xbus->lock, flags);
- if(type == XPD_TYPE_NOMODULE)
- XBUS_COUNTER(xbus, DEV_DESC_EMPTY)++;
- else
- XBUS_COUNTER(xbus, DEV_DESC_FULL)++;
- atomic_inc(&xbus->count_poll_answers);
- list_add_tail(&card_desc->card_list, &xbus->poll_results);
- spin_unlock_irqrestore(&xbus->lock, flags);
- /*
- * wake_up only after exiting our critical section.
- * We suspect that otherwise a spinlock nesting may occur
- * and cause a panic (if spinlock debugging is compiled in).
- */
- wake_up(&xbus->wait_for_polls);
+ xbus_poller_notify(xbus, card_desc);
return 0;
}
@@ -219,8 +209,11 @@
NOTICE("%s: received %s for non-existing xpd: addr=0x%02X\n", __FUNCTION__, cmd->name, xpd_num);
return -EPROTO;
}
- DBG("%s/%s: SYNC_REPLY: 0x%X %s\n", xpd->xbus->busname, xpd->xpdname,
- mask, (setit) ? "SET SYNC MASTER" : "");
+ DBG("%s/%s: mask=0x%X %s\n",
+ xpd->xbus->busname, xpd->xpdname,
+ mask,
+ (setit) ? "SET SYNC MASTER" : "");
+ dump_packet("SYNC_REPLY", pack, 1);
return 0;
}
Modified: branches/1.4/xpp/firmwares/FPGA_1141.hex
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/firmwares/FPGA_1141.hex?view=diff&rev=2244&r1=2243&r2=2244
==============================================================================
--- branches/1.4/xpp/firmwares/FPGA_1141.hex (original)
+++ branches/1.4/xpp/firmwares/FPGA_1141.hex Tue Feb 27 18:56:59 2007
@@ -1,8 +1,8 @@
#
-# $Id: FPGA_1141.hex 3297 2007-02-05 16:03:36Z dima $
+# $Id: FPGA_1141.hex 3415 2007-02-19 15:27:25Z dima $
#
:020000040000FA
-:80000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AD6FF4000882F0A006AD6FF4000882F0A006AD6FF4000882F0A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4455544455557475577775577675577775577765566665563625523235D2E37C2B51111551111551111551118B
+:80000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AD6FF4000B0E909006AD6FF4000B0E909006AD6FF4000B0E9090000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4455544455557475577775577675577775577765566665563625523235D2E37C2B5111155111155111155111E8
:80008000155111155111155111155111155111155111155111155111155111155111155111155111155111155111155111155111000000000000000000000000000000000000002552222552222552220025522225522200000000001AA1111AA1110025522200001AA1111AA111001AA11100001AA1111AA11100001AA1111AA1111AA113
:80010000110000002552222552222F21F112122F21F112122552222552222552222552220000001AA111255222255222255222255222255222255222255222255222255222255222000000002F21F112122F21F1121200002552222552221AA1111AA1112552222F21F1121200001AA1112F21F1121200002F21F112122F21F112121AA100
:800180001100255222255222000000000025522200001AA1111AA11125522200255222000025522200000000AFA4F44A4A155111000000000000000000000000001AA1111AA1110000000000000000000000000000255222000000002552222552220000255222255222255222255222255222255222255222255222255222002552220011
@@ -19,640 +19,623 @@
:800700005222000000CFCCFCCCCCFFFFFFFFFF3F33F333334F48F8848425522200CFCCFCCCCCFFFFFFFFFF3F33F33333EAAEEE7F75F55757000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004F44F444447F75F557573F31F11313000000CFC8F88C8CDFDBFBBDBD1F13F331314F44F444443F31F1131300CFC8F88C8CDFDBFBBDBDE7
:800780001F13F331310000DFDBFBBDBDDFDBFBBDBDDFDBFBBDBD000000004F44F444445F55F555551F11F111110000008F8CFCC8C88F8FFFF8F83AA3334F44F444441F11F11111008F8CFCC8C88F8FFFF8F83AA33300008F8FFFF8F88F8FFFF8F88F8FFFF8F8000000004F44F444445F57F775751F13F33131000000CFCCFCCCCCDFDEFE28
:80080000EDED1F12F221214F44F444441F13F3313100CFCCFCCCCCDFDEFEEDED1F12F221210000DFDEFEEDEDDFDEFEEDEDDFDEFEEDED000000004F44F444445F57F775751F13F33131000000CFCCFCCCCCCFCFFFFCFC3AA3334F44F444441F13F3313100CFCCFCCCCCCFCFFFFCFC3AA3330000CFCFFFFCFCCFCFFFFCFCCFCFFFFCFC000091
-:80088000000000000000000000000000000000001F19F99191B55BBB00008001000000000000000000000000004001000000000000000000000000DF8D07480000000000000000000000000000000000000000000000000000000000BE4E000000000000000000000000000000000000000000000000000000000000FFE40F480080010096
-:8009000000000000000000000000000040010000000000000000000000002F820C0000000000000000000000000000000000000000000000000000000000F04FFE8002004001008004148002800414800200008002800400002148000000480000108204000021AFEB05000000000000000000000000000000000000000000000000000038
-:80098000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F4818002800000000210000002100140010024001000040012814004081880288008088028002F04E21000048180000001200000000000000200100001400000000000040010000000000550348181480028004141828108204B8
-:800A000016012810A21140012810A2414001002B11484001280048408188022148008828108204F05C6580840180020000001002000010024001002100140000001480020040818802000088280000F04CBE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000001002000047
-:800A800000000000000088000000000000B0320200002800000000210000002100110020018001000040012200000022000080280200001F3801000000000000000000000000009012000000000000000000000000000000F0DF9B00008002000000000000000000000000120000000000000000000000000000EEA80000000000000000B0
-:800B000000000000000000000000000000000000000000000000FFE40F000000000000000000002100000000000000000000000000000000280000F0E79F000000000000002100000000100100000000000000000000000000000000003FEF0400000000000000000000000000000000000000000000208802000082000000AF510900002B
-:800B800000000000000000000000000000000000400122000000000000000000D0AC0A0000000000000000000010010000400100280000000022000000000082000000AF4F0F20010000000000000000000000000010020040020000000000000000880000F0967B0000000000000000000000000000100100004002000028000000000068
-:800C000082880000B01E0280010000000000000000001400000000212002000000000000000000000000F0ADD900000000001800002001000000200880014001000000000000800800140000002002DFEB08000000000000000000000000001001000000000000000000000000000000E7E8000080120200000000260100180000000024C2
-:800C800000000024000000008800000000004800F05AF120010018001215022021210152241422203211481100000000808104181800800200000000884200228004BB5F200100000010020000130421221800420000000000120029210100000000000000004200E0C20500002E12001214001218122003110028130111000010020020D5
-:800D0000040000200220080000808804800242D0E506001800004800A0412001001100280011000042800200000000000048800400480080240420E87F0D28000020032812000010014822524220024280022001124280042001190313020028821488008008008800BD32000000A01200005200400120820400000080240180040080013B
-:800D8000146012004800200800000000F04F752002120000422212002001001904182A0422144220020022120048000038000020A284110048200842428280F84E82800220022868800480A22118421860210022621C2401132222850212144800428081820400222114804201282480028220061FA1058004000012000028000028800233
-:800E0000001A064001004081010068800100004002A8422100000088002BE3002001000028000040014860120000000022002006408108110012481382040000808804000020E4F10B282001002A044A02001818421848223122A02419240226011A84021248181021283211122081042A144201D021042842212880282884F4FE180000FE
-:800E8000288002120080024001208102280048001C22020022420048002842001902400288008200000028F0D76420A124221242222006200200008001009011002084220448221242000018420080242808428220A8C28A2422082084F8FB398004200280014820012001100100802202220018114222192112012200004228000020228D
-:800F000084240420042A8402F094652002008001802201222A0140011CC2212828142242141CC2614858228002180010010000000000880000A0844242421F650280810220045200802424218102800118008084042002384214225840010020040022004880022880028082F28DBC000020220320043280812401000013248404A012801B
-:800F80000400110020810419A44100008888001C080000880080F82F368004200800004820012002468102008001281001181248C0110000481228481001000000622022042200224B2D80210380041822004822420018004842A021146218001C12210642000080040048420080280C2088822C8A248828082FA40F000028422812282280
-:80100000A04128008001224832801401A0122022810100144A01001800480040012006880000C81448CFD50E2280240280048004004880024811228011021B1448881100001C82A41410A142000020068008288220049061809222F0445500808222A4455AA1432AA614421852121AE11262143E21422AA64136E11213F141214A3211183A
-:801080001CA4311AE21401280010B15101424220028A2888BE818482880C88132A28E4160CCF860F7AA431002A06222842281A83064A04901170210122785A2402326A041A228434211A4191512A2404A061482A3441000080084A22A828424AAC628AC221CAFAA31580A342222A012A034A014822722A87218201481A22C43110A1442ACC
-:80110000C4411CF261611B162AA416682AA245521A511122A01400484AA48828192824A4CCAAA4266AAC62284AA8C2A0421F5809000000482021820400120080040080028001000000A02418288002288002282008000082002008BEB8A0533AA33168EAA4771A2123A1465AA3653AA1111AA3115AA1231F13A2331F12A24617124815A107
-:80118000761F12A2711A81A4513AA7332A7211A1433AA1311F12A7662AA6241F16A2466A245811221D814AAA862A2AA2266AA6EA6AA666EAECBE015AA5551A016AA8335A24027AA3311AA3554AA511F051113A22A7771F36B65287B532F52161EAFF21613AAF113AA4133AA322111F12A7421F17A5311F12A244484AF261216AA446AAFA10
-:80120000A1A16ADA11A8C82AA862EAACA62AE228B2E2AEE62BC67BB9A0443A072AA2665AA5156AA7767AA3357AA775001F13F351113AF371716AF621212B571F12E114C7616AAE336AA7113AA6317E613AA36617155AD6117421F111311A01621D214A06AAFAA1A18ADA11A8844AA8848AA8CC2AA2EE2BEEEAAECCCF77057AA773A0226A77
-:80128000A6335AA5335AA5375AA5775AA1141AA1221F15F131311F17A3461F16F673711F36E516E712F671E11F17A57E5E116AA6755AA6334AF431711AD61124F211217A87A4461D614A068AF881814A5E11CAAC266AA6EE6AAE22EABEE2EE22ACEE2F470B2220022248220048221280048082041228200442A0242084A12422422A0100AB
-:801300002A0122482248228A240280048A04008228A024827F180F18120080A414202201481812001812A042422A84012822281302000048A01200A01220024200822008224A22A8248242A242146FD308481B21B011A2141B212394212B1419B24299212B9413B14239212F1439212F142BD212B921C4911F22C4811F2264112E4296E1CA
-:801380002264192CA4292CB491C2421B29341B29421B2923B481324219B24298212B84112B84222B84222B842229A842882E427FA802481B61481922B4111292612396212999612BB419B24238212B941129BB21D412B92394921F2285FA21D2882E4296E12264183CE419C2421B29349A46B39166141B2923B481724291212B841B282F5F
-:801400001412F142A1222B84A2232492822B4A212E429FFC032088040080010010820212000000210080080000140000480000000000000000001002AD61A014000080021A220100124691110011385880011001281C2101284218222A04141C826115224242002048018002A829060014FF5405148A822201C81C81642448222386019060
-:80148000224E126878311C32419021A024282715A0243052244A022981812301400120282C784122A88421114848800C1C02CF64081A248E220120031A84412226823141298284E234816224001A028E21C0211822904124482022B5116213121381222404482042211C6212E02628E42804002FE7011400008A44816422482280013011BB
-:801500002C818432111C93411811808492521458B02221A41228290500804401208828E83428080048200280021FC60100008044014E12602400001100002148000000420000000000A04134004824822400820042824282004F4702280080011829020042002044023041481410C142481001210068002042020000000088864111828886
-:801580000842880028AF5208220080216421201182240400140030412914010042408104002A0400281002100100908200008888802C840822DFD20E00000014284800210080042100200411460200100200000000804502200480788251218800488008007D3E1468142002140023022800201101193221204102522982A242482228609D
-:80160000110040810422901142141D4222110090428028042D42222306F05ACF002A041100282200002882002800246022A0214021A8218004145022004816014800240021158282042128400110022AF4CE990012200140011400112140C112480028824812008041021800006024001C0848200420021002244810018A04005F41092266
-:80168000130338401181C221804203821611B1221411C1222084A12428281AC412A034204102211C1412C181481C256414255122111425224402290870420268C042DF5C0A48001100221002000020012228802902241081A242280000000018280000422822003042A02448004A0A20F278AF800420020000004240224202254222044A9A
-:801700002814914280041C846424001661244810318280A6244280924211004220A248212C082022F442363021002082021221001A021304230542484002A024181280821A82A1144A08004AA8822829B4822181080042000048002004002FAA042002140020022C4202002042210224111134400125014200002440010010011100282C6B
-:8017800002110000824800003769001118001003001302212122802208224828008AC1618015C28288194181CA8140018048928122A821108204211002482124C821248F1D07000000002400000000800400684880410280C4411D42208184844282A42442422084064A82041C1422A484224001007FCD02004800421842A04810010000F1
-:80180000101151211082022004002121001908800400A042212400902200004282822188F0313120042820412102A0122186023821102141A2492001246E814021362229A229800490828631A12A488299320082004011022120080048D0B708200C001011012111210010010014298404004602210080022412150210010080022088824C
-:8018800008800810014011721F0A188004880000142222A0282018428202282839022C83820A80012001802884042A681288002044022800002448288840F2AFDAA054C621212269262832602626130334C04215C21225D1225A2329F441612CF263415692635021E0368421C4332BC511112C32A3212F36B611AB862842686E62221423F8
-:801900001402CE422C282484C821F051FB1426210A1410113141903311361222D822125112684219E5146218008A0A46E326A244AE422B9125812C58112D834E218A882AB291A84830C22F220A27184224409222A0442F18C822C21C14F292F600800222601124248829820E2925A22922882C6614486A63221B46F02271B012B422BA42D6
-:8019800021F87142121286A24C8A7C2121E42C8E31621C2602230429348319044A8C28CA4288218846F27C32A021A021A021421AA214284A014A094A094A298229820998000020010028184A02280000000088A082800888222002AA04AA045B2414AAA113A0733AF171514AF421313AF3D1D12B773F1EBBD2E921BDD2EF2EF3D3111E72AA
-:801A00003F19AF8A2F1DABF71F13EB2AFAA3A14AF411117AA3EFEEF23F3FFF92E22BAAAABAB1E328B8E2CA221F3AAEEA1F1BABADEEE22BEC6E622BCCEE622BC41F34BC82E82C9E222AA24C2B242BACEA22E234F6B661142AA1573AA3226AB431B171F761717E72313BEE1F14B372C3C22BECEE323F1FE328FE83E17AF112312AFE21A3EE48
[... 5506 lines stripped ...]
More information about the zaptel-commits
mailing list