[zaptel-commits] tzafrir: branch 1.4 r2536 - in /branches/1.4/xpp:
./ firmwares/ utils/ utils/...
zaptel-commits at lists.digium.com
zaptel-commits at lists.digium.com
Thu May 17 14:47:42 MST 2007
Author: tzafrir
Date: Thu May 17 16:47:40 2007
New Revision: 2536
URL: http://svn.digium.com/view/zaptel?view=rev&rev=2536
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:
branches/1.4/xpp/parport_debug.c
- copied unchanged from r2529, branches/1.2/xpp/parport_debug.c
branches/1.4/xpp/parport_debug.h
- copied unchanged from r2529, branches/1.2/xpp/parport_debug.h
branches/1.4/xpp/utils/zapconf
- copied unchanged from r2529, branches/1.2/xpp/utils/zapconf
branches/1.4/xpp/utils/zaptel_hardware
- copied unchanged from r2529, branches/1.2/xpp/utils/zaptel_hardware
branches/1.4/xpp/utils/zconf/Zaptel/Hardware/
- copied from r2529, branches/1.2/xpp/utils/zconf/Zaptel/Hardware/
branches/1.4/xpp/utils/zconf/Zaptel/Hardware.pm
- copied unchanged from r2529, branches/1.2/xpp/utils/zconf/Zaptel/Hardware.pm
branches/1.4/xpp/utils/zconf/Zaptel/Hardware/PCI.pm
- copied unchanged from r2529, branches/1.2/xpp/utils/zconf/Zaptel/Hardware/PCI.pm
branches/1.4/xpp/utils/zconf/Zaptel/Hardware/USB.pm
- copied unchanged from r2529, branches/1.2/xpp/utils/zconf/Zaptel/Hardware/USB.pm
Modified:
branches/1.4/xpp/.version
branches/1.4/xpp/ChangeLog
branches/1.4/xpp/Makefile
branches/1.4/xpp/README.Astribank
branches/1.4/xpp/card_bri.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/init_card_6_26
branches/1.4/xpp/init_card_7_26
branches/1.4/xpp/utils/Makefile
branches/1.4/xpp/utils/genzaptelconf
branches/1.4/xpp/utils/lszaptel
branches/1.4/xpp/utils/xpp.rules
branches/1.4/xpp/utils/xpp_sync
branches/1.4/xpp/utils/zconf/Zaptel.pm
branches/1.4/xpp/utils/zconf/Zaptel/Chans.pm
branches/1.4/xpp/utils/zconf/Zaptel/Span.pm
branches/1.4/xpp/utils/zconf/Zaptel/Xpp.pm
branches/1.4/xpp/utils/zconf/Zaptel/Xpp/Xbus.pm
branches/1.4/xpp/utils/zconf/Zaptel/Xpp/Xpd.pm
branches/1.4/xpp/utils/zt_registration
branches/1.4/xpp/xbus-core.c
branches/1.4/xpp/xpd.h
branches/1.4/xpp/xpp_usb.c
branches/1.4/xpp/xpp_zap.c
Modified: branches/1.4/xpp/.version
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/.version?view=diff&rev=2536&r1=2535&r2=2536
==============================================================================
--- branches/1.4/xpp/.version (original)
+++ branches/1.4/xpp/.version Thu May 17 16:47:40 2007
@@ -1,1 +1,1 @@
-trunk-r3814
+trunk-r3965
Modified: branches/1.4/xpp/ChangeLog
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/ChangeLog?view=diff&rev=2536&r1=2535&r2=2536
==============================================================================
--- branches/1.4/xpp/ChangeLog (original)
+++ branches/1.4/xpp/ChangeLog Thu May 17 16:47:40 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: branches/1.4/xpp/Makefile
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/Makefile?view=diff&rev=2536&r1=2535&r2=2536
==============================================================================
--- branches/1.4/xpp/Makefile (original)
+++ branches/1.4/xpp/Makefile Thu May 17 16:47:40 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: branches/1.4/xpp/README.Astribank
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/README.Astribank?view=diff&rev=2536&r1=2535&r2=2536
==============================================================================
--- branches/1.4/xpp/README.Astribank (original)
+++ branches/1.4/xpp/README.Astribank Thu May 17 16:47:40 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: branches/1.4/xpp/card_bri.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/card_bri.c?view=diff&rev=2536&r1=2535&r2=2536
==============================================================================
--- branches/1.4/xpp/card_bri.c (original)
+++ branches/1.4/xpp/card_bri.c Thu May 17 16:47:40 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: branches/1.4/xpp/card_global.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/xpp/card_global.c?view=diff&rev=2536&r1=2535&r2=2536
==============================================================================
--- branches/1.4/xpp/card_global.c (original)
+++ branches/1.4/xpp/card_global.c Thu May 17 16:47:40 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: 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=2536&r1=2535&r2=2536
==============================================================================
--- branches/1.4/xpp/firmwares/FPGA_1141.hex (original)
+++ branches/1.4/xpp/firmwares/FPGA_1141.hex Thu May 17 16:47:40 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
[... 4720 lines stripped ...]
More information about the zaptel-commits
mailing list