[zaptel-commits] tzafrir: branch 1.2 r4467 - in /branches/1.2/xpp: ./ firmwares/

SVN commits to the Zaptel project zaptel-commits at lists.digium.com
Thu Aug 7 07:26:45 CDT 2008


Author: tzafrir
Date: Thu Aug  7 07:26:45 2008
New Revision: 4467

URL: http://svn.digium.com/view/zaptel?view=rev&rev=4467
Log:
xpp: preliminary CAS support.

Uses newer firmware (5975) for the 1151 alone.

(From r4463 in branches/1.4)

Modified:
    branches/1.2/xpp/card_pri.c
    branches/1.2/xpp/firmwares/FPGA_1151.hex
    branches/1.2/xpp/xbus-core.c

Modified: branches/1.2/xpp/card_pri.c
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/card_pri.c?view=diff&rev=4467&r1=4466&r2=4467
==============================================================================
--- branches/1.2/xpp/card_pri.c (original)
+++ branches/1.2/xpp/card_pri.c Thu Aug  7 07:26:45 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.2/xpp/firmwares/FPGA_1151.hex
URL: http://svn.digium.com/view/zaptel/branches/1.2/xpp/firmwares/FPGA_1151.hex?view=diff&rev=4467&r1=4466&r2=4467
==============================================================================
--- branches/1.2/xpp/firmwares/FPGA_1151.hex (original)
+++ branches/1.2/xpp/firmwares/FPGA_1151.hex Thu Aug  7 07:26:45 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