[zaptel-commits] tzafrir: branch 1.4 r4463 - in /branches/1.4/kernel/xpp: ./ firmwares/
SVN commits to the Zaptel project
zaptel-commits at lists.digium.com
Thu Aug 7 05:15:39 CDT 2008
Author: tzafrir
Date: Thu Aug 7 05:15:39 2008
New Revision: 4463
URL: http://svn.digium.com/view/zaptel?view=rev&rev=4463
Log:
xpp: preliminary CAS support.
Uses newer firmware (5975) for the 1151 alone.
Modified:
branches/1.4/kernel/xpp/card_pri.c
branches/1.4/kernel/xpp/firmwares/FPGA_1151.hex
branches/1.4/kernel/xpp/xbus-core.c
Modified: branches/1.4/kernel/xpp/card_pri.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/kernel/xpp/card_pri.c?view=diff&rev=4463&r1=4462&r2=4463
==============================================================================
--- branches/1.4/kernel/xpp/card_pri.c (original)
+++ branches/1.4/kernel/xpp/card_pri.c Thu Aug 7 05:15:39 2008
@@ -53,7 +53,7 @@
ZT_SIG_DACS | \
ZT_SIG_SF \
)
-#define PRI_BCHAN_SIGCAP (ZT_SIG_CLEAR | ZT_SIG_DACS)
+#define PRI_BCHAN_SIGCAP (ZT_SIG_CLEAR | ZT_SIG_DACS | ZT_SIG_CAS)
#define MAX_SLAVES 4 /* we have MUX of 4 clocks */
#define PRI_PORT(xpd) ((xpd)->addr.subunit)
@@ -66,6 +66,7 @@
static int proc_pri_info_write(struct file *file, const char __user *buffer, unsigned long count, void *data);
static int pri_startup(struct zt_span *span);
static int pri_shutdown(struct zt_span *span);
+static int pri_rbsbits(struct zt_chan *chan, int bits);
static int pri_lineconfig(xpd_t *xpd, int lineconfig);
#define PROC_REGISTER_FNAME "slics"
@@ -128,7 +129,6 @@
[PRI_PROTO_E1] =
/* coding */
ZT_CONFIG_CCS |
- // CAS |
ZT_CONFIG_CRC4 |
/* framing */
ZT_CONFIG_AMI | ZT_CONFIG_HDB3,
@@ -195,6 +195,9 @@
*/
#define REG_LIM0_LL BIT(1) /* LL (Local Loopback) */
+#define REG_IMR0_E 0x14 /* Interrupt Mask Register 0 */
+#define REG_IMR0_E_CASC BIT(3)
+
#define REG_FMR0 0x1C
#define REG_FMR0_E_RC0 BIT(4) /* Receive Code - LSB */
#define REG_FMR0_E_RC1 BIT(5) /* Receive Code - MSB */
@@ -205,7 +208,7 @@
#define REG_FMR1_XAIS BIT(0) /* Transmit AIS toward transmit end */
#define REG_FMR1_SSD0 BIT(1)
#define REG_FMR1_ECM BIT(2)
-#define REG_FMR1_XFS BIT(3)
+#define REG_FMR1_XFS BIT(3) /* Transmit Framing Select */
#define REG_FMR1_PMOD BIT(4) /* E1 = 0, T1/J1 = 1 */
#define REG_FMR1_EDL BIT(5)
#define REG_FMR1_AFR BIT(6)
@@ -222,8 +225,28 @@
#define REG_FMR2_T_MCSP BIT(6) /* Multiple Candidates Synchronization Procedure */
#define REG_FMR2_T_AFRS BIT(7) /* Automatic Force Resynchronization */
+#define REG_FMR3 0x31
+#define REG_FMR3_EXTIW BIT(0) /* Extended CRC4 to Non-CRC4 Interworking */
+
#define REG_FMR4 0x20
+#define REG_FMR4_FM0 BIT(0)
#define REG_FMR4_FM1 BIT(1)
+#define REG_FMR4_AUTO BIT(2)
+#define REG_FMR4_SSC0 BIT(3)
+#define REG_FMR4_SSC1 BIT(4)
+#define REG_FMR4_XRA BIT(5) /* Transmit Remote Alarm (Yellow Alarm) */
+#define REG_FMR4_TM BIT(6)
+#define REG_FMR4_AIS3 BIT(7)
+
+#define REG_XSW_E 0x20
+#define REG_XSW_E_XY4 BIT(0)
+#define REG_XSW_E_XY3 BIT(1)
+#define REG_XSW_E_XY2 BIT(2)
+#define REG_XSW_E_XY1 BIT(3)
+#define REG_XSW_E_XY0 BIT(4)
+#define REG_XSW_E_XRA BIT(5) /* Transmit Remote Alarm (Yellow Alarm) */
+#define REG_XSW_E_XTM BIT(6)
+#define REG_XSW_E_XSIS BIT(7)
#define REG_XSP_E 0x21
#define REG_FMR5_T 0x21
@@ -231,7 +254,7 @@
#define REG_FMR5_T_XTM BIT(2) /* Transmit Transparent Mode */
#define REG_XSP_E_AXS BIT(3) /* Automatic Transmission of Submultiframe Status */
#define REG_XSP_E_EBP BIT(4) /* E-Bit Polarity, Si-bit position of every outgoing CRC multiframe */
-#define REG_XSP_E_CASEN BIT(7) /* Channel Associated Signaling Enable */
+#define REG_XSP_E_CASEN BIT(6) /* CAS: Channel Associated Signaling Enable */
#define REG_RC0 0x24
#define REG_RC0_SJR BIT(7) /* T1 = 0, J1 = 1 */
@@ -240,6 +263,25 @@
#define REG_CMR1_DRSS (BIT(7) | BIT(6))
#define REG_CMR1_RS (BIT(5) | BIT(4))
#define REG_CMR1_STF BIT(2)
+
+#define REG_RS1_E 0x70 /* Receive CAS Register 1 */
+#define REG_RS2_E 0x71 /* Receive CAS Register 2 */
+#define REG_RS3_E 0x72 /* Receive CAS Register 3 */
+#define REG_RS4_E 0x73 /* Receive CAS Register 4 */
+#define REG_RS5_E 0x74 /* Receive CAS Register 5 */
+#define REG_RS6_E 0x75 /* Receive CAS Register 6 */
+#define REG_RS7_E 0x76 /* Receive CAS Register 7 */
+#define REG_RS8_E 0x77 /* Receive CAS Register 8 */
+#define REG_RS9_E 0x78 /* Receive CAS Register 9 */
+#define REG_RS10_E 0x79 /* Receive CAS Register 10 */
+#define REG_RS11_E 0x7A /* Receive CAS Register 11 */
+#define REG_RS12_E 0x7B /* Receive CAS Register 12 */
+#define REG_RS13_E 0x7C /* Receive CAS Register 13 */
+#define REG_RS14_E 0x7D /* Receive CAS Register 14 */
+#define REG_RS15_E 0x7E /* Receive CAS Register 15 */
+#define REG_RS16_E 0x7F /* Receive CAS Register 16 */
+
+#define NUM_CAS_RS (REG_RS16_E - REG_RS2_E + 1)
struct PRI_priv_data {
bool is_nt;
@@ -249,6 +291,10 @@
int deflaw;
unsigned int dchan_num;
bool initialized;
+ bool is_cas;
+ byte cas_rs_e[NUM_CAS_RS];
+ byte cas_ts_e[NUM_CAS_RS];
+ uint cas_replies;
bool local_loopback;
uint poll_noreplies;
uint layer1_replies;
@@ -391,6 +437,22 @@
return 1;
}
+static void pri_pcm_update(xpd_t *xpd)
+{
+ struct PRI_priv_data *priv;
+ int channels = xpd->channels;
+ xpp_line_t mask = BITMASK(xpd->channels);
+
+ priv = xpd->priv;
+ if(priv->is_cas) {
+ /* CAS: Don't send PCM to D-Channel */
+ channels--;
+ mask &= ~BIT(PRI_DCHAN_IDX(priv));
+ }
+ xpd->pcm_len = RPACKET_HEADERSIZE + sizeof(xpp_line_t) + channels * ZT_CHUNKSIZE;
+ xpd->wanted_pcm_mask = mask;
+}
+
/*
* Set E1/T1/J1
* May only be called on unregistered xpd's
@@ -401,12 +463,7 @@
struct PRI_priv_data *priv;
int deflaw;
unsigned int dchan_num;
- byte fmr1 =
- REG_FMR1_AFR |
- REG_FMR1_XFS |
- REG_FMR1_ECM;
int default_lineconfig = 0;
- byte rc0 = 0; /* FIXME: PCM offsets */
int ret;
BUG_ON(!xpd);
@@ -415,6 +472,16 @@
XPD_NOTICE(xpd, "Registered as span %d. Cannot do setup pri protocol (%s)\n",
xpd->span.spanno, __FUNCTION__);
return -EBUSY;
+ }
+ if(priv->pri_protocol != PRI_PROTO_0) {
+ if(priv->pri_protocol == set_proto) {
+ XPD_NOTICE(xpd, "Already in protocol %s. Ignored\n", pri_protocol_name(set_proto));
+ return 0;
+ } else {
+ XPD_INFO(xpd, "Switching from %s to %s\n",
+ pri_protocol_name(priv->pri_protocol),
+ pri_protocol_name(set_proto));
+ }
}
switch(set_proto) {
case PRI_PROTO_E1:
@@ -426,7 +493,6 @@
deflaw = ZT_LAW_MULAW;
dchan_num = 24;
default_lineconfig = ZT_CONFIG_ESF | ZT_CONFIG_B8ZS;
- fmr1 |= REG_FMR1_PMOD;
break;
case PRI_PROTO_J1:
/*
@@ -434,8 +500,6 @@
*/
deflaw = ZT_LAW_MULAW;
dchan_num = 24;
- fmr1 |= REG_FMR1_PMOD;
- rc0 |= REG_RC0_SJR;
default_lineconfig = 0; /* FIXME: J1??? */
XPD_NOTICE(xpd, "J1 is not supported yet\n");
return -ENOSYS;
@@ -446,10 +510,10 @@
}
priv->pri_protocol = set_proto;
xpd->channels = pri_num_channels(set_proto);
- xpd->pcm_len = RPACKET_HEADERSIZE + sizeof(xpp_line_t) + xpd->channels * ZT_CHUNKSIZE;
- xpd->wanted_pcm_mask = BITMASK(xpd->channels);
+ pri_pcm_update(xpd);
priv->deflaw = deflaw;
priv->dchan_num = dchan_num;
+ priv->local_loopback = 0;
xpd->type_name = type_name(priv->pri_protocol, priv->is_nt);
XPD_DBG(GENERAL, xpd, "%s, channels=%d, dchan_num=%d, deflaw=%d\n",
pri_protocol_name(set_proto),
@@ -457,11 +521,6 @@
priv->dchan_num,
priv->deflaw
);
- write_subunit(xpd, REG_FMR1, fmr1);
-#ifdef JAPANEZE_SUPPORT
- if(rc0)
- write_subunit(xpd, REG_RC0, rc0);
-#endif
/*
* Must set default now, so layer1 polling (Register REG_FRS0) would
* give reliable results.
@@ -566,6 +625,29 @@
put_xbus(xbus);
}
+static void set_reg_lim0(const char *msg, xpd_t *xpd)
+{
+ struct PRI_priv_data *priv;
+ bool is_master_mode;
+ bool localloop;
+ byte lim0 = 0;
+
+ BUG_ON(!xpd);
+ priv = xpd->priv;
+ BUG_ON(!priv);
+ is_master_mode = xpd->timing_priority == 0;
+ localloop = priv->local_loopback;
+ lim0 |= (localloop) ? REG_LIM0_LL : 0;
+ if(is_master_mode)
+ lim0 |= REG_LIM0_MAS;
+ else
+ lim0 &= ~REG_LIM0_MAS;
+ XPD_DBG(SIGNAL, xpd, "%s(%s): %s, %s\n", __FUNCTION__, msg,
+ (is_master_mode) ? "MASTER" : "SLAVE",
+ (localloop) ? "LOCALLOOP" : "NO_LOCALLOOP");
+ write_subunit(xpd, REG_LIM0 , lim0);
+}
+
/*
* Normally set by the timing parameter in zaptel.conf
* If this is called by ztcfg, than it's too late to change
@@ -578,28 +660,11 @@
static int set_master_mode(const char *msg, xpd_t *xpd)
{
struct PRI_priv_data *priv;
- byte lim0 = 0;
- byte xsp = 0;
- bool is_master_mode = xpd->timing_priority == 0;
-
- BUG_ON(!xpd);
- priv = xpd->priv;
- lim0 |= (priv->local_loopback) ? REG_LIM0_LL : 0;
- if(is_master_mode)
- lim0 |= REG_LIM0_MAS;
- else
- lim0 &= ~REG_LIM0_MAS;
- if(priv->pri_protocol == PRI_PROTO_E1)
- {
- lim0 &= ~REG_LIM0_RTRS; /* Receive termination: Integrated resistor is switched off (100 Ohm, no internal 300 Ohm) */;
- xsp |= REG_XSP_E_EBP | REG_XSP_E_AXS | REG_XSP_E_XSIF;
- } else if(priv->pri_protocol == PRI_PROTO_T1) {
- lim0 |= REG_LIM0_RTRS; /* Receive termination: Integrated resistor is switched on (100 Ohm || 300 Ohm = 75 Ohm) */
- xsp |= REG_FMR5_T_XTM;
- }
- XPD_DBG(SIGNAL, xpd, "%s(%s): %s\n", __FUNCTION__, msg, (is_master_mode) ? "MASTER" : "SLAVE");
- write_subunit(xpd, REG_LIM0 , lim0);
- write_subunit(xpd, REG_XSP_E, xsp);
+
+ BUG_ON(!xpd);
+ XPD_DBG(SIGNAL, xpd, "\n");
+ priv = xpd->priv;
+ set_reg_lim0(__FUNCTION__, xpd);
set_clocking(xpd);
return 0;
}
@@ -607,18 +672,20 @@
static int set_nt(const char *msg, xpd_t *xpd, bool is_nt)
{
struct PRI_priv_data *priv;
-
- BUG_ON(!xpd);
- priv = xpd->priv;
+ const char *tname;
+
+ BUG_ON(!xpd);
+ priv = xpd->priv;
+ tname = type_name(priv->pri_protocol, is_nt);
+ XPD_DBG(SIGNAL, xpd, "%s(%s): %s %s\n", __FUNCTION__, msg, tname, (is_nt) ? "NT" : "TE");
if(SPAN_REGISTERED(xpd)) {
XPD_NOTICE(xpd, "Registered as span %d. Cannot do %s(%s)\n",
xpd->span.spanno, __FUNCTION__, msg);
return -EBUSY;
}
priv->is_nt = is_nt;
- xpd->type_name = type_name(priv->pri_protocol, is_nt);
+ xpd->type_name = tname;
xpd->direction = (is_nt) ? TO_PHONE : TO_PSTN;
- XPD_DBG(SIGNAL, xpd, "%s(%s): %s %s\n", __FUNCTION__, msg, xpd->type_name, (is_nt) ? "NT" : "TE");
if(xpd->timing_priority == 0 && !is_nt) /* by default set timing priority from NT/TE */
xpd->timing_priority = 1;
set_master_mode(msg, xpd);
@@ -628,33 +695,17 @@
static int set_localloop(const char *msg, xpd_t *xpd, bool localloop)
{
struct PRI_priv_data *priv;
- byte lim0 = 0;
- byte xsp = 0;
-
- BUG_ON(!xpd);
- priv = xpd->priv;
+
+ BUG_ON(!xpd);
+ priv = xpd->priv;
+ XPD_DBG(SIGNAL, xpd, "(%s): %s\n", msg, (localloop)?"YES":"NO");
if(SPAN_REGISTERED(xpd)) {
XPD_NOTICE(xpd, "Registered as span %d. Cannot do %s(%s)\n",
xpd->span.spanno, __FUNCTION__, msg);
return -EBUSY;
}
- lim0 |= (localloop) ? REG_LIM0_LL : 0;
- if(priv->is_nt)
- lim0 |= REG_LIM0_MAS;
- else
- lim0 &= ~REG_LIM0_MAS;
- if(priv->pri_protocol == PRI_PROTO_E1)
- {
- lim0 |= REG_LIM0_RTRS; /* Receive termination: Integrated resistor is switched on (100 Ohm || 300 Ohm = 75 Ohm) */
- xsp |= REG_XSP_E_EBP | REG_XSP_E_AXS | REG_XSP_E_XSIF;
- } else if(priv->pri_protocol == PRI_PROTO_T1) {
- lim0 &= ~REG_LIM0_RTRS ; /* Receive termination: Integrated resistor is switched off (100 Ohm, no internal 300 Ohm) */;
- xsp |= REG_FMR5_T_XTM;
- }
priv->local_loopback = localloop;
- XPD_DBG(SIGNAL, xpd, "%s(%s): %s\n", __FUNCTION__, msg, (localloop) ? "LOCALLOOP" : "NO");
- write_subunit(xpd, REG_LIM0 , lim0);
- write_subunit(xpd, REG_XSP_E, xsp);
+ set_reg_lim0(__FUNCTION__, xpd);
return 0;
}
@@ -681,9 +732,18 @@
const char *framingstr = "";
const char *codingstr = "";
const char *crcstr = "";
- byte fmr0 = 0; /* Dummy initilizations to */
- byte fmr2 = 0; /* silense false gcc warnings */
- byte fmr4 = 0; /* Dummy initilizations to */
+#ifdef JAPANEZE_SUPPORT
+ byte rc0 = 0; /* FIXME: PCM offsets */
+#endif
+ byte fmr0 = 0;
+ byte fmr1 =
+ REG_FMR1_AFR |
+ REG_FMR1_ECM;
+ byte fmr2 = 0;
+ byte fmr3 = 0; /* write only for CRC4 */
+ byte fmr4 = 0;
+ byte imr0 = 0;
+ byte xsp;
unsigned int bad_bits;
int i;
@@ -722,10 +782,14 @@
if(priv->pri_protocol == PRI_PROTO_E1) {
fmr2 = REG_FMR2_E_AXRA | REG_FMR2_E_ALMF; /* 0x03 */
fmr4 = 0x9F; /* E1.XSW: All spare bits = 1*/
+ xsp |= REG_XSP_E_EBP | REG_XSP_E_AXS | REG_XSP_E_XSIF;
} else if(priv->pri_protocol == PRI_PROTO_T1) {
+ fmr1 |= REG_FMR1_PMOD;
fmr2 = REG_FMR2_T_SSP | REG_FMR2_T_AXRA; /* 0x22 */
fmr4 = 0x0C;
+ xsp |= REG_FMR5_T_XTM;
} else if(priv->pri_protocol == PRI_PROTO_J1) {
+ fmr1 |= REG_FMR1_PMOD;
fmr4 = 0x1C;
XPD_ERR(xpd, "J1 unsupported yet\n");
return -ENOSYS;
@@ -742,36 +806,65 @@
} else if (lineconfig & ZT_CONFIG_HDB3) {
framingstr = "HDB3";
fmr0 = REG_FMR0_E_XC1 | REG_FMR0_E_XC0 | REG_FMR0_E_RC1 | REG_FMR0_E_RC0;
+ } else {
+ XPD_NOTICE(xpd, "Bad lineconfig. Not (B8ZS|AMI|HDB3). Ignored.\n");
+ return -EINVAL;
}
/* then coding */
if (lineconfig & ZT_CONFIG_ESF) {
codingstr = "ESF";
+ priv->is_cas = 0;
fmr4 |= REG_FMR4_FM1;
fmr2 |= REG_FMR2_T_AXRA | REG_FMR2_T_MCSP | REG_FMR2_T_SSP;
} else if (lineconfig & ZT_CONFIG_D4) {
codingstr = "D4";
+ priv->is_cas = 0;
} else if (lineconfig & ZT_CONFIG_CCS) {
codingstr = "CCS";
+ priv->is_cas = 0;
/* do nothing */
- }
+ } else { /* CAS */
+ codingstr = "CAS";
+ imr0 |= REG_IMR0_E_CASC;
+ xsp |= REG_XSP_E_CASEN;
+ priv->is_cas = 1;
+ }
+ pri_pcm_update(xpd);
/* E1's can enable CRC checking */
if (lineconfig & ZT_CONFIG_CRC4) {
crcstr = "CRC4";
+ fmr1 |= REG_FMR1_XFS;
fmr2 |= REG_FMR2_E_RFS1;
+ fmr3 |= REG_FMR3_EXTIW;
}
XPD_DBG(GENERAL, xpd, "[%s] lineconfig=%s/%s/%s %s (0x%X)\n",
(priv->is_nt)?"NT":"TE",
framingstr, codingstr, crcstr,
(lineconfig & ZT_CONFIG_NOTOPEN)?"YELLOW":"",
lineconfig);
- if(fmr0 != 0) {
- XPD_DBG(GENERAL, xpd, "%s: fmr0(0x%02X) = 0x%02X\n", __FUNCTION__, REG_FMR0, fmr0);
- write_subunit(xpd, REG_FMR0, fmr0);
- }
+ set_reg_lim0(__FUNCTION__, xpd);
+ XPD_DBG(GENERAL, xpd, "%s: fmr1(0x%02X) = 0x%02X\n", __FUNCTION__, REG_FMR1, fmr1);
+ write_subunit(xpd, REG_FMR1, fmr1);
+ XPD_DBG(GENERAL, xpd, "%s: fmr2(0x%02X) = 0x%02X\n", __FUNCTION__, REG_FMR2, fmr2);
+ write_subunit(xpd, REG_FMR2, fmr2);
+ XPD_DBG(GENERAL, xpd, "%s: fmr0(0x%02X) = 0x%02X\n", __FUNCTION__, REG_FMR0, fmr0);
+ write_subunit(xpd, REG_FMR0, fmr0);
XPD_DBG(GENERAL, xpd, "%s: fmr4(0x%02X) = 0x%02X\n", __FUNCTION__, REG_FMR4, fmr4);
write_subunit(xpd, REG_FMR4, fmr4);
- XPD_DBG(GENERAL, xpd, "%s: fmr2(0x%02X) = 0x%02X\n", __FUNCTION__, REG_FMR2, fmr2);
- write_subunit(xpd, REG_FMR2, fmr2);
+ XPD_DBG(GENERAL, xpd, "%s: xsp(0x%02X) = 0x%02X\n", __FUNCTION__, REG_XSP_E, xsp);
+ write_subunit(xpd, REG_XSP_E, xsp);
+ if(fmr3) {
+ XPD_DBG(GENERAL, xpd, "%s: fmr3(0x%02X) = 0x%02X\n", __FUNCTION__, REG_FMR3, fmr3);
+ write_subunit(xpd, REG_FMR3, fmr3);
+ }
+#ifdef JAPANEZE_SUPPORT
+ if(rc0) {
+ XPD_DBG(GENERAL, xpd, "%s: rc0(0x%02X) = 0x%02X\n", __FUNCTION__, REG_RC0, rc0);
+ write_subunit(xpd, REG_RC0, rc0);
+ }
+#endif
+ XPD_DBG(GENERAL, xpd, "%s: imr0(0x%02X) = 0x%02X\n", __FUNCTION__, REG_IMR0_E, imr0);
+ write_subunit(xpd, REG_IMR0_E, imr0);
return 0;
bad_lineconfig:
XPD_ERR(xpd, "Bad lineconfig. Abort\n");
@@ -830,7 +923,6 @@
xpd_t *xpd = NULL;
struct PRI_priv_data *priv;
int channels = min(31, CHANNELS_PERXPD); /* worst case */
- int ret = 0;
XBUS_DBG(GENERAL, xbus, "\n");
xpd = xpd_alloc(sizeof(struct PRI_priv_data), proto_table, channels);
@@ -845,10 +937,6 @@
goto err;
if(pri_proc_create(xbus, xpd) < 0)
goto err;
- /* Assume E1, changes later from user space */
- ret = set_pri_proto(xpd, PRI_PROTO_E1);
- if(ret < 0)
- goto err;
return xpd;
err:
xpd_free(xpd);
@@ -866,6 +954,15 @@
xpd->type = XPD_TYPE_PRI;
proto_table = &PROTO_TABLE(PRI);
priv = xpd->priv;
+ if(priv->pri_protocol == PRI_PROTO_0) {
+ /*
+ * init_card_* script didn't set pri protocol
+ * Let's have a default E1
+ */
+ ret = set_pri_proto(xpd, PRI_PROTO_E1);
+ if(ret < 0)
+ goto err;
+ }
/*
* initialization script should have set correct
* operating modes.
@@ -932,7 +1029,7 @@
xpd->type_name, xbus->num, xpd->addr.unit, xpd->addr.subunit, i);
cur_chan->chanpos = i + 1;
cur_chan->pvt = xpd;
- if(is_dchan) { /* D-CHAN */
+ if(is_dchan && !priv->is_cas) { /* D-CHAN */
cur_chan->sigcap = PRI_DCHAN_SIGCAP;
//FIXME: cur_chan->flags |= ZT_FLAG_PRIDCHAN;
cur_chan->flags &= ~ZT_FLAG_HDLC;
@@ -944,6 +1041,7 @@
xpd->span.chanconfig = pri_chanconfig;
xpd->span.startup = pri_startup;
xpd->span.shutdown = pri_shutdown;
+ xpd->span.rbsbits = pri_rbsbits;
return 0;
}
@@ -1162,6 +1260,57 @@
XPD_DBG(GENERAL, xpd, "SHUTDOWN\n");
// Turn off all channels
CALL_XMETHOD(XPD_STATE, xpd->xbus, xpd, 0);
+ return 0;
+}
+
+static int pri_rbsbits(struct zt_chan *chan, int bits)
+{
+ xpd_t *xpd;
+ struct PRI_priv_data *priv;
+ int pos;
+ byte val;
+ int reg_pos;
+ int regnum;
+ unsigned long flags;
+
+
+ xpd = chan->pvt;
+ BUG_ON(!xpd);
+ pos = chan->chanpos - 1;
+ priv = xpd->priv;
+ BUG_ON(!priv);
+ if(!priv->layer1_up) {
+ XPD_DBG(SIGNAL, xpd, "RBS: TX: No layer1. Ignore.\n");
+ return 0;
+ }
+ if(priv->pri_protocol != PRI_PROTO_E1) {
+ XPD_NOTICE(xpd, "%s: protocol %s is not supported yet with CAS\n",
+ __FUNCTION__, pri_protocol_name(priv->pri_protocol));
+ return 0;
+ }
+ if(pos == 15)
+ return 0; /* Don't write dchan in CAS */
+ if(pos < 0 || pos > 31) {
+ XPD_NOTICE(xpd, "%s: pos=%d out of range. Ignore\n", __FUNCTION__, pos);
+ return 0;
+ }
+ spin_lock_irqsave(&xpd->lock, flags);
+ if(pos >= 16) {
+ /* Low nibble */
+ reg_pos = pos - 16;
+ val = (priv->cas_ts_e[reg_pos] & 0xF0) | (bits & 0x0F);
+ } else {
+ /* High nibble */
+ reg_pos = pos;
+ val = (priv->cas_ts_e[reg_pos] & 0x0F) | ((bits << 4) & 0xF0);
+ }
+ regnum = REG_RS2_E + reg_pos;
+ priv->cas_ts_e[reg_pos] = val;
+ priv->dchan_tx_counter++;
+ spin_unlock_irqrestore(&xpd->lock, flags);
+ LINE_DBG(SIGNAL, xpd, pos, "RBS: TX: bits=0x%X (reg=0x%X val=0x%02X)\n",
+ bits, regnum, val);
+ pri_write_reg(xpd, regnum, val);
return 0;
}
@@ -1216,6 +1365,8 @@
priv->dchan_tx_counter++;
} else if(chans[i].writechunk[0] == 0xFF)
dchan_state(xpd, 0);
+ else
+ chans[i].writechunk[0] = 0xFF; /* Clobber for next tick */
}
#ifdef DEBUG_PCMTX
if(pcmtx >= 0 && pcmtx_chan == i)
@@ -1223,9 +1374,8 @@
else
#endif
memcpy((u_char *)pcm, chans[i].writechunk, ZT_CHUNKSIZE);
- // fill_beep((u_char *)pcm, xpd->addr.subunit, 2);
} else
- memset((u_char *)pcm, 0x7F, ZT_CHUNKSIZE);
+ memset((u_char *)pcm, ZT_XLAW(0, (&chans[i])), ZT_CHUNKSIZE);
pcm += ZT_CHUNKSIZE;
}
physical_chan++;
@@ -1276,7 +1426,7 @@
if((i % 4) == 0)
continue;
}
- if(logical_chan == PRI_DCHAN_IDX(priv)) {
+ if(logical_chan == PRI_DCHAN_IDX(priv) && !priv->is_cas) {
if(priv->dchan_rx_sample != pcm[0]) {
if(debug & DBG_PCM) {
XPD_INFO(xpd, "RX-D-Chan: prev=0x%X now=0x%X\n",
@@ -1381,17 +1531,59 @@
XPD_DBG(REGS, xpd, "subunit=%d data_low=0x%02X\n", xpd->addr.subunit, data_low);
}
+static void process_cas_dchan(xpd_t *xpd, byte regnum, byte data_low)
+{
+ struct PRI_priv_data *priv;
+ uint pos = regnum - REG_RS2_E;
+ int rsnum = pos + 2;
+ int chan1 = pos;
+ int chan2 = pos + 16;
+
+ priv = xpd->priv;
+ if(!priv->is_cas)
+ return;
+ if(pos < 0 || pos >= NUM_CAS_RS) {
+ XPD_ERR(xpd, "%s: got bad pos=%d [0-%d]\n", __FUNCTION__, pos, NUM_CAS_RS);
+ return;
+ }
+ priv->cas_replies++;
+ if(priv->cas_rs_e[pos] != data_low) {
+ int old1 = (priv->cas_rs_e[pos] >> 4) & 0xF;
+ int old2 = priv->cas_rs_e[pos] & 0xF;
+ int new1 = (data_low >> 4) & 0xF;
+ int new2 = data_low & 0xF;
+
+ XPD_DBG(SIGNAL, xpd, "RBS: RX: RS%02d (channel %2d, channel %2d): 0x%02X -> 0x%02X\n",
+ rsnum, chan1+1, chan2+1, priv->cas_rs_e[pos], data_low);
+ if(SPAN_REGISTERED(xpd)) {
+ if(old1 != new1)
+ zt_rbsbits(&xpd->span.chans[chan1], new1);
+ if(old2 != new2)
+ zt_rbsbits(&xpd->span.chans[chan2], new2);
+ }
+ priv->dchan_rx_counter++;
+ priv->cas_rs_e[pos] = data_low;
+ } else {
+ XPD_DBG(SIGNAL, xpd, "RBS: RX: RS%02d (channel %2d, channel %2d): REPEAT 0x%02X\n",
+ rsnum, chan1+1, chan2+1, priv->cas_rs_e[pos]);
+ }
+}
+
static int PRI_card_register_reply(xbus_t *xbus, xpd_t *xpd, reg_cmd_t *info)
{
unsigned long flags;
struct PRI_priv_data *priv;
struct xpd_addr addr;
xpd_t *orig_xpd;
+ byte regnum;
+ byte data_low;
/* Map UNIT + PORTNUM to XPD */
orig_xpd = xpd;
addr.unit = orig_xpd->addr.unit;
addr.subunit = info->portnum;
+ regnum = REG_FIELD(info, regnum);
+ data_low = REG_FIELD(info, data_low);
xpd = xpd_byaddr(xbus, addr.unit, addr.subunit);
if(!xpd) {
static int rate_limit;
@@ -1408,10 +1600,15 @@
info->bytes, info->eoframe);
goto end;
}
- if(REG_FIELD(info, regnum) == REG_FRS0 && !REG_FIELD(info, do_subreg))
- layer1_state(xpd, REG_FIELD(info, data_low));
- if(REG_FIELD(info, regnum) == REG_FRS1 && !REG_FIELD(info, do_subreg))
- priv->reg_frs1 = REG_FIELD(info, data_low);
+ if(regnum == REG_FRS0 && !REG_FIELD(info, do_subreg))
+ layer1_state(xpd, data_low);
+ else if(regnum == REG_FRS1 && !REG_FIELD(info, do_subreg))
+ priv->reg_frs1 = data_low;
+ if(priv->is_cas && !REG_FIELD(info, do_subreg)) {
+ if(regnum >= REG_RS2_E && regnum <= REG_RS16_E) {
+ process_cas_dchan(xpd, regnum, data_low);
+ }
+ }
/* Update /proc info only if reply relate to the last slic read request */
if(
REG_FIELD(&xpd->requested_reply, regnum) == REG_FIELD(info, regnum) &&
@@ -1584,6 +1781,20 @@
len += sprintf(page + len, " YELLOW");
len += sprintf(page + len, "\n");
}
+ if(priv->is_cas) {
+ len += sprintf(page + len,
+ "CAS: replies=%d\n", priv->cas_replies);
+ len += sprintf(page + len, " CAS-TS: ");
+ for(i = 0; i < NUM_CAS_RS; i++) {
+ len += sprintf(page + len, " %02X", priv->cas_ts_e[i]);
+ }
+ len += sprintf(page + len, "\n");
+ len += sprintf(page + len, " CAS-RS: ");
+ for(i = 0; i < NUM_CAS_RS; i++) {
+ len += sprintf(page + len, " %02X", priv->cas_rs_e[i]);
+ }
+ len += sprintf(page + len, "\n");
+ }
len += sprintf(page + len, "D-Channel: TX=[%5d] (0x%02X) RX=[%5d] (0x%02X) ",
priv->dchan_tx_counter, priv->dchan_tx_sample,
priv->dchan_rx_counter, priv->dchan_rx_sample);
Modified: branches/1.4/kernel/xpp/firmwares/FPGA_1151.hex
URL: http://svn.digium.com/view/zaptel/branches/1.4/kernel/xpp/firmwares/FPGA_1151.hex?view=diff&rev=4463&r1=4462&r2=4463
==============================================================================
--- branches/1.4/kernel/xpp/firmwares/FPGA_1151.hex (original)
+++ branches/1.4/kernel/xpp/firmwares/FPGA_1151.hex Thu Aug 7 05:15:39 2008
@@ -1,8 +1,8 @@
#
-# $Id: FPGA_1151.hex 5959 2008-07-24 16:42:49Z dima $
+# $Id: FPGA_1151.hex 5975 2008-07-28 14:38:23Z dima $
#
:020000040000FA
-:80000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AD6FF400090C80A006AD6FF400090C80A006AD6FF400090C80A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4455544455557475577775577675577775577765566665563625523235D2E37C2B5111155111155111155111A8
+:80000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6AD6FF400008CB0A006AD6FF400008CB0A006AD6FF400008CB0A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4455544455557475577775577675577775577765566665563625523235D2E37C2B511115511115511115511137
:80008000155111155111155111155111155111155111155111155111155111155111155111155111155111155111155111155111000000000000000000000000000000000000002552222552222552220025522225522200000000001AA1111AA1110025522200001AA1111AA111001AA11100001AA1111AA11100001AA1111AA1111AA113
:80010000110000002552222552222F21F112122F21F112122552222552222552222552220000001AA111255222255222255222255222255222255222255222255222255222255222000000002F21F112122F21F1121200002552222552221AA1111AA1112552222F21F1121200001AA1112F21F112121AA111002F21F112122F21F11212EF
:800180001AA11100255222255222000000000025522200000000255222255222000000000025522200001F1BFBB1B1755777000000000000000000000000001AA1111AA11100000000000000000000000000002552220000000025522225522200002552222552222552222552222552222552222552222552222552220025522200000066
@@ -19,679 +19,679 @@
:800700004F48F8848425522200CFCCFCCCCCFFFFFFFFFF3F33F333330000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000004F48F884846F68F88686255222000000CFC4F44C4CFFF7F77F7F3F33F333334F48F884846556664554448F8CFCC8C8FFFFFFFFFF7F73F337375F59F9959585588800655666455444FFFFFFFFFFFFFFFFFFFFFFC6
:80078000FFFFFFFF000000004F44F444447F75F557573F31F11313000000CFC8F88C8CCFCBFBBCBC3AA3334F44F444443F31F1131300CFC8F88C8CCFCBFBBCBC3AA3330000CFCBFBBCBCCFCBFBBCBCCFCBFBBCBC000000004F44F444445F54F445451551110000008F8CFCC8C88F8FFFF8F83AA3334F44F444441F15F551514AA4448F88ED
:80080000F888888F8EFEE8E86AA6664AA4444AA4448F8EFEE8E88F8EFEE8E88F8EFEE8E8000000004F44F444444F47F774743AA333000000CFCCFCCCCCDFDEFEEDED1F12F221214F44F444441F17F771714AA444CFC8F88C8CCFCEFEECEC6AA6664AA4444AA444CFCEFEECECCFCEFEECECCFCEFEECEC000000004F44F444444F47F774740C
-:800880003AA3330000008F8CFCC8C89F9FFFF9F91F13F331314F44F444441F17F771714AA4448F88F888888F8FFFF8F87AA7774AA4444AA4448F8FFFF8F88F8FFFF8F88F8FFFF8F80000000000000000000000000000000000008F8FFFF8F88F8DFDD8D8000080010000000000000000000014000000000000000000000000000000003E43
-:800900006580040000000000000000000000000000140000000000000000000000000000F7D8000000000000000000000000000000000000000000000000000000000000FFE40F48008001000000000000000000001400400100000000000000000000000000E06F0900000000000000000000000000000000000000000000000000000043
-:800980000000F04FFE800200400100800414800280041480020000800280040000214840010080041400108204000021BF26050000000000000000000000000000000000000000000000000000000000F04FFE000000000000000000000000000000000000000000000000000000000000FFE40F48180028000000002100000021001400CD
-:800A00001002400100000080020000882800008088020000EFE40F0080840100002001000000000000402101000014000000140000001400000000007028034818148002800414182810820416012810A21140012810A2414001002B11484001280048408188022148008828108204F05C65808401800200000010020000100240010021B6
-:800A8000001400000000280000808802000088280000F04EFE000000000000000000000000000000000000000000000000000000000000FFE40F00000000000000000000000000901200180000000000000088000000000000F0DC97000020020000002400000010020000000000000000200200008002000088220000F0ED570000000053
-:800B00000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000002001800100000000000000000000820000005F130C0000000000000000000000000000000000000000000000000000000000F04FFE00002002000000000000002100000000000000000022000000000000000000F0DB74
-:800B800023000000000000000000000000000000000000000000000000000000000000FFE40F000000000000000000000000000000000000000000002028020000000000301B00000000000040020000000000001002000000000000000000000000280000F086FF00000000000000000000000000000000000022000000000000000082B6
-:800C00000000003F340D0000400200240000000000002200000000000024000028000000000000000028E0DF0D00000021001002000000000028000000000000000000000000000020080000B089020000000000000000000000000000000000C022000022000000000000000028D036058001000000120000201801121400000010A11183
-:800C800000000020010000008008000000000028707908000000000000008002000000000080080000000014000000000000000000006BFB000000000000001001820021800800000012000000000042002800000000000000F07FFF100100000012002358230060231200220011460242122200000031008002130200800C200800800441
-:800D000000F0951C000000002001002140011A120280220811004812000000400100289021800220042008000000009F5B01140000000040224803008812240000201402808201000021000048000020080000004800007FC70C0000002A01224824400200000000000000280000000000002200000000000048004A02FF120E222002000A
-:800D8000244800284220088822D8808922880200281280818208A2001002A88088242A080088000000800882FB5880022200000048284880080042208822080020020080088200002008A2800A00000000000022F0E528000000E02221840210022180882209180022000018221822002200100228004280080082000020048242822F982D
-:800E00000B200248381800488024222184A112C2222A842688020018220018008228002288008A0114200200008088A882881400F0A46600A041000000290442A28200210024240018808221A918C02222200882402184040000208202242822000000281E342001A02100144A02112200000021000000880000802184048004000080028D
-:800E8000004824822088048012A18220FCF8A1202182210212004612812404C8207242228284848802208822812181612148C888202C9281009240012280048220AA2488800AA8A042DF9B020020A1124081064822289880218108282221000080028280220222000020048002002824400288800A00207829090028802423268224AA28FC
-:800F0000200400808288228202286828282868280028008028A828A0248002284220082082288608206218621F74021280042820118212028280220420280288A0928008008860222028C122822400281828C22842882200202402228082A442F063DE20A6212200423200C22A84822188A924E880A1852818288002284828188220014859
-:800F800018128880218C820488A0840000220020886816E0F10412005A02004A01004288528008524220840400000000C2808128042880020028000020840888222A0800887F9F0A420040022D4220044882481002488223080042484821005A282821828C0C00211A88080082422880880420282428A42800F0B9E8001812802201282858
-:80100000296121101282021022820288A0822042220760221222282C090000288828802208002002221480240222EE77000018120000001882802502A0410048000042008004008008122200180080040042480020024200CF89060020C24242C042400229448204482C82044A21A8128270820225220910028098223032000042882008FA
-:8010800020042282202824280486A148EF9F0A22281A041828001878881A82A1A18888883280A814882B418818485A08A0C3C29AE6118482A4258278A085928A01C280A286A02400420042201842F124D320A21320E422A21322282B62A22B122AD12231828AA46A8E221AA3AF2A85AC141A6C224A6A22282AA8ED9E223AAAE89AC8125EB6
-:80110000821E42181AA228127AAA98EA02AAA2A88A2628A4642A022A0280A26A142AF2829EA01528005A15F2127223849182482BA48AAC152B1280B4C298121AAA2C688A83E82A1462222B1422884E4223048AA668212CA28832AA82A523C82A82242406004AA82AC8AAA284E2E01EAAC41F950968A0333A034A26A45246A275CEA29A2446
-:8011800085AC854AA8862A8424AC12BA28A66880A6451A062A25A8136AA78322EAA9892B12884A292804CAA8842A84A88448A0484A28AC84AA86AC844882AFAB01000040022412241224400220410220012014229412802194120042290121808104488004004820084880040000BF25071AA132182AA3662B337AE326A4772E32C22B6608
-:80120000982BC4DAA997BABD62A7BE6AAAC92AAD9A2BC12BAA422B722AA42A7AB2A2AE299A81B222AE432BB3288AAC63AAAA2BAAAA2A2AAAA4A088CAA88CEAAA22AAEA1AB2C188A422AAEE1AFE1FCAA053EAA5133AA5413AA5334AA4428A2CAAC62AAFD4385AAD334AAC114AE628B242A42B2B31AAA29A2AA2C4AA2288F4A1213AE518A813
-:8012800082627AAFAA2AA42A2AA22B2AAE62AAAA62AAA42A8AA8ACEAAAE2AAEA12A2AAEE622B2EEAB6A2EAF706182A87A1237AF622222B322F25B562F622322B192F2FB782FA42C22B8C6AA88A2F26B6E2AAB69AB922A9DE2CFDA2E24EC22F2323A17B7EE22F2BEB1DA64D4E622F2BE72BF422E21AA2995AA69DCAA68CCAA4E44A0ACA2E5D
-:8013000024A48A4AA4EC4AE41EA84229A2C88AFCFE4D20A25A2A21E721D422F422222F25F512522F29BDB2F172D22F21FB52D22B134AEC22F252F22B995AA77D2B54FE724E522F2EF652C22F27B7D2A57FDED22F25F7F271BAFCD1D22F2BFDF2D22F23BFB2AA9FDAA555DAA5C44AA48C6AA64ECAA6446AA4C84AA48C4AA4EE4A34C2CE42EE
-:801380008E813FE60200000000002001000082000000000000008029240218800800008004004800002800F0DA9900800118000000800818008001421200004200884200008828000018000000000010010000FC052AB41122B21122B411364219B242B181B66299212B9413B842A94A2F142BF24291AAD412AB4A1CEB2AC4812E4216E1C2
-:801400002264192E4296E122AC292E421B292CB491E222B89122B491B242B881B242B881B262B881B24218B14228B24228B24228B242A84A4AE822F422F7A0521B412A34116692416E121B4166B291E42691414EB21B684AA1492F3482E414AB492D312B482F14A3184E3129E811DA22E51D82E111F222D3D621329129B511F622C213A9E2
-:80148000121B412B8219B422B881B462388129BA8136428229AA4829AA4A2B8423B8426A28AF9D01208804000010020028400200001002188008000014000048800400000080020000005012D08F0E82008083C1122248B082B14299D18218224222A22488484800004820A2418022840A100200424A0A22004200002188200200EFD40228
-:80150000118A312112426012482001248001009280A8241186212228869212AA2104422944221583810221D2AE11004846A14211C2109281C242A084CAC241E092031182115852121221428081C451A02180A412882C682C4282328262245AA8282A8451212A8484436124281082397168A024198462148012422188088E222814F082224E
-:801580000012222002268106122D8292292809222088022811460100282001424840221C2201004888820080048A04C082484220A44842F0C2B1000060144082442141029800400220880288201402214229280400280021004888480042200400290200202224F2F773302180A22130434002232662211012B182024290434822421908C0
-:80160000144842002C2221818434820014231AC211828242200A231832C280A8244A888C2882F89D7C00802221D4120421905210820814889042B041A84222428210C14200212E4218208432822440420282C2824848826028243022A0424848886822DDED30210022140046122182622116022428002400801861240048488200128004CF
-:8016800000112A2834110000284221200C8220882802822FC80E1862111601114823A824240082302288221582083522322188AAA4182904009021128280280262288002272400002511122202A248200829DA3605200422424E1240422183322221422A249682006028C21824A01C124A31812A552111001C410282CA219431488028868B
-:8017000018A128C24820082C8408284A18F21B688004120080A282802484041820012335210000130428140021124824000018100220028842000080642800290820F45E6120240219034611922213242712328248486AA8285632819082C819D3212C2AE411846518237711820421160122181A3242362124C24268C81488372842A08695
-:801780002C289C4282A8484AF813AD80011C014212623022304268201122512211284021022064220000202281082C08888222200229280800482400802218028826711D01800280C42240023041284A32413022622442E8421916012D426A81A42448424A8804A04180028AC2824A022880C6424A420286022C28220C00C2222FC40B0093
-:80180000121A0252463112008A220180244141411102982002866122204802002824822C082413941114240029082142006200200222886F8C01424200000068240021428846024200824082042411000019222214C2C21A845112248004002440225822482D220040220414EE84802101400200200400000086217A42028085814581CC8F
-:8018800012480020018A0200181301390162232422248424240282292222222A02BF780520A32142200400000000142C0200460288A0820021212100C28A82820228422886C12200288228210022602686220222242AE81C0900001220A142112938222304704122220C80021C13428201000042290415022150221002200400000030820D
-:801900002084042004DB53204201388A021082842108B081218808321C28288B28A28110220282888280024A898122888AA82480028200008008000000F0FB1DA04182287041C222602430422022263821134C0122108204002A14A242222B42302220085AA21828144A024E228092824A0242200EA0842224806418487F560628800432AA
-:80198000121A048028744202005022422304002D514238908188C012A0181C250424808401182921344210028012A284420023041042F13539A0159AA5125AA2382CA2542F21C442241022A248822A2AF422111F283A824682F951825A88E832AD222A66282E4286023A24BA227232E22228AA1333BAE2752121A222226A322229B442A482
-:801A0000C82BAEA82B246AAA22282B221C82F68BC88024AA212AE117B45275122114B282A52C32481B844E431F18F423E24A28A6A42B124E2122782302158198228223A41642A8DEC2CA8926D131A2C41F3132422F2496428A988220843842482B4E8E428E422B44224A68168AB82A042A922100242224281B244AF822C34E622B241C916D
-:801A8000A12725141D422D412E428ABCB1C451244E623B242F247452A2C42B14C82DE18AF3414218682B192D222B8C1E23E0210746F242628E424E6224242C4242A282211082E4282CF2B7DE0010011110A11219E42201188081C41280138101200823081112A0210020040000481C8804008224488044824422480100422E88A0557AF248
-:801B000011211D411B611F26E61772112391811E715A3632A0F1323B89282F15E725F522A22E611B722F23E226F6E2735E726EE2EEF2AEF23AB2C1A7B92E432B132F23A6BF2E222F32F6A3212F27B3B2AF226AA2262BE66A56222F2C082B248AAE226A6A2626A2EC4AB2E27ED30D5AA7681F11D311B151B543F5727137113F15F453922F7D
-:801B800035B752B672A4DD5E125EA13F15BED3BD53F5D2D22B442BE31F13E32CAC443F35FC51537E72EAEF2EAF63AE71DAC9C22F2FFBF2723AE723F3A1A33F36F623323F1FAF226E222B2A2F26EA26E626F682822F2CFA62A22F24EC2AB2627A43B222B2E2AE88EAD6570D5AF411511A43E111E42636511F36D731B413E51CEC26B542A286
-:801C000015C82E123F2CEC23F3C2A34E422B913F1EFF2171EED26E422EE12B445E72CEC2FABE92F882318AEA26B632B3B2BD92FD123225F393113F35B112354262422BCC4AD622F2C2828ABC62A2622B242BC82E226AB6E2AEEACAFC3E69A0661F1BA3331CE135F542523F25F522322B663F2EFAD2F16E322B641B88DED26EF33F16FAE371
-:801C8000A13F3DFFC2C22B991F1CF521316E626AF641423F25C5622B442F2FFED2C22B7ECAE826FEF2B22F2DF592922F29F991933F3FFD53523F157742F242422B482F2CFC42422F24F6C2C22F2EEC2EEA2E6E2C2BCC2F26B262A6EEEAAE4CBF1A0C0018002008202882048A0400482088020010022128211022A49280092180092448247B
-:801D000048002008488044820400F02BD580942180621611272440834401214081D4121251222AA424124E2124281B428024842804400258001125A2411400824250228A04A22111292802AA8428F8326E80B411021B214AB111B662B111F242121B612B941B212B9413F142921B432F1439312F1429D312A9421CE922C4813F2264112E0F
-:801D80005296E12265192E52DAC2421B2D2D421B29241B2927341B6927141B6827241B282F2498212F2498412F24A8422F24A84A2B842229A84288AE426F2107181B614819A29419B66211714292612B8419B2421AD122BAA16414137A4223C2813B4A29E92AC5813F22CD812E4286C1421CE2326C1DB0D17222B211E4222D7962A3492F94
-:801E000016B881746232816612F142A21B682CA8422D828AA4242229B8A2B4426828EBE82022088008002100002800000000001880088800000000000000000080022800000014F0BDECA02890211112002840C1A12983480127248A04A829C3210022C0221246A18248288004803222004E822270812218024002232802282890C28A24DD
-:801E8000045FFC0E4AB181021868906113914320C44248C24A91A12642230448460113642211282723D01238512A247242C26111988E221C3A2342481021641C800C42C8C6C24148A8008681F26717A024C6411181031914814471A1A216A2C0128E21230E2F228CF321424601762162282CB11192A2141A922142421342B14221D8329AB7
-:801F0000412B2448828848118014B242828A94414A826A2C428E4128F60D182822124220A22125014230421B48424824110000003023284890C2468184522242228A22022A08105132A084800888482C2802102208F0BE262022018011410100904100102114810814124220140300214A921282200480082400282468228A0248A0488830
-:801F8000822C08282200EF3F04132462121992214825C2426622F5422398481825A214382B16E0210419621213822284341329A11416015820B812043D32883B142A341133A482822C8404884225219242200C8882A22F4A07481001281D420027222CC1418E11C012B041A1142F12044221222A148142410280C44180048A240419512207
-:802000004222156214828824228028948130C22448808808FFD1091CA2212813921140914248422C222404242082212811911114222C8424D421612118322981092412B082827811228421C2224A82A684800429A4822088882202A2DF46072A24040042A0251C6412CA6112884AA842388043814202C022C011A0481B820019048A1282ED
-:8020800021014A088641226218246842212984223222002522088227283BB200621880D12131210052111002388222312C21F421426A88A384488A93611280A286114880812822E12421E62102002008C22C88A68446422288028830421BB30040C131420024002442121542213442A082004041818284414222641120110242800A008293
-:802100003410028210612820086200626828DF24012228141B12584E11141E2246A1428AD51232121425E124AB421116A22413A2A42A91812B241CA4122CB52188B6212D24253812D21A82C89242AE1386C2213125A2288E42F041828E422AA8A4602422A0862A6826DF280B4880010023820413418184A8484A0124321C0A4240A1422061
-:802180006214002100302200A0122002008820044E8200482502290A29084286F128C814E011022044C12280948280A1811812808196A288210000180023081304400282CA2109C6021082CC42002482A2804C8242A2C200425F3C0448102104408184C1418211211130A2404141C11127121482C041140058222CA8812E41A812006222B2
-:802200002223820800100100212800808284D8EC0E14001220044260245800304224C01148184248622A244423011081014682C11200860214201802484A1281240800482C042288281CF8AC32200248132221021B12212826010080E8181482A12888882B811AE818818228C4312C82846C1222001168111023249282338228C282242814
-:802280002822800842482B84F01D3C000010014800982448144A1892631301304280022511412226984112200120011424144001008601002018224402881002F097BD8004482004142044032CC2928001C0E24003468121044A02237612221C031C61248218181210826412482290C18A842C048A2488E8140214D022487268038082837D
-:8023000023A22138281D22288812421A62128008A22213022718222A0898128822A6028200822200228220080040014240028842801482F4358D802224021611011814121848141964142C04214681242101006014826200293522C022001C228204822A042A0814205422822682426218214011D2BF0F11138114014818112903661301A5
[... 1312 lines stripped ...]
More information about the zaptel-commits
mailing list