[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