--- sdla_aft_te1.c	2007-11-05 17:34:32.000000000 -0500
+++ /common/wanpipe/sdla_aft_te1.c	2007-11-21 17:30:49.000000000 -0500
@@ -26,6 +26,7 @@
 # include <sdlapci.h>
 # include <sdla_aft_te1.h>
 # include <wanpipe_iface.h>
+# include <sdla_serial.h>
 #else
 # include <linux/wanpipe_includes.h>
 # include <linux/wanpipe_defines.h>
@@ -38,10 +39,8 @@
 # include <linux/sdla_aft_te1.h>
 # include <linux/wanpipe_iface.h>
 # include <linux/wanpipe_tdm_api.h>
-#if defined(CONFIG_PRODUCT_WANPIPE_AFT_SERIAL)
 # include <linux/sdla_serial.h>
 #endif
-#endif
 
 #if defined(CONFIG_WANPIPE_HWEC) 
 # include <wanec_iface.h>
@@ -141,6 +140,14 @@
 # undef AFT_CLOCK_SYNC
 #endif
 
+#if 1
+# warning "AFT_SERIAL_DEBUGGING is enabled"
+# define AFT_SINGLE_DMA_CHAIN 1
+# define AFT_SERIAL_DEBUG
+#else
+# undef AFT_SERIAL_DEBUG
+#endif
+
 #if defined(__LINUX__)
 #define AFT_TDM_API_SUPPORT 1    
 #else
@@ -159,6 +166,7 @@
 # undef AFT_RTP_SUPPORT
 #endif
 
+
 #if defined(WANPIPE_64BIT_4G_DMA)
 #warning "Wanpipe compiled for 64bit 4G DMA"
 #endif
@@ -330,6 +338,7 @@
 static void 	wp_aft_tdmv_per_port_isr(sdla_t *card);
 static void 	wp_aft_fifo_per_port_isr(sdla_t *card);
 static void 	wp_aft_wdt_per_port_isr(sdla_t *card, int wdt_intr);	
+static void     wp_aft_serial_status_isr(sdla_t *card, u32 status);
 
 /* Bottom half handlers */
 #if defined(__LINUX__)
@@ -816,17 +825,17 @@
 	card->hw_iface.getcfg(card->hw, SDLA_COREREV, &card->u.aft.firm_ver);
 	card->hw_iface.getcfg(card->hw, SDLA_COREID, &card->u.aft.firm_id);
 
-	/* FIXME:hardcoded!! */
-	card->u.aft.firm_id = AFT_DS_FE_CORE_ID;
-	
 	if (conf == NULL){
 		DEBUG_EVENT("%s: Bad configuration structre!\n",
 				card->devname);
 		return -EINVAL;
 	}
 
-	/* Make special hardware initialization for ISDN BRI board */
+	/* Make special hardware initialization for Serial board */
 	memcpy(&card->fe.fe_cfg, &conf->fe_cfg, sizeof(sdla_fe_cfg_t));
+
+	FE_MEDIA(&(card->fe.fe_cfg)) = WAN_MEDIA_SERIAL;
+
 	wp_serial_iface_init(&card->wandev.fe_iface);
 	card->fe.name		= card->devname;
 	card->fe.card		= card;
@@ -850,9 +859,7 @@
 
 	card->u.aft.num_of_time_slots = 1;
 
-	return -EINVAL;
-
-	return 	wan_aft_init(card,conf);
+	return wan_aft_init(card,conf);
 }
 #endif
 
@@ -1472,12 +1479,11 @@
 		
 	}
 	
-	if (IS_T1_CARD(card) || IS_FXOFXS_CARD(card)){
-		/* Convert active_ch bit map to user */
-		chan->wp_tdm_api_dev.active_ch = conf->active_ch << 1;
-	}else{
+	if (IS_E1_CARD(card)){
 		chan->wp_tdm_api_dev.active_ch = conf->active_ch;
-	}
+	}else{
+		chan->wp_tdm_api_dev.active_ch = conf->active_ch << 1;
+	}	
 
 	DEBUG_TEST("%s: TDM API ACTIVE CH 0x%08X  CHAN=%i\n",
 		chan->if_name, chan->wp_tdm_api_dev.active_ch,chan->wp_tdm_api_dev.tdm_chan);
@@ -2221,9 +2227,12 @@
 
 	for (i=0;i<MAX_AFT_DMA_CHAINS;i++){
 
-		err = card->hw_iface.busdma_alloc(card->hw,&chan->tx_dma_chain_table[i]);
+		err = card->hw_iface.busdma_alloc(
+						card->hw,
+						&chan->tx_dma_chain_table[i]);
 		if (err){
-			DEBUG_EVENT("%s:%s: Unable to load TX DMA buffer %d (%d)!\n",
+			DEBUG_EVENT(
+			"%s:%s: Unable to load TX DMA buffer %d (%d)!\n",
 					card->devname, chan->if_name, i, err);
 			err = -EINVAL;
 			break;
@@ -2233,9 +2242,12 @@
 					chan->tx_dma_chain_table[i].dma_virt,
 					chan->dma_mru);
 			
-		err = card->hw_iface.busdma_alloc(card->hw,&chan->rx_dma_chain_table[i]);
+		err = card->hw_iface.busdma_alloc(
+						card->hw,
+						&chan->rx_dma_chain_table[i]);
 		if (err){
-			DEBUG_EVENT("%s:%s: Unable to load RX DMA buffer %d (%d)!\n",
+			DEBUG_EVENT(
+			"%s:%s: Unable to load RX DMA buffer %d (%d)!\n",
 					card->devname, chan->if_name, i, err);
 			err = -EINVAL;
 			break;
@@ -2249,8 +2261,12 @@
 
 		for (i=0;i<MAX_AFT_DMA_CHAINS;i++){
 
-			card->hw_iface.busdma_free(card->hw,&chan->rx_dma_chain_table[i]);
-			card->hw_iface.busdma_free(card->hw,&chan->tx_dma_chain_table[i]);
+			card->hw_iface.busdma_free(
+						card->hw,
+						&chan->rx_dma_chain_table[i]);
+			card->hw_iface.busdma_free(
+						card->hw,
+						&chan->tx_dma_chain_table[i]);
 		} 
 		err = card->hw_iface.busdma_tag_destroy(
 						card->hw,
@@ -2530,7 +2546,8 @@
 		wan_spin_unlock_irq(&card->wandev.lock,&flags);
 
 		if (card->wandev.config_id == WANCONFIG_AFT_ANALOG ||
-		    card->wandev.config_id == WANCONFIG_AFT_ISDN_BRI) {
+		    card->wandev.config_id == WANCONFIG_AFT_ISDN_BRI || 
+		    card->wandev.config_id == WANCONFIG_AFT_SERIAL) {
 			wan_spin_lock_irq(&card->wandev.lock,&flags);
 			card->fe.fe_status = FE_CONNECTED;
 			handle_front_end_state(card);
@@ -2635,10 +2652,16 @@
 	aft_free_tx_descriptors(chan);
 	aft_free_rx_descriptors(chan);
 
+        wan_spin_unlock_irq(&card->wandev.lock,&flags);
+
 	for (i=0;i<MAX_AFT_DMA_CHAINS;i++){
 
-		card->hw_iface.busdma_free(card->hw,&chan->rx_dma_chain_table[i]);
-		card->hw_iface.busdma_free(card->hw,&chan->tx_dma_chain_table[i]);
+		card->hw_iface.busdma_free(
+					card->hw,
+					&chan->rx_dma_chain_table[i]);
+		card->hw_iface.busdma_free(
+					card->hw,
+					&chan->tx_dma_chain_table[i]);
 	} 
 	card->hw_iface.busdma_tag_destroy(
 					card->hw,
@@ -2649,6 +2672,8 @@
 					&chan->tx_dma_chain_table[0],
 					MAX_AFT_DMA_CHAINS);	
 
+        wan_spin_lock_irq(&card->wandev.lock,&flags);
+
 	WAN_IFQ_DMA_PURGE(&chan->wp_rx_free_list);
 	WAN_IFQ_DESTROY(&chan->wp_rx_free_list);
 
@@ -2759,7 +2784,7 @@
 
 			card->hw_iface.getcfg(card->hw, SDLA_HWCPU_USEDCNT, &card_use_cnt);
 			if (card_use_cnt == 1) {
-				DEBUG_BRI("%s: BRI Disabling TDMV INTR\n",
+				DEBUG_TEST("%s: BRI Disabling TDMV INTR\n",
 					card->devname);
 				aft_tdm_intr_ctrl(card,0);
 				aft_fifo_intr_ctrl(card, 0);
@@ -4529,8 +4554,9 @@
 		 * buffer and pass it up */
 		*new_skb=wan_skb_alloc(len + 20);
 		if (!*new_skb){
-			DEBUG_EVENT("%s:%s: Failed to allocate rx skb pkt (len=%d)!\n",
-				card->devname,chan->if_name,(len+20));
+			DEBUG_EVENT(
+			"%s:%s: Failed to allocate rx skb pkt (len=%d)!\n",
+					card->devname,chan->if_name,(len+20));
 			WAN_NETIF_STATS_INC_RX_DROPPED(&chan->common);	//chan->if_stats.rx_dropped++;
 			goto rx_comp_error;
 		}
@@ -5246,7 +5272,7 @@
 
 		card_list=__sdla_get_ptr_isr_array(card->hw);
 
-		DEBUG_BRI("%s(): card_list ptr: 0x%p\n", __FUNCTION__, card_list);
+		DEBUG_TEST("%s(): card_list ptr: 0x%p\n", __FUNCTION__, card_list);
 
 		for (i=0; i<max_number_of_ports; i++){
 
@@ -5255,7 +5281,7 @@
 				continue;
 			}
 				
-			DEBUG_BRI("%s(): card ptr: 0x%p, tmp_card ptr: 0x%p\n", __FUNCTION__, card, tmp_card);
+			DEBUG_TEST("%s(): card ptr: 0x%p, tmp_card ptr: 0x%p\n", __FUNCTION__, card, tmp_card);
 
 			if (tmp_card->wandev.fe_iface.isr) {
 				tmp_card->wandev.fe_iface.isr(&tmp_card->fe);
@@ -5315,11 +5341,12 @@
 static WAN_IRQ_RETVAL wp_aft_global_isr (sdla_t* card)
 {
 	u32 reg_sec=0,reg=0;
-	u32 a108_reg=0, a56k_reg=0;
+	u32 a108_reg=0, a56k_reg=0, serial_reg=0;
 	u32 fifo_port_intr=0;
 	u32 dma_port_intr=0;
 	u32 wdt_port_intr=0;
 	u32 tdmv_port_intr=0;
+	u32 status_port_intr=0;
 	u32 fe_intr=0;
 	u32 max_ports=IS_BRI_CARD(card)?MAX_BRI_LINES:8;
 
@@ -5358,16 +5385,17 @@
 	__sdla_bus_read_4(card->hw,AFT_CHIP_CFG_REG, &reg);
 	reg_sec=reg;
 
+	DEBUG_TEST("%s:ISR = 0x%X\n",card->devname,reg);
+
 	if (wan_test_bit(AFT_CHIPCFG_FE_INTR_STAT_BIT,&reg)){
 
 #ifdef AFT_IRQ_STAT_DEBUG
 		card->wandev.stats.rx_dropped++;
 #endif		 
-		DEBUG_BRI("%s(): line: %d\n", __FUNCTION__, __LINE__);
 
 		if (wan_test_bit(AFT_CHIPCFG_FE_INTR_CFG_BIT,&reg)) {
 		
-			DEBUG_BRI("%s: Got Front End Interrupt 0x%08X\n",
+			DEBUG_ISR("%s: Got Front End Interrupt 0x%08X\n",
 					card->devname,reg);
 
 			WAN_IRQ_RETVAL_SET(irq_ret, WAN_IRQ_HANDLED);
@@ -5412,12 +5440,27 @@
 		wdt_port_intr	= aft_chipcfg_a108_get_wdt_intr_stats(a108_reg);
 		tdmv_port_intr	= aft_chipcfg_a108_get_tdmv_intr_stats(a108_reg);	
 
-	}else if(IS_56K_CARD(card)){
+	} else if (IS_SERIAL_CARD(card)) {
+		__sdla_bus_read_4(card->hw,AFT_CHIP_STAT_REG, &serial_reg);
+
+#ifdef AFT_SERIAL_DEBUG
+if (serial_reg) {
+	DEBUG_EVENT("%s: SERIAL ISR = 0x%08X\n",
+			card->devname,serial_reg);
+}
+#endif
+
+		fifo_port_intr	= aft_chipcfg_a108_get_fifo_intr_stats(serial_reg);
+		dma_port_intr	= aft_chipcfg_a108_get_dma_intr_stats(serial_reg);
+		wdt_port_intr	= aft_chipcfg_serial_get_wdt_intr_stats(serial_reg);
+		status_port_intr = aft_chipcfg_serial_get_status_intr_stats(serial_reg, card->wandev.comm_port);
+
+	} else if(IS_56K_CARD(card)) {
        		__sdla_bus_read_4(card->hw,AFT_CHIP_STAT_REG, &a56k_reg);
 		fifo_port_intr	= wan_test_bit(AFT_CHIPCFG_A56K_FIFO_INTR_BIT,&a56k_reg);
 		dma_port_intr	= wan_test_bit(AFT_CHIPCFG_A56K_DMA_INTR_BIT,&a56k_reg);
 		wdt_port_intr	= wan_test_bit(AFT_CHIPCFG_A56K_WDT_INTR_BIT,&a56k_reg);
-	}else{
+	} else {
 		fifo_port_intr	= aft_chipcfg_get_hdlc_intr_stats(reg);
 		dma_port_intr	= aft_chipcfg_get_dma_intr_stats(reg);
 		wdt_port_intr	= aft_chipcfg_get_wdt_intr_stats(reg);
@@ -5432,6 +5475,7 @@
 		dma_port_intr  ||
 		fifo_port_intr ||
 		dma_port_intr  ||
+		status_port_intr ||
 		wdt_port_intr) {
          	/* Pass Through */
 	} else {
@@ -5473,10 +5517,15 @@
 #endif
 	}
 
+	
+
 #else
 #warning "NCDEBUG DMA IGNORED"
 #endif
 
+	
+
+
 	if (wan_test_bit(AFT_TDM_GLOBAL_ISR,&card->u.aft.chip_cfg_status)) {
 		   
 		if (tdmv_port_intr &&
@@ -5596,9 +5645,13 @@
 		}
 	}
 
+	if (status_port_intr) {
+		wp_aft_serial_status_isr(card, status_port_intr);
+	}
+
 	if (wan_test_bit(card->wandev.comm_port,&wdt_port_intr)){
 		WAN_IRQ_RETVAL_SET(irq_ret, WAN_IRQ_HANDLED);
-		wp_aft_wdt_per_port_isr(card,1);			
+		wp_aft_wdt_per_port_isr(card,1);
 		card->u.aft.wdt_tx_cnt=SYSTEM_TICKS;
 #ifdef AFT_IRQ_STAT_DEBUG
 		card->wandev.stats.rx_fifo_errors++;
@@ -5684,6 +5737,32 @@
 	WAN_IRQ_RETURN(irq_ret); 
 }
 
+
+static void wp_aft_serial_status_isr(sdla_t *card, u32 serial_intr_status)
+{
+ 	u32 reg;
+
+	__sdla_bus_read_4(card->hw, AFT_PORT_REG(card,AFT_SERIAL_LINE_CFG_REG), &reg);
+
+	if (wan_test_bit(AFT_CHIPCFG_SERIAL_CTS_STATUS_INTR_BIT,&serial_intr_status)) {
+		DEBUG_EVENT("%s: CTS ISR Status 0x%02X\n", 
+				card->devname,
+				wan_test_bit(AFT_SERIAL_LCFG_CTS_BIT,&reg));		
+	} 
+
+	if (wan_test_bit(AFT_CHIPCFG_SERIAL_DCD_STATUS_INTR_BIT,&serial_intr_status)) {
+		DEBUG_EVENT("%s: DCS ISR Status 0x%02X\n", 
+				card->devname,
+				wan_test_bit(AFT_SERIAL_LCFG_DCD_BIT,&reg));	
+	} 
+
+	if (wan_test_bit(AFT_CHIPCFG_SERIAL_RTS_STATUS_INTR_BIT,&serial_intr_status)) {
+		DEBUG_EVENT("%s: RTS ISR Status 0x%02X\n", 
+				card->devname,
+				wan_test_bit(AFT_SERIAL_LCFG_RTS_BIT,&reg));
+	}
+}
+
 static void wp_aft_dma_per_port_isr(sdla_t *card)
 {
 	int i;
@@ -5721,7 +5800,7 @@
 		
 	/* Receive DMA Engine */
 	__sdla_bus_read_4(card->hw,AFT_PORT_REG(card,AFT_RX_DMA_INTR_PENDING_REG),&dma_rx_reg);
-	DEBUG_BRI("Line: %d: dma_rx_reg: 0x%X\n", __LINE__, dma_rx_reg);
+	DEBUG_TEST("Line: %d: dma_rx_reg: 0x%X\n", __LINE__, dma_rx_reg);
 
 	dma_rx_reg&=card->u.aft.active_ch_map;
 
@@ -5730,10 +5809,10 @@
 	}
 
 	dma_rx_reg &= card->u.aft.logic_ch_map;
-	DEBUG_BRI("Line: %d: dma_rx_reg: 0x%X\n", __LINE__, dma_rx_reg);
+	DEBUG_TEST("Line: %d: dma_rx_reg: 0x%X\n", __LINE__, dma_rx_reg);
 
 	dma_rx_reg &= ~(card->u.aft.tdm_logic_ch_map);
-	DEBUG_BRI("Line: %d: dma_rx_reg: 0x%X\n", __LINE__, dma_rx_reg);
+	DEBUG_TEST("Line: %d: dma_rx_reg: 0x%X\n", __LINE__, dma_rx_reg);
 
 	for (i=0; i<num_of_logic_ch;i++){
 
@@ -5762,7 +5841,7 @@
 			WAN_NETIF_STATS_INC_RX_FRAME_ERRORS(&chan->common);	//chan->if_stats.rx_frame_errors++;
 #endif
 
-			DEBUG_BRI("%s: RX Interrupt pend. \n",	card->devname);
+			DEBUG_TEST("%s: RX Interrupt pend. \n",	card->devname);
 	
 			aft_dma_rx_complete(card,chan,0);
 
@@ -6295,8 +6374,7 @@
 			
 		case AFT_HWEC_STATUS:
 			*(unsigned long *)&wan_udp_pkt->wan_udp_data[0] = 
-				IS_E1_CARD(card) ? card->wandev.ec_map:
-					card->wandev.ec_map << 1;
+							card->wandev.fe_ec_map;
 			wan_udp_pkt->wan_udp_data_len = sizeof(unsigned long);
 			wan_udp_pkt->wan_udp_return_code = 0;
 			break;
@@ -8025,7 +8103,8 @@
  * aft_dma_chain_init
  *
  */
-static void aft_tx_dma_chain_init(private_area_t *chan, wan_dma_descr_t *dma_chain)
+static void
+aft_tx_dma_chain_init(private_area_t *chan, wan_dma_descr_t *dma_chain)
 {
 #define card	    chan->card
 
@@ -8512,16 +8591,18 @@
 		wan_skb_trim(dma_chain->skb,0);
 	
 		/* A-DMA */
-		card->hw_iface.busdma_map(	card->hw,
-						dma_chain,
-						wan_skb_tail(dma_chain->skb),
-						chan->dma_mru,
-						chan->dma_mru,
-						SDLA_DMA_PREREAD);
-		card->hw_iface.busdma_sync(	card->hw,
-						dma_chain,
-						MAX_AFT_DMA_CHAINS, chan->single_dma_chain,
-						SDLA_DMA_PREREAD);
+		card->hw_iface.busdma_map(	
+				card->hw,
+				dma_chain,
+				wan_skb_tail(dma_chain->skb),
+				chan->dma_mru,
+				chan->dma_mru,
+				SDLA_DMA_PREREAD);
+		card->hw_iface.busdma_sync(	
+				card->hw,
+				dma_chain,
+				MAX_AFT_DMA_CHAINS, chan->single_dma_chain,
+				SDLA_DMA_PREREAD);
 		DEBUG_DMA("%s: RXDMA PHY = 0x%08X VIRT = %p \n", 
 				chan->if_name,
 				dma_chain->dma_addr,wan_skb_tail(dma_chain->skb)+dma_chain->dma_offset);
@@ -8636,16 +8717,18 @@
 			
 		}
 
-		card->hw_iface.busdma_map(	card->hw,
-						dma_chain,
-						wan_skb_tail(dma_chain->skb),
-						chan->dma_mru,
-						chan->dma_mru,
-						SDLA_DMA_PREREAD);
-		card->hw_iface.busdma_sync(	card->hw,
-						dma_chain,
-						1, chan->single_dma_chain,
-						SDLA_DMA_PREREAD);
+		card->hw_iface.busdma_map(	
+					card->hw,
+					dma_chain,
+					wan_skb_tail(dma_chain->skb),
+					chan->dma_mru,
+					chan->dma_mru,
+					SDLA_DMA_PREREAD);
+		card->hw_iface.busdma_sync(	
+					card->hw,
+					dma_chain,
+					1, chan->single_dma_chain,
+					SDLA_DMA_PREREAD);
 		intr=0;
 		if (!wan_test_bit(RX_INTR_PENDING,&chan->dma_chain_status)){
 			
@@ -8861,13 +8944,16 @@
 						dma_chain,
 						SDLA_DMA_POSTREAD);
 
+#if defined(__FreeBSD__)
+		wan_skb_put(dma_chain->skb, rx_el->len);
+#endif
 		wan_skb_queue_tail(&chan->wp_rx_complete_list,dma_chain->skb);
 		rx_data_available=1;
 
-		DEBUG_BRI("%s: RxInt Pending chain %d Rxlist=%d LO:0x%X HI:0x%X!\n",
+		DEBUG_TEST("%s: RxInt Pending chain %d Rxlist=%d LO:0x%X HI:0x%X Len=%i!\n",
 				chan->if_name,dma_chain->index,
 				wan_skb_queue_len(&chan->wp_rx_complete_list),
-				rx_el->align,rx_el->reg);
+				rx_el->align,rx_el->reg, rx_el->len);
 
 rx_hndlr_skip_rx:
 		dma_chain->skb=NULL;
@@ -10314,24 +10400,27 @@
 #else
 
 #if 1
-			card->hw_iface.busdma_sync(	card->hw,
-							&chan->tx_dma_chain_table[0],
-							MAX_AFT_DMA_CHAINS,
-							chan->single_dma_chain,
-							SDLA_DMA_POSTREAD);
+			card->hw_iface.busdma_sync(	
+						card->hw,
+						&chan->tx_dma_chain_table[0],
+						MAX_AFT_DMA_CHAINS,
+						chan->single_dma_chain,
+						SDLA_DMA_POSTREAD);
 
 			WAN_TDMV_CALL(rx_tx_span, (card), err);
 
-			card->hw_iface.busdma_sync(	card->hw,
-							&chan->tx_dma_chain_table[0],
-							MAX_AFT_DMA_CHAINS,
-							chan->single_dma_chain,
-							SDLA_DMA_PREWRITE);
-			card->hw_iface.busdma_sync(	card->hw,
-							&chan->rx_dma_chain_table[0],
-							MAX_AFT_DMA_CHAINS,
-							chan->single_dma_chain,
-							SDLA_DMA_PREREAD);
+			card->hw_iface.busdma_sync(	
+						card->hw,
+						&chan->tx_dma_chain_table[0],
+						MAX_AFT_DMA_CHAINS,
+						chan->single_dma_chain,
+						SDLA_DMA_PREWRITE);
+			card->hw_iface.busdma_sync(	
+						card->hw,
+						&chan->rx_dma_chain_table[0],
+						MAX_AFT_DMA_CHAINS,
+						chan->single_dma_chain,
+						SDLA_DMA_PREREAD);
 
 #else
 #warning "NCDEBUG: rx_tx_span disabled irq"
@@ -11281,7 +11370,7 @@
 static int aft_hwec_config (sdla_t *card, private_area_t *chan, wanif_conf_t *conf, int ctrl)
 {
 	int err = 0;
-	unsigned int channel=0;
+	int		fe_chan = 0;
 	unsigned int tdmv_hwec_option=0;
 	
 	if (conf) {
@@ -11291,38 +11380,41 @@
 	if (chan->common.usedby == TDM_VOICE_API ||
 	    chan->common.usedby == TDM_VOICE){
 
+		/* Nov 6, 2007 Calling EC function with FE channel number. */
 		if (IS_TE1_CARD(card)) {
 			if (IS_T1_CARD(card)){
-				channel = chan->first_time_slot;
+				fe_chan = chan->first_time_slot+1;
 			}else{
-				channel = chan->first_time_slot;
+				fe_chan = chan->first_time_slot;
 			}
+		} else if (IS_FXOFXS_CARD(card)) {
+			fe_chan = chan->first_time_slot+1;
 		} else {
-		       	channel = chan->first_time_slot; 
+		       	fe_chan = chan->first_time_slot+1; 
 		}              
 		
 #if defined(CONFIG_WANPIPE_HWEC)  
 		if (ctrl == 0 && card->wandev.ec_enable){ 
-                	card->wandev.ec_enable(card, 0, channel);
+                	card->wandev.ec_enable(card, 0, fe_chan);
 			
 		} else if (tdmv_hwec_option && card->wandev.ec_enable){
 
 			if(IS_BRI_CARD(card)){
-				DEBUG_HWEC("%s(): original channel: %d\n", __FUNCTION__, channel);
+				DEBUG_HWEC("%s(): original fe_chan: %d\n", __FUNCTION__, fe_chan);
 
 				/* translate channel to be 0 or 1, nothing else!! */
-				channel = (channel % 2);
-				DEBUG_HWEC("%s():      new channel: %d\n", __FUNCTION__, channel);
+				fe_chan = (fe_chan % 2);
+				DEBUG_HWEC("%s():      new fe_chan: %d\n", __FUNCTION__, fe_chan);
 			}
 
-			DEBUG_HWEC("%s: HW echo canceller Enabled on channel %d\n",
+			DEBUG_HWEC("[HWEC] %s: Enable Echo Canceller on fe_chan %d\n",
 					chan->if_name,
-					channel);
+					fe_chan);
 
-			err = card->wandev.ec_enable(card, 1, channel);
+			err = card->wandev.ec_enable(card, 1, fe_chan);
 			if (err) {
-				DEBUG_EVENT("%s: Failed to enable HWEC on channel %d\n",
-						chan->if_name,channel);
+				DEBUG_EVENT("%s: Failed to enable HWEC on fe chan %d\n",
+						chan->if_name,fe_chan);
 			 	return err;       		
 			}
 		}          
