[zaptel-commits] tzafrir: trunk r2537 - in /trunk/xpp: ./ firmwares/ utils/ utils/zconf/ utils...

zaptel-commits at lists.digium.com zaptel-commits at lists.digium.com
Thu May 17 15:55:22 MST 2007


Author: tzafrir
Date: Thu May 17 17:55:21 2007
New Revision: 2537

URL: http://svn.digium.com/view/zaptel?view=rev&rev=2537
Log:
XPP revision 3965:
* Tested with zaptel-1.2.17.1
* Add D-Channel TX, RX and BAD frames count in /proc/xpp/XBUS-*/XPD-*/bri_info
* Adjust output of xpp_sync script. Pad for 8 port BRI.
* Added a debugging module parport_debug (not compiled by default).
* Added an optional patch to zaptel:
    - compiles only if ZAPTEL_SYNC_TICK is defined
    - Allow interested driver to register for "sync" notification.
    - Does not affect drivers that do not use this feature.
* Added external synchronization feature:
    - Only if ZAPTEL_SYNC_TICK feature is compiled in
    - Than XPP may be synchronized by another card (e.g: an Astribank
      with FXS can be synchronized by a Digium PRI card).
    - May be enabled/disabled in runtime via the 'sync_tick_active' module
      parameter to the xpp.ko module.
* Fixed a potential bug in D-Channel hexdump printing.
* New visual indications in BRI leds:
    - Constant ON RED/GREEN: Shows the port type -- NT/TE.
    - Very fast "double blink": Layer1 work, no D-Channel yet.
    - Steady blinking (1/2 sec): D-Channel trafic detected.
* xpp_fxloader moved to /usr/share/zaptel .
* adj_clock removed: never really used.
* Now we have Zaptel::Hardware and a sample zaptel_hardware script (not
  (installed by default).
* We also have a sample perl zapconf (not installed by default) which
  aims at replacing genzaptelconf (sans the modules detection).

Added:
    trunk/xpp/parport_debug.c
      - copied unchanged from r2536, branches/1.4/xpp/parport_debug.c
    trunk/xpp/parport_debug.h
      - copied unchanged from r2536, branches/1.4/xpp/parport_debug.h
    trunk/xpp/utils/zapconf
      - copied unchanged from r2536, branches/1.4/xpp/utils/zapconf
    trunk/xpp/utils/zaptel_hardware
      - copied unchanged from r2536, branches/1.4/xpp/utils/zaptel_hardware
    trunk/xpp/utils/zconf/Zaptel/Hardware/
      - copied from r2536, branches/1.4/xpp/utils/zconf/Zaptel/Hardware/
    trunk/xpp/utils/zconf/Zaptel/Hardware.pm
      - copied unchanged from r2536, branches/1.4/xpp/utils/zconf/Zaptel/Hardware.pm
    trunk/xpp/utils/zconf/Zaptel/Hardware/PCI.pm
      - copied unchanged from r2536, branches/1.4/xpp/utils/zconf/Zaptel/Hardware/PCI.pm
    trunk/xpp/utils/zconf/Zaptel/Hardware/USB.pm
      - copied unchanged from r2536, branches/1.4/xpp/utils/zconf/Zaptel/Hardware/USB.pm
Modified:
    trunk/xpp/.version
    trunk/xpp/ChangeLog
    trunk/xpp/Makefile
    trunk/xpp/README.Astribank
    trunk/xpp/card_bri.c
    trunk/xpp/card_global.c
    trunk/xpp/firmwares/FPGA_1141.hex
    trunk/xpp/firmwares/FPGA_1151.hex
    trunk/xpp/firmwares/FPGA_FXS.hex
    trunk/xpp/init_card_6_26
    trunk/xpp/init_card_7_26
    trunk/xpp/utils/Makefile
    trunk/xpp/utils/genzaptelconf
    trunk/xpp/utils/lszaptel
    trunk/xpp/utils/xpp.rules
    trunk/xpp/utils/xpp_sync
    trunk/xpp/utils/zconf/Zaptel.pm
    trunk/xpp/utils/zconf/Zaptel/Chans.pm
    trunk/xpp/utils/zconf/Zaptel/Span.pm
    trunk/xpp/utils/zconf/Zaptel/Xpp.pm
    trunk/xpp/utils/zconf/Zaptel/Xpp/Xbus.pm
    trunk/xpp/utils/zconf/Zaptel/Xpp/Xpd.pm
    trunk/xpp/utils/zt_registration
    trunk/xpp/xbus-core.c
    trunk/xpp/xpd.h
    trunk/xpp/xpp_usb.c
    trunk/xpp/xpp_zap.c

Modified: trunk/xpp/.version
URL: http://svn.digium.com/view/zaptel/trunk/xpp/.version?view=diff&rev=2537&r1=2536&r2=2537
==============================================================================
--- trunk/xpp/.version (original)
+++ trunk/xpp/.version Thu May 17 17:55:21 2007
@@ -1,1 +1,1 @@
-trunk-r3814
+trunk-r3965

Modified: trunk/xpp/ChangeLog
URL: http://svn.digium.com/view/zaptel/trunk/xpp/ChangeLog?view=diff&rev=2537&r1=2536&r2=2537
==============================================================================
--- trunk/xpp/ChangeLog (original)
+++ trunk/xpp/ChangeLog Thu May 17 17:55:21 2007
@@ -1,3 +1,26 @@
+Tue May  1 2007 Oron Peled <oron at actcom.co.il> - xpp.r3898
+  * Tested with zaptel-1.2.17.1
+  * Add D-Channel TX, RX and BAD frames count in /proc/xpp/XBUS-*/XPD-*/bri_info
+  * Adjust output of xpp_sync script. Pad for 8 port BRI.
+  * Added a debugging module parport_debug (not compiled by default).
+  * Added an optional patch to zaptel:
+      - compiles only if ZAPTEL_SYNC_TICK is defined
+      - Allow interested driver to register for "sync" notification.
+      - Does not affect drivers that do not use this feature.
+  * Added external synchronization feature:
+      - Only if ZAPTEL_SYNC_TICK feature is compiled in
+      - Than XPP may be synchronized by another card (e.g: an Astribank
+        with FXS can be synchronized by a Digium PRI card).
+      - May be enabled/disabled in runtime via the 'sync_tick_active' module
+        parameter to the xpp.ko module.
+  * Fixed a potential bug in D-Channel hexdump printing.
+  * New visual indications in BRI leds:
+      - Constant ON RED/GREEN: Shows the port type -- NT/TE.
+      - Very fast "double blink": Layer1 work, no D-Channel yet. 
+      - Steady blinking (1/2 sec): D-Channel trafic detected. 
+  * xpp_fxloader moved to /usr/share/zaptel .
+  * adj_clock removed: never really used.
+
 Thu, 19 Apr 2007 Tzafrir Cohen <tzafrir.cohen at xorcom.com> - xpp.r3814
   * No need for extra patch beyond bristuff for Astribank BRI.
   * Protocol no. 2.6: syncing improvements.

Modified: trunk/xpp/Makefile
URL: http://svn.digium.com/view/zaptel/trunk/xpp/Makefile?view=diff&rev=2537&r1=2536&r2=2537
==============================================================================
--- trunk/xpp/Makefile (original)
+++ trunk/xpp/Makefile Thu May 17 17:55:21 2007
@@ -28,6 +28,11 @@
 xpd_fxo-y	+= card_fxo.o
 xpd_bri-y	+= card_bri.o
 
+ifeq	(y,$(PARPORT_DEBUG))
+EXTRA_CFLAGS	+= -DDEBUG_SYNC_PARPORT
+obj-m		+= parport_debug.o
+endif
+
 ctags:
 	ctags *.[ch]
 

Modified: trunk/xpp/README.Astribank
URL: http://svn.digium.com/view/zaptel/trunk/xpp/README.Astribank?view=diff&rev=2537&r1=2536&r2=2537
==============================================================================
--- trunk/xpp/README.Astribank (original)
+++ trunk/xpp/README.Astribank Thu May 17 17:55:21 2007
@@ -49,9 +49,9 @@
 The xpp_fxloader and xpp_fxloader.usermap should be copied to:
  /etc/hotplug/usb/
 
-Note that loading through udev is not yet provided. Run 
-
-  /etc/hotplug/usb/xpp_fxloader load
+Run:
+
+  /usr/share/zaptel/xpp_fxloader load
 
 to load firmware.
 
@@ -114,10 +114,10 @@
 
 Loading Firmware:
 """"""""""""""""
-Normally this is done using the script xpp_fxloader.If it works fine,
-you don't need to bother reading this section. 
+Normally this is done using the script /usr/share/zaptel/xpp_fxloader .
+If it works fine, you don't need to bother reading this section. 
 Once the firmware is loaded the USB ID of the Astribank changes to e4e4
-1132, and the driver can pick it up. You'll also see the top led lit.
+11x2, and the driver can pick it up. You'll also see the top led lit.
 
 First and foremost: the simplest and most useful tool to debug problems
 here is lsusb. The output of lsusb should show exactly if the device is
@@ -210,6 +210,15 @@
 Newer versions of the USB firmware can now be reset using 'fpga_load -r'.
 This will only work when the device is not used by the driver, so you may 
 need to 'rmmod xpp_usb' in order to reset the firmware.
+
+Also try:  
+
+  rmmod xpp_usb; /usr/share/zaptel/xpp_fxloader reset
+  # if asterisk was running: you may need to stop/restart it now. 
+  # if there are some "disconnected" spans in /proc/xpp/xbuses
+  # wait a while, until you see the 1152 IDs again, and then:
+  /etc/init.d/zaptel start
+  # and start/restrart asterisk.
 
 
 Loading The Modules:

Modified: trunk/xpp/card_bri.c
URL: http://svn.digium.com/view/zaptel/trunk/xpp/card_bri.c?view=diff&rev=2537&r1=2536&r2=2537
==============================================================================
--- trunk/xpp/card_bri.c (original)
+++ trunk/xpp/card_bri.c Thu May 17 17:55:21 2007
@@ -105,7 +105,7 @@
 
 #define HFC_L1_ACTIVATING	1
 #define HFC_L1_ACTIVATED	2
-#define	NT_T1_COUNT		25	/* number of 4ms interrupts for G2 timeout */
+#define	TIMER_T1_MAX		2500
 #define	HFC_TIMER_T3		8000	/* 8s activation timer T3 */
 #define	HFC_TIMER_T4		500	/* 500ms deactivation timer T4 */
 #define	HFC_TIMER_OFF		-1	/* timer disabled */
@@ -130,6 +130,7 @@
 } su_rd_sta_t;
 
 #define	REG30_LOST	3	/* in polls */
+#define	DCHAN_LOST	15000	/* in ticks */
 
 #define	BRI_DCHAN_SIGCAP	(			  \
 					ZT_SIG_EM	| \
@@ -163,18 +164,13 @@
 enum led_state {
 	BRI_LED_OFF		= 0x0,
 	BRI_LED_ON		= 0x1,
-	BRI_LED_BLINK_SLOW	= 0x2,	/* 1/2 a second blink cycle */
-	BRI_LED_BLINK_FAST	= 0x3	/* 1/4 a second blink cycle */
+	/*
+	 * We blink by software from driver, so that
+	 * if the driver malfunction that blink would stop.
+	 */
+	// BRI_LED_BLINK_SLOW	= 0x2,	/* 1/2 a second blink cycle */
+	// BRI_LED_BLINK_FAST	= 0x3	/* 1/4 a second blink cycle */
 };
-
-#define	LED_STATE_NAME(x)	[ BRI_ ## x ] = #x
-static const char *led_state_names[] = {
-	LED_STATE_NAME(LED_OFF),
-	LED_STATE_NAME(LED_ON),
-	LED_STATE_NAME(LED_BLINK_SLOW),
-	LED_STATE_NAME(LED_BLINK_FAST),
-};
-#undef	LED_STATE_NAME
 
 enum bri_led_names {
 	GREEN_LED	= 0,
@@ -183,6 +179,7 @@
 
 #define	NUM_LEDS	2
 #define	LED_TICKS	100
+
 
 struct bri_leds {
 	byte	state:2;
@@ -201,11 +198,13 @@
 	struct proc_dir_entry		*bri_info;
 	su_rd_sta_t			state_register;
 	bool				initialized;
+	int				t1; /* timer 1 for NT deactivation */
 	int				t3; /* timer 3 for activation */
 	int				t4; /* timer 4 for deactivation */
 	ulong				l1_flags;
 	bool				reg30_good;
 	uint				reg30_ticks;
+	bool				layer1_up;
 
 	/*
 	 * D-Chan: buffers + extra state info.
@@ -219,9 +218,14 @@
 	reg_cmd_t			last_reply;
 	uint				tick_counter;
 	uint				poll_counter;
-	uint				drop_counter;
+	uint				dchan_tx_counter;
+	uint				dchan_rx_counter;
+	uint				dchan_rx_drops;
+	bool				dchan_alive;
+	uint				dchan_alive_ticks;
+	uint				dchan_notx_ticks;
+	uint				dchan_norx_ticks;
 	enum led_state			ledstate[NUM_LEDS];
-	enum led_state			ledcontrol[NUM_LEDS];
 };
 
 xproto_table_t	PROTO_TABLE(BRI_NT);
@@ -240,19 +244,14 @@
 {
 	char	debug_buf[DEBUG_BUF_SIZE + 1];
 	int	i;
-	char	*p;
+	int	n = 0;
 	xbus_t	*xbus = xpd->xbus;
 
-	if (len >= DEBUG_BUF_SIZE) {
-		ERR("%s: dumped buffer too long. Length: %d, Maximum allowed: %d.\n",
-				__FUNCTION__, len, DEBUG_BUF_SIZE);
-		return;
-	}
-	p = debug_buf;
-	*p = '\0';
-	for(i=0; i<len; i++)
-		p += snprintf(p, DEBUG_BUF_SIZE - (p - debug_buf), "%02X ", buf[i]);
-	printk(KERN_DEBUG "%s/%s: %s[0..%d]: %s\n", xbus->busname, xpd->xpdname, msg, len-1, debug_buf);
+	debug_buf[0] = '\0';
+	for(i = 0; i < len && n < DEBUG_BUF_SIZE; i++)
+		n += snprintf(&debug_buf[n], DEBUG_BUF_SIZE - n, "%02X ", buf[i]);
+	DBG("%s/%s: %s[0..%d]: %s%s\n", xbus->busname, xpd->xpdname, msg,
+			len-1, debug_buf, (n >= DEBUG_BUF_SIZE)?"...":"");
 }
 
 static void dump_dchan_packet(xpd_t *xpd, bool transmit, byte *buf, int len)
@@ -288,6 +287,83 @@
 	}
 	dump_hex_buf(xpd, msgbuf, buf, len);
 }
+
+static void layer1_state(xpd_t *xpd, bool up)
+{
+	struct BRI_priv_data	*priv;
+
+	BUG_ON(!xpd);
+	priv = xpd->priv;
+	BUG_ON(!priv);
+	if(priv->layer1_up == up)
+		return;
+	priv->layer1_up = up;
+	DBG("%s/%s: STATE CHANGE: Layer1 %s\n", xpd->xbus->busname, xpd->xpdname,
+		(up)?"UP":"DOWN");
+}
+
+static void dchan_state(xpd_t *xpd, bool up)
+{
+	struct BRI_priv_data	*priv;
+
+	BUG_ON(!xpd);
+	priv = xpd->priv;
+	BUG_ON(!priv);
+	if(priv->dchan_alive == up)
+		return;
+	if(up) {
+		DBG("%s/%s: STATE CHANGE: D-Channel RUNNING\n",
+			xpd->xbus->busname, xpd->xpdname);
+		priv->dchan_alive = 1;
+	} else {
+		DBG("%s/%s: STATE CHANGE: D-Channel STOPPED\n",
+			xpd->xbus->busname, xpd->xpdname);
+		priv->dchan_rx_counter = priv->dchan_tx_counter = priv->dchan_rx_drops = 0;
+		priv->dchan_alive = 0;
+		priv->dchan_alive_ticks = 0;
+	}
+}
+
+static void xpd_activation(xpd_t *xpd, bool on)
+{
+	struct BRI_priv_data	*priv;
+	xbus_t			*xbus;
+
+	BUG_ON(!xpd);
+	priv = xpd->priv;
+	BUG_ON(!priv);
+	xbus = xpd->xbus;
+	DBG("%s/%s: %s\n", xbus->busname, xpd->xpdname, (on)?"ON":"OFF");
+	switch(xpd->type) {
+		case XPD_TYPE_BRI_TE:
+			if(on) {
+				DBG("%s/%s: HFC_L1_ACTIVATE_TE\n", xbus->busname, xpd->xpdname);
+				set_bit(HFC_L1_ACTIVATING, &priv->l1_flags);
+				write_state_register(xpd, STA_ACTIVATE);
+				priv->t3 = HFC_TIMER_T3;
+			} else {
+				DBG("%s/%s: HFC_L1_FORCE_DEACTIVATE_TE\n", xbus->busname, xpd->xpdname);
+				write_state_register(xpd, STA_DEACTIVATE);
+			}
+			break;
+		case XPD_TYPE_BRI_NT:
+			if(on) {
+				DBG("%s/%s: HFC_L1_ACTIVATE_NT\n", xbus->busname, xpd->xpdname);
+				priv->t1 = TIMER_T1_MAX;
+				set_bit(HFC_L1_ACTIVATING, &priv->l1_flags);
+				write_state_register(xpd, STA_ACTIVATE | V_SU_SET_G2_G3);
+			} else {
+				DBG("%s/%s: HFC_L1_DEACTIVATE_NT\n", xbus->busname, xpd->xpdname);
+				write_state_register(xpd, STA_DEACTIVATE);
+			}
+			break;
+		default:
+			ERR("%s: %s/%s: Bad xpd type %d\n", __FUNCTION__,
+					xbus->busname, xpd->xpdname, xpd->type);
+			BUG();
+	}
+}
+
 
 /*
  * D-Chan receive
@@ -371,6 +447,8 @@
 	 */
 	dchan->bytes2receive = idx - 1;
 	dchan->eofrx = 1;
+	priv->dchan_rx_counter++;
+	priv->dchan_norx_ticks = 0;
 drop:
 	priv->dchan_r_idx = 0;
 out:
@@ -441,7 +519,7 @@
 					DBG("%s/%s: T3 expired\n", xpd->xbus->busname, xpd->xpdname);
 				priv->t3 = HFC_TIMER_OFF;
 				clear_bit(HFC_L1_ACTIVATING, &priv->l1_flags);
-				CALL_XMETHOD(XPD_STATE, xpd->xbus, xpd, 0);	/* Deactivate TE */
+				xpd_activation(xpd, 0);		/* Deactivate TE */
 			}
 		}
 		if (priv->t4 > HFC_TIMER_OFF) {
@@ -470,7 +548,8 @@
 		return -EINVAL;
 	}
 	if(!test_bit(HFC_L1_ACTIVATED, &priv->l1_flags) && !test_bit(HFC_L1_ACTIVATING, &priv->l1_flags)) {
-		CALL_XMETHOD(XPD_STATE, xpd->xbus, xpd, 1);	/* Kick transmitter */
+		DBG("%s/%s: Kick D-Channel transmiter\n", xpd->xbus->busname, xpd->xpdname);
+		xpd_activation(xpd, 1);
 		return 0;
 	}
 	if(print_dbg)
@@ -483,6 +562,8 @@
 	if(ret < 0)
 		NOTICE("%s/%s: %s: failed sending xframe\n",
 				__FUNCTION__, xpd->xbus->busname, xpd->xpdname);
+	priv->dchan_tx_counter++;
+	priv->dchan_notx_ticks = 0;
 	return ret;
 }
 
@@ -552,6 +633,7 @@
 	priv->regfile->read_proc = proc_xpd_register_read;
 	priv->regfile->data = xpd;
 #endif
+	priv->t1 = HFC_TIMER_OFF;
 	ret = run_initialize_registers(xpd);
 	if(ret < 0)
 		goto err;
@@ -562,9 +644,6 @@
 	CALL_PROTO(GLOBAL, SYNC_SOURCE, xbus, NULL, SYNC_MODE_HOST, 0);
 	DBG("done: %s/%s\n", xbus->busname, xpd->xpdname);
 	priv->initialized = 1;
-	CALL_PROTO(BRI, SET_LED, xbus, xpd, GREEN_LED, BRI_LED_ON);
-	CALL_PROTO(BRI, SET_LED, xbus, xpd, RED_LED, BRI_LED_ON);
-	msleep(10);
 	return 0;
 err:
 	clean_proc(xbus, xpd);
@@ -644,9 +723,6 @@
 	priv = xpd->priv;
 	BUG_ON(!xbus);
 	DBG("%s/%s: %s\n", xbus->busname, xpd->xpdname, (on)?"on":"off");
-	msleep(10);
-	CALL_PROTO(BRI, SET_LED, xbus, xpd, GREEN_LED, BRI_LED_OFF);
-	CALL_PROTO(BRI, SET_LED, xbus, xpd, RED_LED, BRI_LED_OFF);
 	return(0);
 }
 
@@ -654,6 +730,79 @@
 {
 	DBG("%s/%s/%d: %s\n", xbus->busname, xpd->xpdname, pos, txsig2str(txsig));
 	return 0;
+}
+
+/*
+ * LED managment is done by the driver now:
+ *   - Turn constant ON RED/GREEN led to indicate NT/TE port
+ *   - Very fast "Double Blink" to indicate Layer1 alive (without D-Channel)
+ *   - Constant blink (1/2 sec cycle) to indicate D-Channel alive.
+ */
+static void handle_leds(xbus_t *xbus, xpd_t *xpd)
+{
+	struct BRI_priv_data	*priv;
+	unsigned int		timer_count;
+	int			which_led;
+	int			other_led;
+	enum led_state		ledstate;
+	int			mod;
+
+	BUG_ON(!xpd);
+	if(xpd->type == XPD_TYPE_BRI_TE) {
+		which_led = GREEN_LED;
+		other_led = RED_LED;
+	} else {
+		which_led = RED_LED;
+		other_led = GREEN_LED;
+	}
+	priv = xpd->priv;
+	BUG_ON(!priv);
+	ledstate = priv->ledstate[which_led];
+	timer_count = xpd->timer_count;
+	if((timer_count % DEFAULT_LED_PERIOD) == 0) {
+		if(xpd->blink_mode) {
+			// led state is toggled
+				if(ledstate == BRI_LED_OFF) {
+					CALL_PROTO(BRI, SET_LED, xbus, xpd, which_led, BRI_LED_ON);
+					CALL_PROTO(BRI, SET_LED, xbus, xpd, other_led, BRI_LED_ON);
+				} else {
+					CALL_PROTO(BRI, SET_LED, xbus, xpd, which_led, BRI_LED_OFF);
+					CALL_PROTO(BRI, SET_LED, xbus, xpd, other_led, BRI_LED_OFF);
+				}
+			return;
+		} else if(priv->ledstate[other_led] == BRI_LED_ON)	/* cleanup after blink */
+			CALL_PROTO(BRI, SET_LED, xbus, xpd, other_led, BRI_LED_OFF);
+	}
+	if(priv->dchan_alive) {
+		mod = timer_count % 1000;
+		switch(mod) {
+			case 0:
+				if(ledstate == BRI_LED_OFF)
+					CALL_PROTO(BRI, SET_LED, xbus, xpd, which_led, BRI_LED_ON);
+				break;
+			case 500:
+				if(ledstate == BRI_LED_ON)
+					CALL_PROTO(BRI, SET_LED, xbus, xpd, which_led, BRI_LED_OFF);
+				break;
+		}
+	} else if(priv->layer1_up) {
+		mod = timer_count % 1000;
+		switch(mod) {
+			case 0:
+			case 100:
+				if(ledstate == BRI_LED_OFF)
+					CALL_PROTO(BRI, SET_LED, xbus, xpd, which_led, BRI_LED_ON);
+				break;
+			case 50:
+			case 150:
+				if(ledstate == BRI_LED_ON)
+					CALL_PROTO(BRI, SET_LED, xbus, xpd, which_led, BRI_LED_OFF);
+				break;
+		}
+	} else {
+		if(priv->ledstate[which_led] != BRI_LED_ON)
+			CALL_PROTO(BRI, SET_LED, xbus, xpd, which_led, BRI_LED_ON);
+	}
 }
 
 /* Poll the register ST/Up-State-machine Register, to see if the cable
@@ -673,29 +822,49 @@
 		priv->poll_counter++;
 		CALL_PROTO(BRI, REGISTER_REQUEST, xbus, xpd, 0, 0, 0, A_SU_RD_STA, 0, 0, 0);
 	}
-	if((priv->tick_counter % LED_TICKS) == 0) {
-		int	i;
-
-		if(priv->reg30_good && priv->reg30_ticks > poll_interval * REG30_LOST) {
-			/* No reply for 1/2 a second */
-			ERR("%s/%s: Lost state tracking for %d ticks\n",
-					xbus->busname, xpd->xpdname, priv->reg30_ticks);
-			priv->reg30_good = 0;
-		}
-		if(!priv->reg30_good) {
-			priv->ledcontrol[RED_LED] = BRI_LED_OFF;
-			priv->ledcontrol[GREEN_LED] = BRI_LED_OFF;
-		}
-		for(i = 0; i < NUM_LEDS; i++) {
-			if(xpd->blink_mode) {
-				CALL_PROTO(BRI, SET_LED, xbus, xpd, i, BRI_LED_BLINK_FAST);
-			} else if(priv->ledstate[i] != priv->ledcontrol[i]) {
-				CALL_PROTO(BRI, SET_LED, xbus, xpd, i,
-						priv->ledcontrol[i]);
+	/* Detect D-Channel disconnect heuristic */
+	priv->dchan_notx_ticks++;
+	priv->dchan_norx_ticks++;
+	priv->dchan_alive_ticks++;
+	if(priv->dchan_alive && (priv->dchan_notx_ticks > DCHAN_LOST || priv->dchan_norx_ticks > DCHAN_LOST)) {
+		/*
+		 * No tx_dchan() or rx_dchan() for many ticks
+		 * This D-Channel is probabelly dead.
+		 */
+		dchan_state(xpd, 0);
+	} else if(priv->dchan_rx_counter > 1 &&  priv->dchan_tx_counter > 1) {
+		if(!priv->dchan_alive)
+			dchan_state(xpd, 1);
+	}
+	/* Detect Layer1 disconnect */
+	if(priv->reg30_good && priv->reg30_ticks > poll_interval * REG30_LOST) {
+		/* No reply for 1/2 a second */
+		ERR("%s/%s: Lost state tracking for %d ticks\n",
+				xbus->busname, xpd->xpdname, priv->reg30_ticks);
+		priv->reg30_good = 0;
+		layer1_state(xpd, 0);
+		dchan_state(xpd, 0);
+	}
+	handle_leds(xbus, xpd);
+	tx_dchan(xpd);
+#if	0
+	/*
+		Currently not used -- do we want to shut down NT if it wasn't
+		responding? For how long?
+	*/
+
+	/* Detect T1 timer expiry on NT */
+	if(xpd->type == XPD_TYPE_BRI_NT) {
+		if (priv->t1 > HFC_TIMER_OFF) {
+			if (--priv->t1 == 0) {
+				DBG("%s/%s: T1 Expired. Kick NT\n", xbus->busname, xpd->xpdname);
+				priv->t1 = HFC_TIMER_OFF;
+				clear_bit(HFC_L1_ACTIVATING, &priv->l1_flags);
+				write_state_register(xpd, STA_DEACTIVATE);
 			}
 		}
 	}
-	tx_dchan(xpd);
+#endif
 	priv->tick_counter++;
 	priv->reg30_ticks++;
 	return 0;
@@ -723,7 +892,7 @@
 	BUG_ON(!priv);
 	DBG("%s/%s: STARTUP\n", xpd->xbus->busname, xpd->xpdname);
 	write_state_register(xpd, 0);	/* Enable L1 state machine */
-	CALL_XMETHOD(XPD_STATE, xpd->xbus, xpd, 1);
+	xpd_activation(xpd, 1);
 	if(SPAN_REGISTERED(xpd)) {
 		dchan = &xpd->span.chans[2];
 		xpd->span.flags |= ZT_FLAG_RUNNING;
@@ -748,7 +917,7 @@
 	BUG_ON(!priv);
 	DBG("%s/%s: SHUTDOWN\n", xpd->xbus->busname, xpd->xpdname);
 	if(xpd->type == XPD_TYPE_BRI_NT)
-		CALL_XMETHOD(XPD_STATE, xpd->xbus, xpd, 0);
+		xpd_activation(xpd, 0);
 	return 0;
 }
 
@@ -788,39 +957,9 @@
 
 /* 0x0F */ HOSTCMD(BRI, XPD_STATE, bool on)
 {
-	struct BRI_priv_data	*priv;
-
 	BUG_ON(!xpd);
-	priv = xpd->priv;
-	BUG_ON(!priv);
 	DBG("%s/%s: %s\n", xbus->busname, xpd->xpdname, (on)?"ON":"OFF");
-	switch(xpd->type) {
-		case XPD_TYPE_BRI_TE:
-			if(on) {
-				DBG("%s/%s: HFC_L1_ACTIVATE_TE\n", xbus->busname, xpd->xpdname);
-				set_bit(HFC_L1_ACTIVATING, &priv->l1_flags);
-				write_state_register(xpd, STA_ACTIVATE);
-				priv->t3 = HFC_TIMER_T3;
-			} else {
-				DBG("%s/%s: HFC_L1_FORCE_DEACTIVATE_TE\n", xbus->busname, xpd->xpdname);
-				write_state_register(xpd, STA_DEACTIVATE);
-			}
-			break;
-		case XPD_TYPE_BRI_NT:
-			if(on) {
-				DBG("%s/%s: HFC_L1_ACTIVATE_NT\n", xbus->busname, xpd->xpdname);
-				set_bit(HFC_L1_ACTIVATING, &priv->l1_flags);
-				write_state_register(xpd, STA_ACTIVATE | V_SU_SET_G2_G3);
-			} else {
-				DBG("%s/%s: HFC_L1_DEACTIVATE_NT\n", xbus->busname, xpd->xpdname);
-				write_state_register(xpd, STA_DEACTIVATE);
-			}
-			break;
-		default:
-			ERR("%s: %s/%s: Bad xpd type %d\n", __FUNCTION__,
-					xbus->busname, xpd->xpdname, xpd->type);
-			return -EINVAL;
-	}
+	xpd_activation(xpd, on);
 	return 0;
 }
 
@@ -849,11 +988,6 @@
 	priv = xpd->priv;
 	BUG_ON(!priv);
 	XFRAME_NEW(xframe, pack, xbus, BRI, SET_LED, xpd->id);
-#if 1
-	DBG("%s/%s: %s %s (%d)\n", xbus->busname, xpd->xpdname,
-			(red_led)?"RED":"GREEN",
-			led_state_names[to_led_state], to_led_state);
-#endif
 	bri_leds = &RPACKET_FIELD(pack, BRI, SET_LED, bri_leds);
 	bri_leds->state = to_led_state;
 	bri_leds->led_sel = which_led;
@@ -880,28 +1014,39 @@
 	return ret;
 }
 
-
 /*---------------- BRI: Astribank Reply Handlers --------------------------*/
 static void su_new_state(xpd_t *xpd, byte reg_x30)
 {
 	xbus_t			*xbus;
 	struct BRI_priv_data	*priv;
 	su_rd_sta_t		new_state;
-	int			which_led = (xpd->type == XPD_TYPE_BRI_TE) ? GREEN_LED : RED_LED;
 
 	BUG_ON(!xpd);
 	priv = xpd->priv;
 	BUG_ON(!priv);
 	xbus = xpd->xbus;
+	if(!priv->initialized) {
+		ERR("%s/%s: %s called on uninitialized AB\n",
+			xbus->busname, xpd->xpdname, __FUNCTION__);
+		return;
+	}
 	new_state.reg = reg_x30;
 	priv->reg30_ticks = 0;
 	priv->reg30_good = 1;
 	if((xpd->type == XPD_TYPE_BRI_TE && new_state.bits.v_su_sta == ST_TE_ACTIVATED) ||
 		(xpd->type == XPD_TYPE_BRI_NT && new_state.bits.v_su_sta == ST_NT_ACTIVATED)) {
-		priv->ledcontrol[which_led] = (new_state.bits.v_su_fr_sync) ? BRI_LED_BLINK_SLOW : BRI_LED_BLINK_FAST;
-		update_xpd_status(xpd, ZT_ALARM_NONE);
+		if(!priv->layer1_up) {
+			layer1_state(xpd, 1);
+			update_xpd_status(xpd, ZT_ALARM_NONE);
+		}
 	} else {
-		priv->ledcontrol[which_led] = BRI_LED_OFF;
+		/*
+		 * Layer 1 disconnected
+		 */
+		if(priv->layer1_up) {
+			layer1_state(xpd, 0);
+			dchan_state(xpd, 0);
+		}
 		/*
 		 * Do NOT notify Zaptel about the disconnection.
 		 * If we do, Asterisk stops transmitting on the D-channel and
@@ -917,7 +1062,7 @@
 	if (priv->state_register.bits.v_su_sta == new_state.bits.v_su_sta)
 		return;	/* same same */
 	DBG("%02X ---> %02X\n", priv->state_register.reg, reg_x30);
-	DBG("%s/%s: %s%i\n", xpd->xbus->busname, xpd->xpdname,
+	DBG("%s/%s: %s%i\n", xbus->busname, xpd->xpdname,
 				(xpd->type == XPD_TYPE_BRI_NT)?"G":"F",
 				new_state.bits.v_su_sta);
 
@@ -965,18 +1110,21 @@
 			case ST_NT_DEACTIVATED:		/* G1 */
 				DBG("%s/%s: State ST_NT_DEACTIVATED (G1)\n", xbus->busname, xpd->xpdname);
 				clear_bit(HFC_L1_ACTIVATED, &priv->l1_flags);
+				priv->t1 = HFC_TIMER_OFF;
 				break;
 			case ST_NT_ACTIVATING:		/* G2 */
 				DBG("%s/%s: State ST_NT_ACTIVATING (G2)\n", xbus->busname, xpd->xpdname);
-				write_state_register(xpd, V_SU_SET_G2_G3);	/* Enable transition to G3 */
+				xpd_activation(xpd, 1);
 				break;
 			case ST_NT_ACTIVATED:		/* G3 */
 				DBG("%s/%s: State ST_NT_ACTIVATED (G3)\n", xbus->busname, xpd->xpdname);
 				clear_bit(HFC_L1_ACTIVATING, &priv->l1_flags);
 				set_bit(HFC_L1_ACTIVATED, &priv->l1_flags);
+				priv->t1 = HFC_TIMER_OFF;
 				break;
 			case ST_NT_DEACTIVTING:		/* G4 */
 				DBG("%s/%s: State ST_NT_DEACTIVTING (G4)\n", xbus->busname, xpd->xpdname);
+				priv->t1 = HFC_TIMER_OFF;
 				break;
 			default:
 				NOTICE("%s/%s: Bad NT state: %d\n", xbus->busname, xpd->xpdname, new_state.bits.v_su_sta);
@@ -1021,7 +1169,7 @@
 #endif
 		ret = rx_dchan(xpd, info);
 		if (ret < 0) {
-			priv->drop_counter++;
+			priv->dchan_rx_drops++;
 			if(atomic_read(&xpd->open_counter) > 0)
 				NOTICE("%s/%s: Multibyte Drop: errno=%d\n", xbus->busname, xpd->xpdname, ret);
 		} 
@@ -1129,8 +1277,9 @@
 	spin_lock_irqsave(&xpd->lock, flags);
 	priv = xpd->priv;
 	BUG_ON(!priv);
-	len += sprintf(page + len, "%05d Layer 1 State: ", priv->poll_counter);
+	len += sprintf(page + len, "%05d Layer 1: ", priv->poll_counter);
 	if(priv->reg30_good) {
+		len += sprintf(page + len, "%-5s ", (priv->layer1_up) ? "UP" : "DOWN");
 		len += sprintf(page + len, "%c%d %-15s -- fr_sync=%d t2_exp=%d info0=%d g2_g3=%d\n",
 					(xpd->type == XPD_TYPE_BRI_NT)?'G':'F',
 					priv->state_register.bits.v_su_sta,
@@ -1141,14 +1290,20 @@
 					priv->state_register.bits.v_g2_g3);
 	} else
 		len += sprintf(page + len, "Unkown\n");
+	if(xpd->type == XPD_TYPE_BRI_NT)
+		len += sprintf(page + len, "T1 Timer: %d\n", priv->t1);
 	len += sprintf(page + len, "Tick Counter: %d\n", priv->tick_counter);
 	len += sprintf(page + len, "Last Poll Reply: %d ticks ago\n", priv->reg30_ticks);
 	len += sprintf(page + len, "reg30_good=%d\n", priv->reg30_good);
-	len += sprintf(page + len, "Drop Counter: %d\n", priv->drop_counter);
+	len += sprintf(page + len, "D-Channel: TX=[%5d]    RX=[%5d]    BAD=[%5d] (%s)\n\n",
+			priv->dchan_tx_counter, priv->dchan_rx_counter, priv->dchan_rx_drops,
+			(priv->dchan_alive) ? "alive" : "dead");
+	len += sprintf(page + len, "dchan_alive_ticks: %d\n", priv->dchan_alive_ticks);
+	len += sprintf(page + len, "dchan_notx_ticks: %d\n", priv->dchan_notx_ticks);
+	len += sprintf(page + len, "dchan_norx_ticks: %d\n", priv->dchan_norx_ticks);
 	for(led = 0; led < NUM_LEDS; led++) {
 		len += sprintf(page + len, "LED #%d\n", led);
 		len += sprintf(page + len, "\tledstate  : %d\n", priv->ledstate[led]);
-		len += sprintf(page + len, "\tledcontrol: %d\n", priv->ledcontrol[led]);
 	}
 	len += sprintf(page + len, "\nDCHAN:\n");
 	len += sprintf(page + len, "\n");

Modified: trunk/xpp/card_global.c
URL: http://svn.digium.com/view/zaptel/trunk/xpp/card_global.c?view=diff&rev=2537&r1=2536&r2=2537
==============================================================================
--- trunk/xpp/card_global.c (original)
+++ trunk/xpp/card_global.c Thu May 17 17:55:21 2007
@@ -20,13 +20,14 @@
  *
  */
 
+#include <linux/module.h>
 #include "xdefs.h"
 #include "xpd.h"
 #include "xpp_zap.h"
 #include "xproto.h"
 #include "zap_debug.h"
 #include "xbus-core.h"
-#include <linux/module.h>
+#include "parport_debug.h"
 
 static const char rcsid[] = "$Id$";
 
@@ -125,8 +126,8 @@
 	int		unit;
 	int		subunit;
 	struct timeval	now;
-	long		sec_diff;
-	long		usec_diff;
+	unsigned long	sec_diff;
+	unsigned long	usec_diff;
 
 	BUG_ON(!xbus);
 	do_gettimeofday(&now);
@@ -196,6 +197,7 @@
 		if (!IS_BRI(tmp_xpd))	/* only BRI has subunits */
 			break;
 	}
+	flip_parport_bit(2);
 	/*
 	 * Firmware marks the sync packets.
 	 * This is out of the loop, so we don't send multiple times
@@ -220,6 +222,7 @@
 	DBG("%s/%s: mode=0x%X drift=%d\n", xpd->xbus->busname, xpd->xpdname,
 			mode, drift);
 	dump_packet("SYNC_REPLY", pack, 1);
+	xbus->sync_adjustment = (signed char)drift;
 	return 0;
 }
 

Modified: trunk/xpp/firmwares/FPGA_1141.hex
URL: http://svn.digium.com/view/zaptel/trunk/xpp/firmwares/FPGA_1141.hex?view=diff&rev=2537&r1=2536&r2=2537
==============================================================================
--- trunk/xpp/firmwares/FPGA_1141.hex (original)
+++ trunk/xpp/firmwares/FPGA_1141.hex Thu May 17 17:55:21 2007
@@ -1,8 +1,8 @@
 #
-# $Id: FPGA_1141.hex 3810 2007-04-19 14:28:05Z dima $
+# $Id: FPGA_1141.hex 3929 2007-05-03 09:31:49Z dima $
 #
 :020000040000FA
-:80000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AD6FF4000882D0A006AD6FF4000882D0A006AD6FF4000882D0A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4455544455557475577775577675577775577765566665563625523235D2E37C2B511115511115511115511191
+:80000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AD6FF400098440A006AD6FF400098440A006AD6FF400098440A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4455544455557475577775577675577775577765566665563625523235D2E37C2B51111551111551111551111C
 :80008000155111155111155111155111155111155111155111155111155111155111155111155111155111155111155111155111000000000000000000000000000000000000002552222552222552220025522225522200000000001AA1111AA1110025522200001AA1111AA111001AA11100001AA1111AA11100001AA1111AA1111AA113
 :80010000110000002552222552222F21F112122F21F112122552222552222552222552220000001AA111255222255222255222255222255222255222255222255222255222255222000000002F21F112122F21F1121200002552222552221AA1111AA1112552222F21F1121200001AA1112F21F1121200002F21F112122F21F112121AA100
 :800180001100255222255222000000000025522200001AA1111AA11125522200255222000025522200000000AFA4F44A4A155111000000000000000000000000001AA1111AA1110000000000000000000000000000255222000000002552222552220000255222255222255222255222255222255222255222255222255222002552220011
@@ -10,649 +10,655 @@
 :800280006DFDD6D66F6DFDD6D66F6DFDD6D600000000002F21F112122F21F112120000004F4CFCC4C46F6DFDD6D62F21F112128AA8882F21F11212004F44F444446F65F556562F21F1121200006F65F556567F7CFCC7C79F95F55959006F65F556566F65F55656000000008F8CFCC8C8AFACFCCACA255222000000CFCCFCCCCCCFCCFCCC87
 :80030000CC008F8CFCC8C825522200CFCCFCCCCCCFCCFCCCCC000000CFCCFCCCCCCFCCFCCCCCCFCCFCCCCC00000000CFCCFCCCCCCFCCFCCCCC000000008F84F44848AFA4F44A4A255222CFCCFCCCCC0000CFC4F44C4CEFE4F44E4E2552220000EFE4F44E4EEFE4F44E4EEFE4F44E4E00000000CFC8F88C8CCFC8F88C8C000000008F8CFC45
 :80038000C8C8AFACFCCACA255222CFC8F88C8C0000CFCCFCCCCCEFECFCCECE2552220000EFECFCCECEEFECFCCECEEFECFCCECE00000000CFC8F88C8CCFC8F88C8C000000008F8CFCC8C8AFACFCCACA255222CFC8F88C8C0000CFCCFCCCCCEFECFCCECE2552220000EFECFCCECEEFECFCCECEEFECFCCECE00000000CFC8F88C8CCFCBFBBC02
-:80040000BC3AA3330000008F8CFCC8C8AFADFDDADA2F21F11212CFC8F88C8C3AA33300CFCCFCCCCCEFEDFDDEDE2F21F112120000BFB2F22B2BAFABFBBABA00EFEDFDDEDEEFEDFDDEDEEFEDFDDEDE000000008AA888BAABBB3AA333000000CFCCFCCCCCEFECFCCECE2552228AA8883AA33300CFCCFCCCCCEFECFCCECE2552220000EFECFC75
-:80048000CECEEFECFCCECEEFECFCCECE000000004AA4441F14F44141155111000000CFCCFCCCCCFFFFFFFFFF3F33F333334AA44415511100CFCCFCCCCCFFFFFFFFFF3F33F333330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000008F84F448489F95F559591F11F11111000000CFCCFCCCCCFFFEFEEFEF3F32F223238F84F448481F1177
-:80050000F1111100CFCCFCCCCCFFFEFEEFEF3F32F223230000FFFEFEEFEFFFFEFEEFEFFFFEFEEFEF00000000CFC4F44C4CFFF4F44F4F3553330000008F8CFCC8C8BFBFFFFBFB3F33F33333CFC4F44C4C35533300CFCCFCCCCCFFFFFFFFFF3F33F333330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004554444F42F224242AA2220092
-:8005800000008F8CFCC8C8BFBFFFFBFB3F33F333334554442AA22200CFCCFCCCCCFFFFFFFFFF3F33F33333003F35F553537F74F447470000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004AA4446AA6662AA222000000CFCCFCCCCCFFFFFFFFFF3F33F333334AA4442AA22200CFCCFCCCCCFFFFFFFFFF3F33F333330000FFFFFFFFFFFF47
-:80060000FFFFFFFFFFFFFFFFFF00000000CFC4F44C4CCFC6F66C6C2AA2220000008F8CFCC8C8BFBFFFFBFB3F33F33333CFC4F44C4C2AA22200CFCCFCCCCCFFFFFFFFFF3F33F333330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004F48F884846F68F886862552220000008F8CFCC8C8BFBFFFFBFB3F33F333334F48F884842552221B
-:80068000008F8CFCC8C8BFBFFFFBFB3F33F333330000BFBFFFFBFBBFBFFFFBFBBFBFFFFBFB000000004F48F884846F68F88686255222000000CFCCFCCCCCFFFFFFFFFF3F33F333334F48F8848425522200CFCCFCCCCCFFFFFFFFFF3F33F333330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004F48F884846F68F8868625522200009B
-:8007000000CFCCFCCCCCFFFFFFFFFF3F33F333334F48F8848425522200CFCCFCCCCCFFFFFFFFFF3F33F33333EAAEEE7F75F55757000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004F44F444447F75F557573F31F11313000000CFC8F88C8CDFDBFBBDBD1F13F331314F44F444443F31F1131300CFC8F88C8CDFDBFBBDBD1F13F33105
-:80078000310000DFDBFBBDBDDFDBFBBDBDDFDBFBBDBD000000004F44F444445F55F555551F11F111110000008F8CFCC8C88F8FFFF8F83AA3334F44F444441F11F11111008F8CFCC8C88F8FFFF8F83AA33300008F8FFFF8F88F8FFFF8F88F8FFFF8F8000000004F44F444445F57F775751F13F33131000000CFCCFCCCCCDFDEFEEDED1F1273
-:80080000F221214F44F444441F13F3313100CFCCFCCCCCDFDEFEEDED1F12F221210000DFDEFEEDEDDFDEFEEDEDDFDEFEEDED000000004F44F444445F57F775751F13F33131000000CFCCFCCCCCDFDFFFFDFD1F13F331314F44F444441F13F3313100CFCCFCCCCCDFDFFFFDFD1F13F331310000DFDFFFFDFDDFDFFFFDFDDFDFFFFDFD000004
-:80088000000000000000000000000000000000008F81F11818B55BBB000080010000000000000000000000000000000000000000000000000000D0510F480000000000000000000000000000400100000000000000000000000000708F0D0000000000000000000000000000000000000000000000000000000000F04FFE800400180000DD
-:800900000000000000000000000040010000000000000000000000000070C1060000000000000000000000000000000000000000000000000000000000F04FFE8002004001008004148002800414800200008002800400002148000000480000108204000021AFEB05000000000000000000000000000000000000000000000000000000BE
-:800980000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F4818002800000000210000002100140010024001000040012800284081880288008088028002F0D37C0000481800000012000000000000002001000014000000000000000000000000F0C89F8084410128004840818102214860A7
-:800A0000118002211A01148002211A041400B01281041480028004148828108204808802214800CF550648180028000000002100000021001400100240010000400128000014882800008088020000CFE40B0000000000000000000000000000000000000000000000000000000000F04FFE0000000000000000000000001400800100006E
-:800A8000000014800200000000008088020000FF7308000022000000002100004002000040020012000000000000108188020000000000B03D0D0000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000BF
-:800B0000000000002001000000000000000082000000000000F034B300000000000000000000000000000000000000110000000000000020020000E90D000000000000240000000000110010020000000000000000000000000000001EAC00000000000000000000000000000000000000002800001420020000000000F097810000200239
-:800B8000000000000000400200000000800100000000000000000000820000006F5C0A00000000000000000000000010010000000000000080020082000000008004F0584F0000001002008001000000420000001012020000001400A021100100000000000000227EC2000000000000120000002004000000250200000040010022800228
-:800C00000000000000004200EFEA090000400200000000000000000014000000000000001240010082000000000080F2FEBC000000000012800100120000000000901100002001000000000000000000000022F0FBA6000011001200000000000000000000000000000000000000000000000000003FFE0400002800000000000000000053
-:800C8000000000122200000000880000880020040020220400F0AE1320020020040000008812480000000000420000210000808222210400000021242022080000F0CB7780020000000000800800000000000000002100008002984200800800210080080000F013C700002082040000008081040000000020048081020000002800000084
-:800D0000008044022880820400F0939B20020000220000000048280020040000000080012200000000000000008200000000DFBB070022800120040000000000460111000048140048200442000000802402804821484101004A08884288FF7C0A2280020020040000000000484001000014004280040000000000008280081400A0480027
-:800D8000001F8F040000122002000000808402102104000048000012202204000000422200400111880000208824B88B0C42225222000060122C8232112248288001208142011A04484200802202224848120042800480048008800882210048F046AA2022040000004800A042009023140082001222002828001826C111800422000082FD
-:800E00000046812802824200882400487F9208008001202281828101002021043A0800200C301128421200002001111C210200008200484800210000002F7C0B20023800221280A61220014812241B129220A12814C820C251202402A012303152001C2322044882802C842884048220180280047FBC032A041800002032112428144820D9
-:800E800022041C02000042002A848201222002001C010000001001822068240082008074DC048004220012802402008082062014011C021842488024A4424A422104224800000000001001004200C84280084FD30E00222022036800001400802202002044011248008021842284140100240000404242224442024E822C440200883FA5CA
-:800F000008000000800400280048000000112800146012808102001081040000004A08008008888008822180B41B062A04002280860118142081011C21840114004242581248800400A0214840210148C041804442034041830842000080F86977000000420028808102800118000000130400801121045200200100808484044288820006
-:800F80000000480080F44C540018008001002002002248481142002820024200201401260128000000000000A04848420082884A084A085ECA1001320060150000121280042200284A021280012200288006488014010000242410C24215022124242054238004F0F73580060020048001002001112084012A0400402162122001112002DB
-:801000000000000000202404884288000040015F7C0520C241281422222A611238200128A012C0110012482302182888420000141200A0411448004834C800C02114C04224000021E06B03200180A21319A3621C041901004A3141480015A1421CA4141F1284E417248482A4751C93412AA2624A021D41004E42A044484E432F28148198AD
-:8010800081113988082C2414A18848148AF874A9A04648122826A124524AA12238281A2381012A21C651208232212A04421981262245A142281A2481D4110412110011004A084652222D814651222F2428C4C2231412C24148CBEC9021282E212280A44212183220C211122AE61186B311A254A01428284A0120F2414120226414424A21EC
-:80110000222481010020140227242964144A64284AA4482338828EC24A048A28F4BD23102112011308112213011301122041214121C121601440011C021C824101800100180011211121118819848844820400002004F0351C146AE417E31153111B261F17F231211F1292211551111B331E11184AF441416E411F15541115F151311F1608
-:80118000F431311F12F241411F16F641611F14B421F761616AA22220541115011D11154152311F1454313F24D433F8C3413BC846F1C1C33F1C9E422CF482C229AC888AA88CCAEC2CFC9E2A1415E114E41353111B2A3AA6671F17B62122A1221B331E31A0641F15F461611F144451113E3335E111F123314E411F1CEC14F441C11F16F641F6
-:80120000411F14B461A6661B541415A14415511124244A54313F247482F2828235B3A34AF383A325D222F482C22F24FCC2C22F28B882A8884E422BCFF061413AB731B321E21622A4231B333E313AA3331B331E31184AF571717A7751E115F521215E313F16E613F321311CF461E14E211F16A2777AA7246E217AA3351F1252111F11D511A6
-:80128000011F1414C242313486B2429441CEA3CEC32F1C8CE42CFCC2C28EC248482B44CAACCC1DE1146AA6621B331B222E211AF631611B473E313AF231311B331681A1561F13E617F751115AF521217AF763613E321F12A6441F16AE261F1EB671F651514AE416A6774A45D111F411511F11011F1414F241433146D322F8C3433F3CBC43E1
-:80130000E63CFCE2C32F2CFCC2C22F28FCC2C22F24B442BC42A4CCCE427F7D0414200222402121022240010028120000422004004A82A12420A41200000048244824480000002448A0480042F0CEEF001200008006802101124280014200220080240410018002422041014200000000111C08428008200886713102481B21B01122B41177
-:80138000326219B24291612B941B212B94112B94222F1429F242B1222D912AC4912E421CE82264112E429E212E4296C1529AC2421B292CB49142B29162141B2927141B28271419F2428119F24281112B84222B84222B842229A842882E422F4A0E2AA4411CA4211419B642A1212F14A1612F1499212BA413B1422BF342913AF44291F0429C
-:80140000A12B422D812E521CC8D25EA12662192E5286C1439E212CB591C2421B692CA52946A32946A12827148A7242A3684E2319E624A84A882AF44282224A382229E822F462EE008200000000200100000000100200880000400100800400000000800200000010023F830D000000280000202484240200260100002800A0428082220477
-:80148000428012012001288828118200008822008048F19D3E14148A2282A84160141242185A2221011818521C0480E41421012890211113433141988083411141810113844421C84146014213C8828280042022C421F0BC8314A02C80A81420860120016280A1121A04002CC4111212203A2190214E211113084A818134418001A04114F1
-:8015000082C60114AA8488880880022C822402D7F740012200400142126212184842001904130248002800111220A41228224001261101190420026601104102A048000088E0E10B00144081448104004001002088218821210490410052002A045800820018482228A04880040000000000485DF42006120000202268124A210129813673

[... 4720 lines stripped ...]


More information about the zaptel-commits mailing list