--- sdla_aft_te1.c.orig	2008-11-04 13:58:19.000000000 -0500
+++ sdla_aft_te1.c	2008-11-04 18:40:46.000000000 -0500
@@ -733,13 +733,14 @@
 
 	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);
+	
 	if (card->u.aft.firm_ver < AFT_MIN_ANALOG_FRMW_VER){
 		DEBUG_EVENT( "%s: Invalid/Obselete AFT ANALOG firmware version %X (not >= %X)!\n",
-				  card->devname, card->u.aft.firm_ver,AFT_MIN_ANALOG_FRMW_VER);
+				card->devname, card->u.aft.firm_ver,AFT_MIN_ANALOG_FRMW_VER);
 		DEBUG_EVENT( "%s  Refer to /usr/share/doc/wanpipe/README.aft_firm_update\n",
-				  card->devname);
+				card->devname);
 		DEBUG_EVENT( "%s: Please contact Sangoma Technologies for more info.\n",
-				  card->devname);
+				card->devname);
 		return -EINVAL;
 	}
 
@@ -758,7 +759,8 @@
 	card->fe.write_fe_reg	= card->hw_iface.fe_write;	/* aft_analog_write_fe;  */
 	card->fe.read_fe_reg	= card->hw_iface.fe_read;	/* aft_analog_read_fe;   */
 	card->fe.__read_fe_reg	= card->hw_iface.__fe_read;	/* __aft_analog_read_fe; */
-
+	card->fe.reset_fe	= card->hw_iface.reset_fe;
+ 
 	card->wandev.fe_enable_timer = enable_timer;
 	card->wandev.ec_enable_timer = enable_ec_timer;
 	card->wandev.te_link_state = callback_front_end_state;
@@ -782,6 +784,73 @@
 }
 #endif
 
+
+#if defined(CONFIG_PRODUCT_WANPIPE_AFT_A600)
+int wp_aft_a600_init (sdla_t* card, wandev_conf_t* conf)
+{
+	AFT_FUNC_DEBUG();
+	
+	/* Verify configuration ID */	
+	if (card->wandev.config_id != WANCONFIG_AFT_ANALOG) {
+		DEBUG_EVENT( "%s: invalid configuration ID %u!\n",
+			     card->devname, card->wandev.config_id);
+		return -EINVAL;
+	}
+
+	ASSERT_AFT_HWDEV(card->wandev.card_type);
+
+	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);
+
+	if (card->u.aft.firm_ver < AFT_MIN_A600_FRMW_VER){
+		DEBUG_EVENT( "%s: Invalid/Obselete A600 firmware version %X (not >= %X)!\n",
+			     card->devname, card->u.aft.firm_ver,AFT_MIN_A600_FRMW_VER);
+		DEBUG_EVENT( "%s  Refer to /usr/share/doc/wanpipe/README.aft_firm_update\n",
+		     card->devname);
+		DEBUG_EVENT( "%s: Please contact Sangoma Technologies for more info.\n",
+			     card->devname);
+		return -EINVAL;
+	}
+
+	if (conf == NULL){
+		DEBUG_EVENT("%s: Bad configuration structre!\n",
+			    card->devname);
+		return -EINVAL;
+	}
+
+	/* Make special hardware initialization for A600 board */
+	memset(&card->fe, 0, sizeof(sdla_fe_t));
+	memcpy(&card->fe.fe_cfg, &conf->fe_cfg, sizeof(sdla_fe_cfg_t));
+	
+	wp_remora_iface_init(&card->fe, &card->wandev.fe_iface);
+	
+	card->fe.name		= card->devname;
+	card->fe.card		= card;
+	card->fe.write_fe_reg	= card->hw_iface.fe_write;	/* aft_a600_write_fe;  */
+	card->fe.read_fe_reg	= card->hw_iface.fe_read;	/* aft_a600_read_fe;   */
+	card->fe.__read_fe_reg	= card->hw_iface.__fe_read;	/* __aft_a600_read_fe; */
+	card->fe.reset_fe	= card->hw_iface.reset_fe;
+
+	card->wandev.fe_enable_timer = enable_timer;
+	card->wandev.ec_enable_timer = enable_ec_timer;
+	card->wandev.te_link_state = callback_front_end_state;
+
+	card->wandev.comm_port=card->fe.fe_cfg.line_no;
+	if (card->wandev.comm_port == 0){
+		DEBUG_A600("Configuring A600 analog ports\n");
+		card->u.aft.num_of_time_slots = NUM_A600_ANALOG_PORTS;
+	} else if (card->wandev.comm_port == 1){
+		DEBUG_A600("Configuring A600 daughter card - Not implemented yet\n");
+	} else {
+		DEBUG_A600("%s: Error: Invalid port selected %d\n",
+			    card->devname,card->wandev.comm_port);	
+	}
+
+	return 	wan_aft_init(card,conf);
+}
+#endif
+
+
 #if defined(CONFIG_PRODUCT_WANPIPE_AFT_BRI)
 int wp_aft_bri_init (sdla_t *card, wandev_conf_t* conf)
 {
@@ -1684,13 +1753,13 @@
 					chan->cfg.ss7_lssu_size);
 
 		wan_spin_lock_irq(&card->wandev.lock,&smp_flags);
-		card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card,AFT_LINE_CFG_REG),&lcfg_reg);
+		card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card, AFT_LINE_CFG_REG),&lcfg_reg);
 		if (chan->cfg.ss7_mode){
 			aft_lcfg_ss7_mode4096_cfg(&lcfg_reg,chan->cfg.ss7_lssu_size);
 		}else{
 			aft_lcfg_ss7_mode128_cfg(&lcfg_reg,chan->cfg.ss7_lssu_size);
 		}
-		card->hw_iface.bus_write_4(card->hw,AFT_PORT_REG(card,AFT_LINE_CFG_REG), 
+		card->hw_iface.bus_write_4(card->hw,AFT_PORT_REG(card, AFT_LINE_CFG_REG), 
 					   lcfg_reg);
 		card->u.aft.lcfg_reg=lcfg_reg;
 		wan_spin_unlock_irq(&card->wandev.lock,&smp_flags);
@@ -5776,7 +5845,7 @@
 	*  -- "Transmit/Receive DMA Engine"  interrupt disable
 	*  -- "FiFo/Line Abort Error"		 interrupt disable
 	* --------------------------------------------------*/
-	__sdla_bus_read_4(card->hw,AFT_CHIP_CFG_REG, &reg);
+	__sdla_bus_read_4(card->hw,AFT_PORT_REG(card, AFT_CHIP_CFG_REG), &reg);
 	reg_sec=reg;
 
 	DEBUG_ISR("%s:ISR = 0x%X\n",card->devname,reg);
@@ -5826,9 +5895,9 @@
 	}
 #endif
 	
-	if (card->u.aft.firm_id == AFT_DS_FE_CORE_ID || IS_BRI_CARD(card)) {
+	if (card->u.aft.firm_id == AFT_DS_FE_CORE_ID || IS_BRI_CARD(card) || IS_A600_CARD(card)) {
 		
-		__sdla_bus_read_4(card->hw,AFT_CHIP_STAT_REG, &a108_reg);
+		__sdla_bus_read_4(card->hw,AFT_PORT_REG(card, AFT_CHIP_STAT_REG), &a108_reg);
 
 		fifo_port_intr	= aft_chipcfg_a108_get_fifo_intr_stats(a108_reg);
 		dma_port_intr	= aft_chipcfg_a108_get_dma_intr_stats(a108_reg);
@@ -5836,7 +5905,7 @@
 		tdmv_port_intr	= aft_chipcfg_a108_get_tdmv_intr_stats(a108_reg);	
 
 	} else if (IS_SERIAL_CARD(card)) {
-		__sdla_bus_read_4(card->hw,AFT_CHIP_STAT_REG, &serial_reg);
+		__sdla_bus_read_4(card->hw,AFT_PORT_REG(card, AFT_CHIP_STAT_REG), &serial_reg);
 
 #ifdef AFT_SERIAL_DEBUG
 if (serial_reg) {
@@ -5851,7 +5920,7 @@
 		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);
+       		__sdla_bus_read_4(card->hw,AFT_PORT_REG(card, 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);
@@ -5953,7 +6022,7 @@
 				wan_set_bit(AFT_CHIPCFG_A108_TDM_GLOBAL_RX_INTR_ACK,&reg);
 					wan_set_bit(AFT_CHIPCFG_A108_TDM_GLOBAL_TX_INTR_ACK,&reg);
 			}
-				__sdla_bus_write_4(card->hw,AFT_CHIP_CFG_REG,reg);	  
+				__sdla_bus_write_4(card->hw,AFT_PORT_REG(card, AFT_CHIP_CFG_REG),reg);	  
 		
 			if (card->hw_iface.fe_test_bit(card->hw,1)) {
 					DEBUG_EVENT("%s: Global TDM Ring Resync\n",card->devname);
@@ -6010,7 +6079,7 @@
 				wan_set_bit(AFT_CHIPCFG_A108_TDM_GLOBAL_RX_INTR_ACK,&reg);
 				wan_set_bit(AFT_CHIPCFG_A108_TDM_GLOBAL_TX_INTR_ACK,&reg);
 			}
-			__sdla_bus_write_4(card->hw,AFT_CHIP_CFG_REG,reg);
+			__sdla_bus_write_4(card->hw,AFT_PORT_REG(card, AFT_CHIP_CFG_REG),reg);
 		}
 
 		}
@@ -6108,7 +6177,7 @@
 		u32 lcfg_reg;
 
 		card->u.aft.sec_chk_cnt=SYSTEM_TICKS;
-		__sdla_bus_read_4(card->hw,AFT_PORT_REG(card,AFT_LINE_CFG_REG), &lcfg_reg);
+		__sdla_bus_read_4(card->hw,AFT_PORT_REG(card, AFT_LINE_CFG_REG), &lcfg_reg);
 		card->u.aft.lcfg_reg=lcfg_reg;
 		if (wan_test_bit(AFT_LCFG_TX_FE_SYNC_STAT_BIT,&lcfg_reg) ||
 			wan_test_bit(AFT_LCFG_RX_FE_SYNC_STAT_BIT,&lcfg_reg)){	
@@ -6668,7 +6737,6 @@
 
 	trace_info=&chan->trace_info;
 	wan_udp_pkt = (wan_udp_pkt_t *)chan->udp_pkt_data;
-
    	{
 
 		netskb_t *skb;
@@ -6983,7 +7051,6 @@
 			    ((wan_udp_pkt->wan_udp_command & 0xF0) == WAN_FE_UDP_CMD_START)){
 				/* FE udp calls */
 				wan_smp_flag_t smp_flags,smp_flags1;
-				
 				card->hw_iface.hw_lock(card->hw,&smp_flags);
 				wan_spin_lock_irq(&card->wandev.lock,&smp_flags1);
 				card->wandev.fe_iface.process_udp(
@@ -6992,7 +7059,6 @@
 						&wan_udp_pkt->wan_udp_data[0]);
 				wan_spin_unlock_irq(&card->wandev.lock,&smp_flags1);
 				card->hw_iface.hw_unlock(card->hw,&smp_flags);
-				
 				break;
 			}
 			wan_udp_pkt->wan_udp_data_len = 0;
@@ -7504,7 +7570,7 @@
 			card->devname,__FUNCTION__,card->wandev.comm_port,card_use_cnt);
 
 
-	card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card,AFT_LINE_CFG_REG), &reg);
+	card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card, AFT_LINE_CFG_REG), &reg);
 	if (wan_test_bit(AFT_LCFG_FE_IFACE_RESET_BIT,&reg)){
 		DEBUG_EVENT("%s: Warning: Skipping data enable wait for cfg!\n",
 				card->devname);
@@ -7540,7 +7606,7 @@
 
 	err=aft_hwdev[card->wandev.card_type].aft_test_sync(card,0);
 	if (err){
-		card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card,AFT_LINE_CFG_REG), &reg);
+		card->hw_iface.bus_read_4(card->hw, AFT_PORT_REG(card, AFT_LINE_CFG_REG), &reg);
 		DEBUG_EVENT("%s: Error: Front End Interface out of sync! (0x%X)\n",
 				card->devname,reg);
 
@@ -7552,7 +7618,7 @@
 			AFT_PORT_REG(card,AFT_LINE_CFG_REG), &reg);
 	      	wan_set_bit(AFT_LCFG_TDMV_INTR_BIT,&reg);
 		card->hw_iface.bus_write_4(card->hw,
-				AFT_PORT_REG(card,AFT_LINE_CFG_REG), reg);
+				AFT_PORT_REG(card, AFT_LINE_CFG_REG), reg);
 		
 	}
 	
@@ -7745,7 +7811,7 @@
 
 	/* Enable Global DMA and Error Interrupts */
 	card->hw_iface.bus_read_4(card->hw,
-				AFT_PORT_REG(card,AFT_LINE_CFG_REG), &reg);
+				AFT_PORT_REG(card, AFT_LINE_CFG_REG), &reg);
 	
 	wan_set_bit(AFT_LCFG_DMA_INTR_BIT,&reg);
 
@@ -7755,7 +7821,7 @@
 	}
 
 	card->hw_iface.bus_write_4(card->hw,
-				AFT_PORT_REG(card,AFT_LINE_CFG_REG), reg);
+				AFT_PORT_REG(card, AFT_LINE_CFG_REG), reg);
 
 	card->u.aft.lcfg_reg=reg;
 
@@ -7778,11 +7844,11 @@
 		
        	 	if (wan_test_bit(AFT_TDM_GLOBAL_ISR,&card->u.aft.chip_cfg_status)) {
 
-			card->hw_iface.bus_read_4(card->hw,AFT_CHIP_CFG_REG,&reg);
+			card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card, AFT_CHIP_CFG_REG),&reg);
 
 			/* Reset Global Fifo for the whole card */
 			wan_set_bit(AFT_CHIPCFG_A108_A104_TDM_FIFO_SYNC_BIT,&reg);
-			card->hw_iface.bus_write_4(card->hw,AFT_CHIP_CFG_REG,reg);
+			card->hw_iface.bus_write_4(card->hw,AFT_PORT_REG(card, AFT_CHIP_CFG_REG),reg);
 			WP_DELAY(1000);
 
 			/* Clear Global Card Fifo reset */
@@ -7807,7 +7873,7 @@
 			}
 
 #endif
-	       		card->hw_iface.bus_write_4(card->hw,AFT_CHIP_CFG_REG,reg);
+	       		card->hw_iface.bus_write_4(card->hw,AFT_PORT_REG(card, AFT_CHIP_CFG_REG),reg);
 
 			card->rsync_timeout=SYSTEM_TICKS;
 
@@ -7863,7 +7929,7 @@
 
 	aft_wdt_reset(card);
 
-	card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card,AFT_LINE_CFG_REG), &reg);
+	card->hw_iface.bus_read_4(card->hw, AFT_PORT_REG(card, AFT_LINE_CFG_REG), &reg);
 
 	wan_clear_bit(AFT_LCFG_DMA_INTR_BIT,&reg);
 	wan_clear_bit(AFT_LCFG_FIFO_INTR_BIT,&reg);
@@ -7883,7 +7949,7 @@
 			wan_set_bit(AFT_LCFG_FE_IFACE_RESET_BIT,&reg);
 		}
 	}
-	card->hw_iface.bus_write_4(card->hw,AFT_PORT_REG(card,AFT_LINE_CFG_REG), reg);
+	card->hw_iface.bus_write_4(card->hw, AFT_PORT_REG(card, AFT_LINE_CFG_REG), reg);
 	card->u.aft.lcfg_reg=reg;
 
 	card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card,AFT_DMA_CTRL_REG),&reg);
@@ -8328,7 +8394,7 @@
 
 	aft_hwdev[card->wandev.card_type].aft_chip_unconfig(card);
 
-	card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card,AFT_LINE_CFG_REG),&card->u.aft.lcfg_reg);
+	card->hw_iface.bus_read_4(card->hw, AFT_PORT_REG(card, AFT_LINE_CFG_REG),&card->u.aft.lcfg_reg);
 	card->u.aft.lcfg_reg=reg;
 	return 0;
 }
@@ -10168,7 +10234,7 @@
 	u32 reg;
 	
         if (card->u.aft.firm_id == AFT_PMC_FE_CORE_ID) {
-		card->hw_iface.bus_read_4(card->hw,AFT_CHIP_CFG_REG, &reg);
+		card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card, AFT_CHIP_CFG_REG), &reg);
 	
 		if (IS_T1_CARD(card)){
 			if (wan_test_bit(AFT_CHIPCFG_TE1_CFG_BIT,&reg)){
@@ -10261,9 +10327,9 @@
 		wdt_ctrl_reg=AFT_WDT_4TO8_CTRL_REG+(card->wandev.comm_port%4);	
 	}
 	
-	card->hw_iface.bus_read_1(card->hw, wdt_ctrl_reg, &reg);		
+	card->hw_iface.bus_read_1(card->hw, AFT_PORT_REG(card, wdt_ctrl_reg), &reg);		
 	aft_wdt_ctrl_reset(&reg);
-	card->hw_iface.bus_write_1(card->hw, wdt_ctrl_reg, reg);
+	card->hw_iface.bus_write_1(card->hw, AFT_PORT_REG(card, wdt_ctrl_reg), reg);
 }
 
 #if defined(__LINUX__)
@@ -10458,13 +10524,13 @@
 	/* if fe_no_intr is set then only allow disabling of fe interrupt */
 
 	if (!card->fe_no_intr || !status){
-		card->hw_iface.bus_read_4(card->hw,AFT_CHIP_CFG_REG,&reg);
+		card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card, AFT_CHIP_CFG_REG),&reg);
 		if (status){
 			wan_set_bit(AFT_CHIPCFG_FE_INTR_CFG_BIT,&reg);
 		}else{
 			wan_clear_bit(AFT_CHIPCFG_FE_INTR_CFG_BIT,&reg);
 		}
-		card->hw_iface.bus_write_4(card->hw,AFT_CHIP_CFG_REG,reg);
+		card->hw_iface.bus_write_4(card->hw,AFT_PORT_REG(card, AFT_CHIP_CFG_REG),reg);
 	}
 }
 
@@ -10484,7 +10550,7 @@
 		card->u.aft.cfg.data_mux_map=AFT_DEFAULT_DATA_MUX_MAP;
 	}
 	
-	card->hw_iface.bus_write_4(card->hw, AFT_DATA_MUX_REG, 
+	card->hw_iface.bus_write_4(card->hw, AFT_PORT_REG(card, AFT_DATA_MUX_REG), 
 				   card->u.aft.cfg.data_mux_map);		
 
 	DEBUG_EVENT("%s: AFT Data Mux Bit Map: 0x%08X\n",
@@ -10493,7 +10559,7 @@
 
 static void aft_data_mux_get_cfg(sdla_t *card)
 {
-	card->hw_iface.bus_read_4(card->hw, AFT_DATA_MUX_REG, 
+	card->hw_iface.bus_read_4(card->hw, AFT_PORT_REG(card, AFT_DATA_MUX_REG), 
 				   &card->u.aft.cfg.data_mux_map);		
 
 }
@@ -10743,7 +10809,11 @@
 
 	if (card->tdmv_conf.span_no) {
 		if (card->wandev.config_id == WANCONFIG_AFT_ANALOG) {
-			valid_firmware_ver=AFT_MIN_ANALOG_FRMW_VER;
+			if (IS_A600_CARD(card)) {
+				valid_firmware_ver=AFT_MIN_A600_FRMW_VER;
+			} else {
+				valid_firmware_ver=AFT_MIN_ANALOG_FRMW_VER;
+			}
 		}
 	
 		if (card->u.aft.firm_ver < valid_firmware_ver){
@@ -11327,7 +11397,7 @@
 	      &reg);
 
 	card->hw_iface.bus_read_4(card->hw,
-			AFT_PORT_REG(card,AFT_LINE_CFG_REG), &reg);
+			AFT_PORT_REG(card, AFT_LINE_CFG_REG), &reg);
 
 	if (ctrl){
 		wan_set_bit(AFT_LCFG_FIFO_INTR_BIT,&reg);
@@ -11336,7 +11406,7 @@
 	}
 
 	card->hw_iface.bus_write_4(card->hw,
-			AFT_PORT_REG(card,AFT_LINE_CFG_REG), reg);
+			AFT_PORT_REG(card, AFT_LINE_CFG_REG), reg);
 
 	card->u.aft.lcfg_reg=reg;
 
@@ -11358,7 +11428,7 @@
 {
 	u32 reg;
 	card->hw_iface.bus_read_4(card->hw,
-			AFT_PORT_REG(card,AFT_LINE_CFG_REG), &reg);
+			AFT_PORT_REG(card, AFT_LINE_CFG_REG), &reg);
 
 	if (ctrl){
                 wan_set_bit(AFT_LCFG_TDMV_INTR_BIT,&reg);
@@ -12832,7 +12902,7 @@
 
 	/* Due to a hardware bug, only first 0x100 register 
          * controls the clock routing */
-	card->hw_iface.bus_read_4(card->hw,AFT_LINE_CFG_REG,&reg);
+	card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card, AFT_LINE_CFG_REG),&reg);
 	
 	if (line_state == 1){
 		/* The 'Reference' line is connected, enable sync from line interface */
@@ -12855,7 +12925,7 @@
 		wan_clear_bit(A500_LINE_SYNC_MASTER_BIT, &reg);
 	}
 
-	card->hw_iface.bus_write_4(card->hw,AFT_LINE_CFG_REG,reg);
+	card->hw_iface.bus_write_4(card->hw,AFT_PORT_REG(card, AFT_LINE_CFG_REG),reg);
 
 	return 0;
 }
