diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/api/wanec_apilib/wanec_api_lib.c wanpipe-3.3.14b/api/wanec_apilib/wanec_api_lib.c
--- wanpipe-3.3.14/api/wanec_apilib/wanec_api_lib.c	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/api/wanec_apilib/wanec_api_lib.c	2008-10-20 12:02:30.000000000 -0400
@@ -160,6 +160,7 @@
 
 wanec_image_list_t	wanec_image_list[] = 
 	{
+		{ 5,   2, { &wanec_image_64, &wanec_image_32 } },
 		{ 16,  2, { &wanec_image_64, &wanec_image_32 } },
 		{ 32,  2, { &wanec_image_64, &wanec_image_32 } },
 		{ 64,  1, { &wanec_image_64  } },
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/firmware/wan_aftup/wan_aft_flash.c wanpipe-3.3.14b/firmware/wan_aftup/wan_aft_flash.c
--- wanpipe-3.3.14/firmware/wan_aftup/wan_aft_flash.c	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/firmware/wan_aftup/wan_aft_flash.c	2008-10-20 14:04:22.000000000 -0400
@@ -62,7 +62,8 @@
 static int aft_is_protected(wan_aft_cpld_t *cpld, int stype);
 static int aft_flash_id(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id);
 static int aft_reload_flash(wan_aft_cpld_t *cpld, int sector_type);
-static int aft_prg_flash_byte(wan_aft_cpld_t*,int,unsigned long,unsigned char);
+static int aft_write_flash(wan_aft_cpld_t*,int,unsigned long,unsigned char*);
+static int aft_read_flash(wan_aft_cpld_t*,int,int,unsigned long, unsigned char**);
 static unsigned char aft_read_flash_byte(wan_aft_cpld_t*,int,int,unsigned long);
 static int aft_erase_flash_sector(wan_aft_cpld_t*,int,int);
 
@@ -72,8 +73,8 @@
 	aft_is_protected,
 	aft_flash_id,
 	aft_reload_flash,
-	aft_prg_flash_byte,
-	aft_read_flash_byte,
+	aft_write_flash,
+	aft_read_flash,
 	aft_erase_flash_sector
 };
 
@@ -236,6 +237,30 @@
 }
 
 static int
+aft_read_flash(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off, unsigned char** ppdata)
+{
+	int num_bytes = 1;
+	unsigned char* pdata = NULL;
+	unsigned long	sec_off = 0x00;
+	
+	pdata = malloc(num_bytes);
+	if (pdata == NULL) {
+		printf("Failed to allocate memory (%s:%d)\n", 
+				__FUNCTION__,__LINE__);
+		return -ENOMEM;
+	}
+	memset(pdata, 0, num_bytes);
+	
+	if (stype == USER_SECTOR_FLASH){
+		sec_off = USER_SECTOR_START_ADDR;
+       	}
+	*pdata =  __aft_read_flash_byte(cpld, stype, mtype, sec_off + off);
+	*ppdata = pdata;
+	return num_bytes;
+
+}
+
+static int
 aft_erase_flash_sector(wan_aft_cpld_t *cpld, int stype, int verify)
 {
 	unsigned long offset = 0x00;
@@ -248,7 +273,8 @@
 		printf("%s: Default sector protected (%s:%d)!\n",
 				__FUNCTION__,__FILE__,__LINE__);
 		return -EINVAL;
-	}    
+	}
+
 	for(sector_no = 0; sector_no < 8; sector_no++){
 		if (aft_flash_spec[sector_no].sector_type != stype){
 			continue;
@@ -311,12 +337,16 @@
 }
 
 static int
-aft_prg_flash_byte(	wan_aft_cpld_t	*cpld,
+aft_write_flash(	wan_aft_cpld_t	*cpld,
 			int		stype,
 			unsigned long	off32,
-			unsigned char	data)
+			unsigned char*	pdata)
 {
+	unsigned char	data;
 	unsigned char	data1 = 0x00;
+	int num_bytes = 1;
+
+	data = *pdata;
 
 	// Checking write enable to the Default Boot Flash Sector 
 	if (aft_is_protected(cpld, stype)){
@@ -348,7 +378,7 @@
 			}
 		}
 	} while(1);
-	return 0;
+	return num_bytes;
 }
 
 static int aft_reset_flash(wan_aft_cpld_t *cpld)
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/firmware/wan_aftup/wan_aft_flash_shark.c wanpipe-3.3.14b/firmware/wan_aftup/wan_aft_flash_shark.c
--- wanpipe-3.3.14/firmware/wan_aftup/wan_aft_flash_shark.c	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/firmware/wan_aftup/wan_aft_flash_shark.c	2008-10-20 14:04:22.000000000 -0400
@@ -109,23 +109,24 @@
 extern int exec_write_cmd(void*,unsigned int, unsigned int, unsigned int);
 extern void hit_any_key(void);
 
-static int aft_shark_reset_flash(wan_aft_cpld_t *cpld);
-static int aft_shark_is_protected(wan_aft_cpld_t *cpld, int stype);
-static int aft_shark_flash_id(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id);
-static int aft_shark_reload_flash(wan_aft_cpld_t *cpld, int sector_type);
-static int aft_shark_prg_flash_byte(wan_aft_cpld_t*,int,unsigned long,unsigned char);
-static unsigned char aft_shark_read_flash_byte(wan_aft_cpld_t*,int,int,unsigned long);
-static int aft_shark_erase_flash(wan_aft_cpld_t*,int,int);
+static int aft_reset_flash_shark(wan_aft_cpld_t *cpld);
+static int aft_is_protected_shark(wan_aft_cpld_t *cpld, int stype);
+static int aft_flash_id_shark(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id);
+static int aft_reload_flash_shark(wan_aft_cpld_t *cpld, int sector_type);
+static int aft_write_flash_shark(wan_aft_cpld_t*,int, unsigned long,unsigned char*);
+static int aft_read_flash_shark(wan_aft_cpld_t*,int,int,unsigned long, unsigned char**);
+static unsigned char aft_read_flash_byte_shark(wan_aft_cpld_t*,int,int,unsigned long);
+static int aft_erase_flash_shark(wan_aft_cpld_t*,int,int);
 
 aftup_flash_iface_t aftup_shark_flash_iface = 
 {
-	aft_shark_reset_flash,
-	aft_shark_is_protected,
-	aft_shark_flash_id,
-	aft_shark_reload_flash,
-	aft_shark_prg_flash_byte,
-	aft_shark_read_flash_byte,
-	aft_shark_erase_flash
+	aft_reset_flash_shark,
+	aft_is_protected_shark,
+	aft_flash_id_shark,
+	aft_reload_flash_shark,
+	aft_write_flash_shark,
+	aft_read_flash_shark,
+	aft_erase_flash_shark
 };
 
 /******************************************************************************
@@ -174,7 +175,7 @@
 }
 
 static unsigned int
-__aft_shark_write_flash_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off,unsigned char data)
+__aft_write_flash_shark_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off,unsigned char data)
 {
 	unsigned char	offset;
 
@@ -206,18 +207,18 @@
 }
 
 static unsigned int
-aft_shark_write_flash_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off,unsigned char data)
+aft_write_flash_shark_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off,unsigned char data)
 {
 	unsigned long	sec_off = 0x00;
 
 	if (stype == USER_SECTOR_FLASH){
 		sec_off = AFT_SHARK_USER_SECTOR_START_ADDR;
 	}
-	return __aft_shark_write_flash_byte(cpld, stype, mtype, sec_off + off, data);
+	return __aft_write_flash_shark_byte(cpld, stype, mtype, sec_off + off, data);
 }
 
 static unsigned char
-__aft_shark_read_flash_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off)
+__aft_read_flash_byte_shark(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off)
 {
 	unsigned char offset;
         unsigned char data;
@@ -252,17 +253,17 @@
 }
 
 static unsigned char
-aft_shark_read_flash_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off)
+aft_read_flash_byte_shark(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off)
 {
 	unsigned long	sec_off = 0x00;
 	if (stype == USER_SECTOR_FLASH){
 		sec_off = AFT_SHARK_USER_SECTOR_START_ADDR;
 	}
-	return __aft_shark_read_flash_byte(cpld, stype, mtype, sec_off + off);
+	return __aft_read_flash_byte_shark(cpld, stype, mtype, sec_off + off);
 }
 
 static int
-aft_shark_erase_flash(wan_aft_cpld_t *cpld, int stype, int verify)
+aft_erase_flash_shark(wan_aft_cpld_t *cpld, int stype, int verify)
 {
 	unsigned long offset = 0x00;
 	unsigned char data = 0x00;
@@ -273,24 +274,24 @@
 			continue;
 		}
 		offset = aft_shark_flash_spec[cpld->flash_index][sector_no].start_off;
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0x80);
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
-		aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, offset, 0x30);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0x80);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
+		aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, offset, 0x30);
 
 		do{
 //MF			for(i=0;i<100000;i++);
 			usleep(1);
-			data = aft_shark_read_flash_byte(
+			data = aft_read_flash_byte_shark(
 					cpld, stype,
 					MEMORY_TYPE_FLASH,
 					offset);
 			if (data & 0x80){
 				break;
 			}else if (data & 0x20){
-				data = aft_shark_read_flash_byte(
+				data = aft_read_flash_byte_shark(
 						cpld, stype, 
 						MEMORY_TYPE_FLASH, 
 						offset);
@@ -316,7 +317,7 @@
 	// Verify that flash is 0xFF
 	for(offset = 0; offset < 0x80000; offset++){
 //MF		for(i=0;i<10000;i++);
-		data = aft_shark_read_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, offset);	
+		data = aft_read_flash_byte_shark(cpld, stype, MEMORY_TYPE_FLASH, offset);	
 		if (data != 0xFF){
 			printf(" Failed to compare! %05lx -> %02x \n",
 						offset,data);
@@ -332,22 +333,26 @@
 }
 
 static int
-aft_shark_prg_flash_byte(wan_aft_cpld_t *cpld, int stype, unsigned long off32, unsigned char data)
+aft_write_flash_shark(wan_aft_cpld_t *cpld, int stype, unsigned long off32, unsigned char* pdata)
 {
+	unsigned char data;
 	unsigned char data1 = 0x00;
-
-	__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
-	__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
-	__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xA0);
-	aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, off32, data);
+	int num_bytes = 1;
+	
+	data = *pdata;
+	
+	__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
+	__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
+	__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xA0);
+	aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, off32, data);
 
 	do{
 //MF		for(i=0;i<1000;i++);
-		data1 = aft_shark_read_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, off32);
+		data1 = aft_read_flash_byte_shark(cpld, stype, MEMORY_TYPE_FLASH, off32);
 		if ((data1 & 0x80) == (data & 0x80)){
 			break;
 		}else if (data1 & 0x20){
-			data1 = aft_shark_read_flash_byte(
+			data1 = aft_read_flash_byte_shark(
 					cpld, stype, 
 					MEMORY_TYPE_FLASH, 
 					off32);
@@ -360,30 +365,57 @@
 			}
 		}
 	} while(1);
-	return 0;
+	return num_bytes;
 }
 
-static int aft_shark_reset_flash(wan_aft_cpld_t *cpld)
+
+static int
+aft_read_flash_shark(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off, unsigned char** ppdata)
 {
-	__aft_shark_write_flash_byte(cpld, DEF_SECTOR_FLASH, MEMORY_TYPE_FLASH, 0x00, 0xF0);
+	int num_bytes = 1;
+	unsigned char* pdata = NULL;
+	unsigned long	sec_off = 0x00;
+	
+	pdata = malloc(num_bytes);
+	if (pdata == NULL) {
+		printf("Failed to allocate memory (%s:%d)\n", 
+				__FUNCTION__,__LINE__);
+		return -ENOMEM;
+	}
+	memset(pdata, 0, num_bytes);
+	
+	if (stype == USER_SECTOR_FLASH){
+		sec_off = AFT_SHARK_USER_SECTOR_START_ADDR;
+	}	
+
+	*pdata =  __aft_read_flash_byte_shark(cpld, stype, mtype, sec_off + off);
+	*ppdata = pdata;
+	return num_bytes;
+
+}
+
+
+static int aft_reset_flash_shark(wan_aft_cpld_t *cpld)
+{
+	__aft_write_flash_shark_byte(cpld, DEF_SECTOR_FLASH, MEMORY_TYPE_FLASH, 0x00, 0xF0);
 	return 0;
 }
 
-static int aft_shark_is_protected(wan_aft_cpld_t *cpld, int stype)
+static int aft_is_protected_shark(wan_aft_cpld_t *cpld, int stype)
 {
 	return 0;
 }
 
-static int aft_shark_flash_id(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id)
+static int aft_flash_id_shark(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id)
 {
 	unsigned char	man_code, device_code;
 
-	aft_shark_reset_flash(cpld);
-	__aft_shark_write_flash_byte(cpld, stype, mtype, 0xAAA, 0xAA);
-	__aft_shark_write_flash_byte(cpld, stype, mtype, 0x555, 0x55);
-	__aft_shark_write_flash_byte(cpld, stype, mtype, 0xAAA, 0x90);
+	aft_reset_flash_shark(cpld);
+	__aft_write_flash_shark_byte(cpld, stype, mtype, 0xAAA, 0xAA);
+	__aft_write_flash_shark_byte(cpld, stype, mtype, 0x555, 0x55);
+	__aft_write_flash_shark_byte(cpld, stype, mtype, 0xAAA, 0x90);
 
-	man_code = aft_shark_read_flash_byte(cpld, stype, mtype, 0x00);
+	man_code = aft_read_flash_byte_shark(cpld, stype, mtype, 0x00);
 	if (man_code != MCODE_ST){
 		printf("The current flash is not supported (man id %02X)!\n",
 				man_code);
@@ -391,7 +423,7 @@
 	}
 	*flash_id = man_code << 8;
 
-	device_code = aft_shark_read_flash_byte(cpld, stype, mtype, 0x02);
+	device_code = aft_read_flash_byte_shark(cpld, stype, mtype, 0x02);
 	switch(device_code){
 	case DCODE_M29W800DT:
 		cpld->flash_index = M29W800DT_FID;
@@ -406,11 +438,11 @@
 		break;
 	}
 	*flash_id |= device_code;
-	aft_shark_reset_flash(cpld);
+	aft_reset_flash_shark(cpld);
 	return 0;
 }
 
-static int aft_shark_reload_flash(wan_aft_cpld_t *cpld, int sector_type)
+static int aft_reload_flash_shark(wan_aft_cpld_t *cpld, int sector_type)
 {
 	if (sector_type == USER_SECTOR_FLASH){
 		/* Reload new code in to Xilinx from
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/firmware/wan_aftup/wan_aft_flash_shark_ds.c wanpipe-3.3.14b/firmware/wan_aftup/wan_aft_flash_shark_ds.c
--- wanpipe-3.3.14/firmware/wan_aftup/wan_aft_flash_shark_ds.c	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/firmware/wan_aftup/wan_aft_flash_shark_ds.c	2008-10-20 14:04:22.000000000 -0400
@@ -109,23 +109,24 @@
 extern int exec_write_cmd(void*,unsigned int, unsigned int, unsigned int);
 extern void hit_any_key(void);
 
-static int aft_shark_reset_flash(wan_aft_cpld_t *cpld);
-static int aft_shark_is_protected(wan_aft_cpld_t *cpld, int stype);
-static int aft_shark_flash_id(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id);
-static int aft_shark_reload_flash(wan_aft_cpld_t *cpld, int sector_type);
-static int aft_shark_prg_flash_byte(wan_aft_cpld_t*,int,unsigned long,unsigned char);
-static unsigned char aft_shark_read_flash_byte(wan_aft_cpld_t*,int,int,unsigned long);
-static int aft_shark_erase_flash(wan_aft_cpld_t*,int,int);
+static int aft_reset_flash_shark(wan_aft_cpld_t *cpld);
+static int aft_is_protected_shark(wan_aft_cpld_t *cpld, int stype);
+static int aft_flash_id_shark(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id);
+static int aft_reload_flash_shark(wan_aft_cpld_t *cpld, int sector_type);
+static int aft_write_flash_shark(wan_aft_cpld_t*,int,unsigned long,unsigned char*);
+static int aft_read_flash_shark(wan_aft_cpld_t*,int,int,unsigned long,unsigned char**);
+static unsigned char aft_read_flash_shark_byte(wan_aft_cpld_t*,int,int,unsigned long);
+static int aft_erase_flash_shark(wan_aft_cpld_t*,int,int);
 
 aftup_flash_iface_t aftup_shark_flash_ds_iface = 
 {
-	aft_shark_reset_flash,
-	aft_shark_is_protected,
-	aft_shark_flash_id,
-	aft_shark_reload_flash,
-	aft_shark_prg_flash_byte,
-	aft_shark_read_flash_byte,
-	aft_shark_erase_flash
+	aft_reset_flash_shark,
+	aft_is_protected_shark,
+	aft_flash_id_shark,
+	aft_reload_flash_shark,
+	aft_write_flash_shark,
+	aft_read_flash_shark,
+	aft_erase_flash_shark
 };
 
 /******************************************************************************
@@ -157,7 +158,7 @@
 }
 
 static unsigned int
-__aft_shark_write_flash_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off,unsigned char data)
+__aft_write_flash_shark_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off,unsigned char data)
 {
 	unsigned char	offset;
 
@@ -189,18 +190,18 @@
 }
 
 static unsigned int
-aft_shark_write_flash_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off,unsigned char data)
+aft_write_flash_shark_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off,unsigned char data)
 {
 	unsigned long	sec_off = 0x00;
 
 	if (stype == USER_SECTOR_FLASH){
 		sec_off = AFT_SHARK_USER_SECTOR_START_ADDR;
 	}
-	return __aft_shark_write_flash_byte(cpld, stype, mtype, sec_off + off, data);
+	return __aft_write_flash_shark_byte(cpld, stype, mtype, sec_off + off, data);
 }
 
 static unsigned char
-__aft_shark_read_flash_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off)
+__aft_read_flash_shark_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off)
 {
 	unsigned char offset;
         unsigned char data;
@@ -235,17 +236,43 @@
 }
 
 static unsigned char
-aft_shark_read_flash_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off)
+aft_read_flash_shark_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off)
 {
+	
 	unsigned long	sec_off = 0x00;
 	if (stype == USER_SECTOR_FLASH){
 		sec_off = AFT_SHARK_USER_SECTOR_START_ADDR;
 	}
-	return __aft_shark_read_flash_byte(cpld, stype, mtype, sec_off + off);
+	return __aft_read_flash_shark_byte(cpld, stype, mtype, sec_off + off);
 }
 
 static int
-aft_shark_erase_flash(wan_aft_cpld_t *cpld, int stype, int verify)
+aft_read_flash_shark(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off, unsigned char** ppdata)
+{
+	int num_bytes = 1;
+	unsigned char* pdata = NULL;
+	unsigned long	sec_off = 0x00;
+	
+	pdata = malloc(num_bytes);
+	if (pdata == NULL) {
+		printf("Failed to allocate memory (%s:%d)\n", 
+				__FUNCTION__,__LINE__);
+		return -ENOMEM;
+	}
+	memset(pdata, 0, num_bytes);
+	
+	if (stype == USER_SECTOR_FLASH){
+		sec_off = AFT_SHARK_USER_SECTOR_START_ADDR;
+	}	
+
+	*pdata =  __aft_read_flash_shark_byte(cpld, stype, mtype, sec_off + off);
+	*ppdata = pdata;
+	return num_bytes;
+}
+
+
+static int
+aft_erase_flash_shark(wan_aft_cpld_t *cpld, int stype, int verify)
 {
 	unsigned long offset = 0x00;
 	unsigned char data = 0x00;
@@ -256,24 +283,24 @@
 			continue;
 		}
 		offset = aft_shark_flash_ds_spec[cpld->flash_index][sector_no].start_off;
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0x80);
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
-		aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, offset, 0x30);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0x80);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
+		aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, offset, 0x30);
 
 		do{
 //MF			for(i=0;i<100000;i++);
 			usleep(1);
-			data = aft_shark_read_flash_byte(
+			data = aft_read_flash_shark_byte(
 					cpld, stype,
 					MEMORY_TYPE_FLASH,
 					offset);
 			if (data & 0x80){
 				break;
 			}else if (data & 0x20){
-				data = aft_shark_read_flash_byte(
+				data = aft_read_flash_shark_byte(
 						cpld, stype, 
 						MEMORY_TYPE_FLASH, 
 						offset);
@@ -295,11 +322,10 @@
 	}
 	printf("\r\tErasing sectors\t\t\t\tPassed\n");
 	if (!verify) return 0;
-	
 	// Verify that flash is 0xFF
 	for(offset = 0; offset < 0x80000; offset++){
 //MF		for(i=0;i<10000;i++);
-		data = aft_shark_read_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, offset);	
+		data = aft_read_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, offset);	
 		if (data != 0xFF){
 			printf(" Failed to compare! %05lx -> %02x \n",
 						offset,data);
@@ -315,22 +341,26 @@
 }
 
 static int
-aft_shark_prg_flash_byte(wan_aft_cpld_t *cpld, int stype, unsigned long off32, unsigned char data)
+aft_write_flash_shark(wan_aft_cpld_t *cpld, int stype, unsigned long off32, unsigned char* pdata)
 {
+	unsigned char data;
 	unsigned char data1 = 0x00;
+	int num_bytes = 1;
+	
+	data = *pdata;
 
-	__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
-	__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
-	__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xA0);
-	aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, off32, data);
+	__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
+	__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
+	__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xA0);
+	aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, off32, data);
 
 	do{
 //MF		for(i=0;i<1000;i++);
-		data1 = aft_shark_read_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, off32);
+		data1 = aft_read_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, off32);
 		if ((data1 & 0x80) == (data & 0x80)){
 			break;
 		}else if (data1 & 0x20){
-			data1 = aft_shark_read_flash_byte(
+			data1 = aft_read_flash_shark_byte(
 					cpld, stype, 
 					MEMORY_TYPE_FLASH, 
 					off32);
@@ -343,30 +373,30 @@
 			}
 		}
 	} while(1);
-	return 0;
+	return num_bytes ;
 }
 
-static int aft_shark_reset_flash(wan_aft_cpld_t *cpld)
+static int aft_reset_flash_shark(wan_aft_cpld_t *cpld)
 {
-	__aft_shark_write_flash_byte(cpld, DEF_SECTOR_FLASH, MEMORY_TYPE_FLASH, 0x00, 0xF0);
+	__aft_write_flash_shark_byte(cpld, DEF_SECTOR_FLASH, MEMORY_TYPE_FLASH, 0x00, 0xF0);
 	return 0;
 }
 
-static int aft_shark_is_protected(wan_aft_cpld_t *cpld, int stype)
+static int aft_is_protected_shark(wan_aft_cpld_t *cpld, int stype)
 {
 	return 0;
 }
 
-static int aft_shark_flash_id(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id)
+static int aft_flash_id_shark(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id)
 {
 	unsigned char	man_code, device_code;
 
-	aft_shark_reset_flash(cpld);
-	__aft_shark_write_flash_byte(cpld, stype, mtype, 0xAAA, 0xAA);
-	__aft_shark_write_flash_byte(cpld, stype, mtype, 0x555, 0x55);
-	__aft_shark_write_flash_byte(cpld, stype, mtype, 0xAAA, 0x90);
+	aft_reset_flash_shark(cpld);
+	__aft_write_flash_shark_byte(cpld, stype, mtype, 0xAAA, 0xAA);
+	__aft_write_flash_shark_byte(cpld, stype, mtype, 0x555, 0x55);
+	__aft_write_flash_shark_byte(cpld, stype, mtype, 0xAAA, 0x90);
 
-	man_code = aft_shark_read_flash_byte(cpld, stype, mtype, 0x00);
+	man_code = aft_read_flash_shark_byte(cpld, stype, mtype, 0x00);
 	if (man_code != MCODE_ST){
 		printf("The current flash is not supported (man id %02X)!\n",
 				man_code);
@@ -374,7 +404,7 @@
 	}
 	*flash_id = man_code << 8;
 
-	device_code = aft_shark_read_flash_byte(cpld, stype, mtype, 0x02);
+	device_code = aft_read_flash_shark_byte(cpld, stype, mtype, 0x02);
 	switch(device_code){
 	case DCODE_M29W800DT:
 		cpld->flash_index = M29W800DT_FID;
@@ -389,11 +419,11 @@
 		break;
 	}
 	*flash_id |= device_code;
-	aft_shark_reset_flash(cpld);
+	aft_reset_flash_shark(cpld);
 	return 0;
 }
 
-static int aft_shark_reload_flash(wan_aft_cpld_t *cpld, int sector_type)
+static int aft_reload_flash_shark(wan_aft_cpld_t *cpld, int sector_type)
 {
 	if (sector_type == USER_SECTOR_FLASH){
 		/* Reload new code in to Xilinx from
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/firmware/wan_aftup/wan_aft_prg.c wanpipe-3.3.14b/firmware/wan_aftup/wan_aft_prg.c
--- wanpipe-3.3.14/firmware/wan_aftup/wan_aft_prg.c	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/firmware/wan_aftup/wan_aft_prg.c	2008-10-20 14:04:22.000000000 -0400
@@ -179,7 +179,7 @@
 			  FUNCTION PROTOTYPES
  ******************************************************************************
 */
-		
+
 static unsigned long filesize(FILE* f)
 {
 	unsigned long size = 0;
@@ -333,8 +333,9 @@
 	char		line[MAX_HEX_LINE_LEN];
 	int		data[MAX_HEX_LINE_LEN];
 	int		seg = 0, addr;
-	int		len, type, i, err;
-	unsigned char	val;
+	int		len, type, i;
+	unsigned char*	val;
+	int 		page_size;
 	
 	if (cmd == CMD_FLASH_PRG){
 		cpld->iface->erase(cpld, stype, 0);
@@ -373,40 +374,24 @@
 		i = 0;
 		while(i < len){
 			if (cmd == CMD_FLASH_PRG){
-				err = cpld->iface->prg_byte(
-							cpld,
-							stype,
-							seg+addr+i,
-							data[i]);
-				//err = prg_flash_byte(
-				//		cpld,
-				//		stype,
-				//		seg+addr+i,
-				//		data[i]);
-				if (err){
+				page_size = cpld->iface->prg(cpld, stype, seg+addr+i, (u8*) &data[i]);
+				if (page_size < 0){
 					printf("\r\tUpdating flash\t\t\t\tFailed(%x)\n",
 								addr+i);
 					fclose(f);
 					return -EINVAL;
 				}
 			}else{
-				val = cpld->iface->read_byte(
-							cpld,
-							stype,
-							MEMORY_TYPE_FLASH,
-							seg+addr+i);
-				//val = read_flash(
-				//		cpld, stype, 
-				//		MEMORY_TYPE_FLASH,
-				//		seg+addr+i);
-				if (val != (unsigned char)data[i]){
+				page_size = cpld->iface->read(cpld, stype, MEMORY_TYPE_FLASH, seg+addr+i, &val);
+
+				if (memcmp(&data[i], val, page_size)) {
 					printf("\r\tVerification\t\t\t\tFailed(%x)\n",
-								addr+i);
+						addr+i);
 					fclose(f);
 					return -EINVAL;
 				}
 			}
-			i++;
+			i+=page_size;
 		}
 		if (cmd == CMD_FLASH_PRG){
 			progress_bar("\tUpdating flash\t\t\t\t",0,0);
@@ -424,14 +409,16 @@
 	return 0;
 }
 
+
 static int
-aft_flash_bin_file(wan_aft_cpld_t *cpld, int stype, char *filename, int cmd)
+aft_flash_bin_file (wan_aft_cpld_t *cpld, int stype, char *filename, int cmd)
 {
-	char		*data = NULL;
+	char*		data = NULL;
+	u8*		tmp_data_read;
 	unsigned long	findex = 0;
 	long		fsize = 0;
-	char	val;
-	int	i;
+	int 		page_size;
+	int		i;
 
 	fsize = read_bin_data_file(filename, &data);
 	if (fsize < 0){
@@ -441,24 +428,31 @@
 	if (cmd == CMD_FLASH_PRG){
 		cpld->iface->erase(cpld, stype, 0);
 	}
-	while(findex < fsize){
+	
+	while (findex < fsize) {
 		if (cmd == CMD_FLASH_PRG){
-			cpld->iface->prg_byte(cpld, stype, findex, data[findex]);
-			//prg_flash_byte(cpld, stype, offset+findex, data[findex]);
-		}else{
-			val = cpld->iface->read_byte(cpld, stype, MEMORY_TYPE_FLASH, findex);
-			//val = read_flash(
-			//		cpld, stype,
-			//		MEMORY_TYPE_FLASH,
-			//		offset+findex);
-			if (val != data[findex]){
+			page_size = cpld->iface->prg(cpld, stype, findex, (u8*)&data[findex]);
+		} else {
+			page_size = cpld->iface->read(cpld, stype, MEMORY_TYPE_FLASH, findex, &tmp_data_read);
+			if (memcmp(&data[findex], tmp_data_read, page_size)) {
 				printf("\r\tVerification\t\t\t\tFailed(%lx)\n",
-						findex);
+					findex);
 				free(data);
 				return -EINVAL;
 			}
 		}
-		findex++;
+		if (page_size < 0) {
+			if (cmd == CMD_FLASH_PRG) {
+				printf("\r\tUpdating\t\t\t\tFailed(%lx)\n",
+						findex);
+			} else {
+				printf("\r\tVerification\t\t\t\tFailed(%lx)\n",
+						findex);
+			}
+			free(data);
+			return -EINVAL;
+		}
+		findex += page_size;
 		for(i=0;i<1000;i++);
 		if ((findex & 0x1FFF) == 0x1000){
 			if (cmd == CMD_FLASH_PRG){
@@ -469,25 +463,28 @@
 							findex, fsize);
 			}
 		}
-	}
+	}	
+
 	if (cmd == CMD_FLASH_PRG){
 		printf("\r\tUpdating flash\t\t\t\tPassed\n");
 	}else{
 		printf("\r\tVerification\t\t\t\tPassed\n");
 	}
+
 	fflush(stdout);
 	free(data);
 	return 0;
+	
 }
 
 static int
 prg_flash_data(wan_aft_cpld_t *cpld, int stype, char *filename, int type)
 {
 	switch(type){
-	case HEX_FILE:
-		return aft_flash_hex_file(cpld, stype, filename, CMD_FLASH_PRG);
-	case BIN_FILE:
-		return aft_flash_bin_file(cpld, stype, filename, CMD_FLASH_PRG);
+		case HEX_FILE:
+			return aft_flash_hex_file(cpld, stype, filename, CMD_FLASH_PRG);
+		case BIN_FILE:
+			return aft_flash_bin_file(cpld, stype, filename, CMD_FLASH_PRG);
 	}
 	return -EINVAL;
 }
@@ -496,12 +493,12 @@
 verify_flash_data(wan_aft_cpld_t *cpld, int stype, char *filename, int type)
 {
 	switch(type){
-	case HEX_FILE:
-		return aft_flash_hex_file(cpld, stype, filename, CMD_FLASH_VERIFY);
-	case BIN_FILE:
-		return aft_flash_bin_file(cpld, stype, filename, CMD_FLASH_VERIFY);
+		case HEX_FILE:
+			return aft_flash_hex_file(cpld, stype, filename, CMD_FLASH_VERIFY);
+		case BIN_FILE:
+			return aft_flash_bin_file(cpld, stype, filename, CMD_FLASH_VERIFY);
 	}
-	return -EINVAL;
+	return -EINVAL;	
 }
 
 int update_flash(wan_aft_cpld_t *cpld, int stype, int mtype, char* filename)
@@ -535,9 +532,16 @@
 int board_reset(wan_aft_cpld_t *cpld, int clear)
 {
 	unsigned int	data;
+	unsigned int 	iface_reg_off;
+
+	if (cpld->core_info->board_id == AFT_A600_SUBSYS_VENDOR) {
+		iface_reg_off = 0x1040;	
+	} else {
+		iface_reg_off = 0x40;	
+	}
 
 	/* Release board internal reset (AFT-T1/E1/T3/E3 */
-	if (exec_read_cmd(cpld->private, 0x40, 4, &data)){
+	if (exec_read_cmd(cpld->private, iface_reg_off, 4, &data)){
 		printf("Failed access (read) to the board!\n");
 		return -EINVAL;
 	}
@@ -614,12 +618,16 @@
 		if (clear) data &= ~0x06;
 	       	else data |= 0x06;
 		break;
+	case AFT_A600_SUBSYS_VENDOR:
+		if (clear) data &= ~0x06;
+	       	else data |= 0x06;
+		break;
 	default:
 		printf("Unsupported card type (board_id=%X)!\n", cpld->core_info->board_id);		
 		return -EINVAL;
 	}
 
-	if (exec_write_cmd(cpld->private, 0x40,4,data)){
+	if (exec_write_cmd(cpld->private, iface_reg_off,4,data)){
 		printf("Failed access (write) to the board!\n");
 		return -EINVAL;
 	}
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/firmware/wan_aftup/wan_aft_prg.h wanpipe-3.3.14b/firmware/wan_aftup/wan_aft_prg.h
--- wanpipe-3.3.14/firmware/wan_aftup/wan_aft_prg.h	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/firmware/wan_aftup/wan_aft_prg.h	2008-10-20 14:04:22.000000000 -0400
@@ -1,6 +1,8 @@
 #ifndef __WAN_AFT_PRG_H
 # define __WAN_AFT_PRG_H
 
+#define u32 unsigned int
+#define u8 unsigned char
 
 #define MEMORY_TYPE_SRAM	0x00
 #define MEMORY_TYPE_FLASH	0x01
@@ -34,9 +36,12 @@
 #define AFT_CORE_SIZE		234456
 #define AFT4_CORE_SIZE		212392
 #define AFT_CORE_X200_SIZE	130952
+#define AFT_CORE_X250_SIZE	169216
 #define AFT_CORE_X400_SIZE	212392
 #define AFT_CORE_X1000_SIZE	402936
 
+#define A600_EEPROM_PAGE_SIZE	0x04
+
 
 struct wan_aft_cpld_;
 typedef struct {
@@ -44,11 +49,12 @@
 	int	(*is_protected)(struct wan_aft_cpld_*,int stype);
 	int	(*flash_id)(struct wan_aft_cpld_*, int mtype, int stype, int*);
 	int 	(*reload)(struct wan_aft_cpld_*, int stype);
-	int	(*prg_byte)(struct wan_aft_cpld_*, int, unsigned long, unsigned char);
-	unsigned char	(*read_byte)(struct wan_aft_cpld_*, int, int, unsigned long);
+	int	(*prg)(struct wan_aft_cpld_*, int, unsigned long, u8*);
+	int     (*read)(struct wan_aft_cpld_*, int, int, unsigned long, u8**);
 	int	(*erase)(struct wan_aft_cpld_*, int stype, int verify);
 } aftup_flash_iface_t;
 
+
 typedef struct {
 	int	id;
 	int	size;
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/firmware/wan_aftup/wan_aftup.c wanpipe-3.3.14b/firmware/wan_aftup/wan_aftup.c
--- wanpipe-3.3.14/firmware/wan_aftup/wan_aftup.c	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/firmware/wan_aftup/wan_aftup.c	2008-10-20 16:15:19.000000000 -0400
@@ -1,10 +1,9 @@
-/*
+/******************************************************************************
 **	History
 **-----------------------------------------------------------------
 **	  Date		Name		Description
 **-----------------------------------------------------------------
-**
-**
+**	
 **	24 Dec 2004	Alex Feldman	Initial version for Linux OS.
 **					(version 1.2)
 **	14 Jan 2005	Alex Feldman	Support OpenBSD OS.
@@ -22,9 +21,15 @@
 **					* PLX update 
 **					(version 1.6)
 **	22 Jan 2007	Alex Feldman	* Add new option to command line
-**					* Force Flash update with specific filename
-**					(version 1.7)
-**/
+**					* Force Flash update with specific 
+**					  filename (version 1.7)
+**	08 Aug 2008	Alex Feldman	* Add USB-FXO firmware update
+**					  (version 1.8)
+**	16 Oct 2008	David Yat Sin	* Added A600 firmware update
+					* Added Tundra and PLX update from *.dat
+					  format files
+					  (version 1.9)
+*******************************************************************************/
 
 #include <stdlib.h>
 #include <stdio.h>
@@ -61,18 +66,22 @@
 
 #include "wan_aft_prg.h"
 #include "wan_aftup.h"
+#include "wan_pcie_ctrl.h"
 
 /***********************************************************************
 **			D E F I N E S / M A C R O S
 ***********************************************************************/
-#define WAN_AFTUP_VERSION	"1.7"
+#define WAN_AFTUP_VERSION	"1.9"
 
-#define WAN_AFTUP_NONE		0x00
-#define WAN_AFTUP_AUTO		0x01
-#define WAN_AFTUP_FORCE_FIRM	0x02
-#define WAN_AFTUP_PCIEXPRESS	0x04
+#define WAN_AFTUP_NONE			0x00
+#define WAN_AFTUP_AUTO			0x01
+#define WAN_AFTUP_FORCE_FIRM		0x02
+#define WAN_AFTUP_PCIEXPRESS		0x04
+#define WAN_AFTUP_USBFXO		0x08
+#define WAN_AFTUP_PCIEXPRESS_TUNDRA 	0x10
 
-#define DYDBG printf("DYDBG:(%s,%d)\n",__FUNCTION__,__LINE__);
+
+#define WAN_IFNAME_SZ IFNAMSIZ
 
 /***********************************************************************
 **			G L O B A L  V A R I A B L E S
@@ -86,13 +95,17 @@
 
 extern aftup_flash_iface_t aftup_flash_iface;
 extern aftup_flash_iface_t aftup_shark_flash_iface;
+extern aftup_flash_iface_t aftup_a600_flash_iface;
 
 extern aftup_flash_t	aft_flash;
 extern aftup_flash_t	aft4_flash;
 extern aftup_flash_t	aft_shark_flash;
 extern aftup_flash_t	aft_shark_flash_ds;
+extern aftup_flash_t	aft_a600_flash;
+
+extern pcie_bridge_iface_t aft_pci_bridge_iface_tundra;
+extern pcie_bridge_iface_t aft_pci_bridge_iface_plx;
 
-	
 WAN_LIST_HEAD(wan_aftup_head_t, wan_aftup_) wan_aftup_head = 
 			WAN_LIST_HEAD_INITIALIZER(wan_aftup_head);
 
@@ -137,13 +150,14 @@
 	  "A056_0040_V", "A056_0040_V*.BIN", AFT_CORE_X400_SIZE },
 	{ AFT_ISDN_BRI_SHARK_SUBSYS_VENDOR, AFT_CHIP_X400, AFT_HDLC_CORE_ID, 0x01, 0x4F,	
 	  "A500_0040_V", "A500_0040_V*.BIN", AFT_CORE_X400_SIZE },
-#if 1
 	{ AFT_2SERIAL_RS232_SUBSYS_VENDOR, AFT_CHIP_X1000, AFT_HDLC_CORE_ID, 0x01, 0x4F,	
 	  "A140_0100_V", "A140_0100_V*.BIN", AFT_CORE_X1000_SIZE },
 
 	{ AFT_4SERIAL_RS232_SUBSYS_VENDOR, AFT_CHIP_X1000, AFT_HDLC_CORE_ID, 0x01, 0x4F,	
 	  "A140_0100_V", "A140_0100_V*.BIN", AFT_CORE_X1000_SIZE },
-#endif
+	{ AFT_A600_SUBSYS_VENDOR, AFT_CHIP_X250, AFT_ANALOG_FE_CORE_ID, 0x20, 0x5B,	
+	  "A600_0025_V", "A600_0025_V*.BIN", AFT_CORE_X250_SIZE },
+
 #if 0
 	{ AFT_TE1_ATM_CORE_ID,	
 	  NULL, NULL, 0x00,
@@ -155,55 +169,6 @@
 	{ 0x00, 0x00, 0x00, 0x00, 0x00, NULL, NULL, 0x00 }
 };
 
-struct wan_aftup_plxctrl_data_ {
-	unsigned char	off;
-	unsigned char	value;
-} plxctrl_data [] =
-	{
-		{ 0x00, 0x5A },
-		{ 0x01, 0x01 },
-		{ 0x02, 0x24 },
-		{ 0x03, 0x00 },
-		{ 0x04, 0x48 },
-		{ 0x05, 0x00 },
-		{ 0x06, 0x11 },
-		{ 0x07, 0x2C },
-		{ 0x08, 0x0E },
-		{ 0x09, 0x00 },
-		{ 0x0A, 0x0C },
-		{ 0x0B, 0x10 },
-		{ 0x0C, 0x10 },		{ 0x0D, 0x80 },
-		{ 0x0E, 0xFE },
-		{ 0x0F, 0x0B },
-		{ 0x10, 0x10 },
-		{ 0x11, 0x00 },
-		{ 0x12, 0x08 },
-		{ 0x13, 0x00 },
-		{ 0x14, 0x00 },
-		{ 0x15, 0x00 },
-		{ 0x16, 0x0C },
-		{ 0x17, 0x00 },
-		{ 0x18, 0x00 },
-		{ 0x19, 0xFE },
-		{ 0x1A, 0x01 },
-		{ 0x1B, 0x00 },
-		{ 0x1C, 0x48 },
-		{ 0x1D, 0x10 },
-		{ 0x1E, 0x20 },
-		{ 0x1F, 0x00 },
-		{ 0x20, 0x05 },
-		{ 0x21, 0x00 },
-		{ 0x22, 0x0C },
-		{ 0x23, 0x00 },
-		{ 0x24, 0x00 },
-		{ 0x25, 0xFE },
-		{ 0x26, 0x01 },
-		{ 0x27, 0x00 },
-		{ 0xFC, 0x19 },	/* Sangoma vendor ID		*/
-		{ 0xFD, 0x23 },	/* Sangoma vendor ID		*/
-		{ 0xFE, 0x00 },	/* Sangoma PLX config verion	*/
-		{ 0xFF, 0x02 }	/* Sangoma PLX config verion	*/
-	};
 
 /******************************************************************************
 			  FUNCTION PROTOTYPES
@@ -231,6 +196,7 @@
 extern unsigned char wan_plxctrl_read_ebyte(void*, unsigned char,int);
 extern void wan_plxctrl_write_ebyte(void*, unsigned char, unsigned char);
 
+	
 /******************************************************************************
 *			  FUNCTION DEFINITION	
 ******************************************************************************/
@@ -255,7 +221,8 @@
 	fflush(stdout);
 	return 0;
 }
-static int MakeConnection(char *ifname) 
+
+int MakeConnection(char *ifname) 
 {
 #if defined(__LINUX__)
 	char			error_msg[100];
@@ -301,7 +268,7 @@
 
 }
 
-static int CloseConnection(char *ifname)
+int CloseConnection(char *ifname)
 {
 	close(sock);
 	return 0;
@@ -361,7 +328,7 @@
 		aft->cpld.iface	= &aftup_shark_flash_iface;
 	}else if (strncmp(type,"AFT-A500",8) == 0){
 		//strcpy(aft->prefix_fw, "AFT_RM");
-		aft->cpld.adptr_type = AFT_ADPTR_ISDN;
+		aft->cpld.adptr_type  = AFT_ADPTR_ISDN;
 		aft->cpld.iface	= &aftup_shark_flash_iface;
 	}else if (strncmp(type,"AFT-A142",8) == 0){
 		//strcpy(aft->prefix_fw, "AFT_RM");
@@ -371,7 +338,11 @@
 		//strcpy(aft->prefix_fw, "AFT_RM");
 		aft->cpld.adptr_type = AFT_ADPTR_4SERIAL_RS232;
 		aft->cpld.iface	= &aftup_shark_flash_iface;
+	}else if (strncmp(type,"AFT-A600",8) == 0){
+		aft->cpld.adptr_type = AFT_ADPTR_A600;
+		aft->cpld.iface	= &aftup_a600_flash_iface;
 	}else{
+		printf("ERROR: Unknown Sangoma Card type %s!\n", type);
 		return -EINVAL;
 	}
 	return 0;
@@ -551,7 +522,11 @@
 		aft->cpld.iface->reload(&aft->cpld, USER_SECTOR_FLASH);
 	}
 
-	usleep(1000000);
+	if (aft->board_id == AFT_A600_SUBSYS_VENDOR) {
+		usleep(3000000);
+	} else {
+		usleep(1000000);
+	}
 
 	/* Read flash revision */
 	if (wan_aftup_ioctl(&api_cmd, SIOC_WAN_SET_PCI_BIOS, aft->if_name)){
@@ -608,6 +583,53 @@
 	return 0;	
 }
 
+static int aft_a200_a400_warning(wan_aftup_t *aft)
+{
+	char   	sel[20];
+        int	warning=0;
+	
+        if (aft->board_id == A200_REMORA_SHARK_SUBSYS_VENDOR &&
+	    (aft->flash_rev == 7 || 
+	     aft->flash_rev == 8)) {
+       		warning=1; 	
+       	}      
+
+	if (!warning) {
+		return 0;
+	}
+
+	
+        printf ("\n");
+        printf ("WARNING: User Confirmation Required!\n");
+        printf ("------------------------------------\n");
+	printf ("Please confirm your hardware type, an\n");
+	printf ("incorrect choice will corrupt the firmware.\n");
+	printf ("If firmware gets corrupted, a firmware recovery procedure\n");
+	printf ("using a jumper will have to be invoked to recover the card. \n");
+	printf ("For recovery procedures refer to: wiki.sangoma.com \n");
+        printf ("------------------------------------\n\n");
+        printf ("Please confirm hardware type:\n");
+	printf (" 1. A200 (front end connector RJ45)\n");
+	printf (" 2. A400 (front end connector DB25)\n");
+	printf (" Select: [1|2|q]:");
+
+	if (scanf("%s", sel)){
+	       	if (strcmp(sel, "q") == 0){
+	       		return -EINVAL;
+		} else if (strcmp(sel, "1") == 0) {
+			return 0;
+		} else if (strcmp(sel, "2") == 0) {
+			aft->board_id=A400_REMORA_SHARK_SUBSYS_VENDOR;
+			return 0;
+		} else {
+                 	return aft_a200_a400_warning(aft);
+		}
+	}
+
+	printf ("\nError: Invalid Selection %s\n",sel);
+	return -EINVAL;	
+}
+
 static int wan_aftup_program(struct wan_aftup_head_t *head)
 {
 	wan_aftup_t	*aft = NULL;
@@ -615,6 +637,7 @@
 	int		err, i;
 
 	WAN_LIST_FOREACH(aft, head, next){
+
 		if (MakeConnection(aft->if_name)){
 			printf("%s: Failed to create socket to the driver!\n",
 						 aft->if_name);
@@ -741,6 +764,9 @@
 		case AFT_4SERIAL_RS232_SUBSYS_VENDOR:
 			aft->cpld.iface	= &aftup_shark_flash_iface;
 			break;
+		case AFT_A600_SUBSYS_VENDOR:
+			aft->cpld.iface	= &aftup_a600_flash_iface;
+			break;
 		default:
 			printf("\n%s: These board are not supported (subvendor_id=%04X)!\n",
 						aft->if_name,
@@ -784,6 +810,10 @@
 			aft->cpld.chip_id = AFT_CHIP_X1000;
 			aft->cpld.flash	= &aft_shark_flash;
 			break;
+		case AFT_A600_SUBSYS_VENDOR:
+			aft->cpld.chip_id = AFT_CHIP_X250;
+			aft->cpld.flash = &aft_a600_flash;
+			break;
 		case AFT_1TE1_SHARK_SUBSYS_VENDOR:
 		case AFT_2TE1_SHARK_SUBSYS_VENDOR:
 		case AFT_8TE1_SHARK_SUBSYS_VENDOR:
@@ -795,8 +825,8 @@
 			goto program_done;
 			break;
 		}
+		
 #endif
-
 		if (wan_aftup_program_card(aft)){
 			printf("\n%s: Failed to re-program flash!\n",
 						aft->if_name);
@@ -811,13 +841,27 @@
 	return 0;
 }
 
-static int wan_aftup_verify_pciexpress(struct wan_aftup_head_t *head)
+static int wan_pcie_ctrl(struct wan_aftup_head_t *head)
 {
+	char conf_file [50];
 	wan_aftup_t	*aft = NULL;
-	unsigned char	tmp = 0x00;
-	int		i,regs_no = 0, update = 0;
+	pcie_eeprom_info_t eeprom_info;
+	pcie_bridge_iface_t pcie_iface;
+	int i;
+	int err = 0;
+	u8 byte;
 
-	regs_no = sizeof(plxctrl_data)/sizeof(struct wan_aftup_plxctrl_data_);
+	memset(&pcie_iface, 0, sizeof(pcie_bridge_iface_t));
+
+	memset(&conf_file, 0, sizeof(conf_file));
+	if (options & WAN_AFTUP_PCIEXPRESS_TUNDRA) {
+		pcie_iface = aft_pci_bridge_iface_tundra;
+		sprintf(&conf_file[0], "pcie_bridge_tundra.dat");
+	} else {
+		pcie_iface = aft_pci_bridge_iface_plx;
+		sprintf(&conf_file[0], "pcie_bridge_plx.dat");
+	}
+	
 	WAN_LIST_FOREACH(aft, head, next){
 		switch(aft->board_id){
 		case AFT_1TE1_SHARK_SUBSYS_VENDOR:
@@ -827,6 +871,7 @@
 			break;
 		case A200_REMORA_SHARK_SUBSYS_VENDOR:
 		case A400_REMORA_SHARK_SUBSYS_VENDOR:
+		case AFT_A600_SUBSYS_VENDOR:
 			break;
 		case A300_UTE3_SHARK_SUBSYS_VENDOR:
 			break;
@@ -840,46 +885,73 @@
 		default:
 			continue;
 		}
+		
 		if (MakeConnection(aft->if_name)){
 			printf(
 			"%s: Failed to create socket to the driver!\n",
 						 aft->if_name);
 			continue;
 		}
-
-		tmp = wan_plxctrl_read_ebyte(aft, (unsigned char)0x00,1);
-		if (tmp != 0x5A){
-			continue;
+		
+		memset(&eeprom_info, 0, sizeof(pcie_eeprom_info_t));
+		if (parse_pcie_reg_dat(&eeprom_info, &conf_file[0])) {
+			printf("\nFailed to parse %s \n", conf_file);
+			err = 1;
+			goto wan_pcie_ctrl_done;
 		}
-		for(i = 0; i < regs_no; i++){		
-			tmp = wan_plxctrl_read_ebyte(
-						aft,
-						plxctrl_data[i].off, 0);
-			if (tmp == plxctrl_data[i].value){
-				continue;		
+
+		if(pcie_iface.gen_eeprom_image(&eeprom_info)) {
+			printf("Failed to generate PCIe bridge image %s\n", 
+						conf_file);
+			err = 1;
+			goto wan_pcie_ctrl_done;
+		} 
+		
+		/* Program EEPROM */
+		printf("Updating PCI Express Bridge settings\n");
+		for(i = 0; i < eeprom_info.num_eeprom_bytes; i++) {
+			err = pcie_iface.write_byte(aft,
+					eeprom_info.image_vals[i].off,
+					eeprom_info.image_vals[i].value);
+					
+			if (err) {
+				printf("Failed to write to PCI-e bridge eeprom\n");
+				err = 1;
+				goto wan_pcie_ctrl_done;
 			}
-			if (!update){
-				printf(
-       				"Updating PCI Express Bridge settings");
+		}
+		
+		/* Verify EEPROM */
+		printf("Verifying PCI Express Bridge settings\n");
+		for(i = 0; i < eeprom_info.num_eeprom_bytes; i++) {
+			byte = 0x00;
+			err = pcie_iface.read_byte(aft,
+					eeprom_info.image_vals[i].off,
+					&byte);
+					
+			if (err) {
+				printf("Failed to read from PCI-e bridge eeprom\n");
+				err = 1;
+				goto wan_pcie_ctrl_done;
 			}
-			wan_plxctrl_write_ebyte(aft, 
-						plxctrl_data[i].off, 
-						plxctrl_data[i].value);
-			tmp = wan_plxctrl_read_ebyte(
-						aft,
-						plxctrl_data[i].off,0);
-			printf(".");
-			if (tmp != plxctrl_data[i].value){
-				printf("\tFailed (verification:%X:%X:%X)!\n\n",
-						plxctrl_data[i].off,tmp,plxctrl_data[i].value);
+			
+			if (byte != eeprom_info.image_vals[i].value) {
+				printf("Failed verification (%X, %X %X)\n",
+					i, 
+					byte, eeprom_info.image_vals[i].value);
+
 				printf("\tPlease call Sangoma Technical Support at 905.474.1990!\n\n");
-				return -EINVAL;
+				err = 1;
+				goto wan_pcie_ctrl_done;
 			}
-			update = 1;
-		}			
+		}
+		printf("PCI Express Bridge settings updated to version:%d\n", eeprom_info.version);
+		err = pcie_iface.reload(aft);
 		CloseConnection(aft->if_name);
 	}
-	return update;
+
+wan_pcie_ctrl_done:
+	return err;
 }
 
 static int wan_aftup_parse_hwprobe(wan_cmd_api_t *api_cmd)
@@ -1035,8 +1107,11 @@
 	}
 
 	/* Extra code here */
-	if (options & WAN_AFTUP_PCIEXPRESS){
-		err = wan_aftup_verify_pciexpress(&wan_aftup_head);
+	if (options & WAN_AFTUP_PCIEXPRESS || 
+	    options & WAN_AFTUP_PCIEXPRESS_TUNDRA){
+	
+		err = wan_pcie_ctrl(&wan_aftup_head);
+		//err = wan_aftup_verify_pciexpress(&wan_aftup_head);
 		if (err < 0){
 			goto main_done;
 		}
@@ -1124,6 +1199,8 @@
 			i++;
 		}else if (!strcmp(argv[i],"-pcie")){
 			options |= WAN_AFTUP_PCIEXPRESS;
+		}else if (!strcmp(argv[i],"-pcieT")){
+			options |= WAN_AFTUP_PCIEXPRESS_TUNDRA;
 		}else if (!strcmp(argv[i],"-auto")){
 			options |= WAN_AFTUP_AUTO;
 #if 0
@@ -1147,7 +1224,7 @@
 	char		msg[100];
 
 	memset(api_cmd.data, 0, WAN_MAX_DATA_SIZE);
-	memset(ifr.ifr_name, 0, IFNAMSIZ);
+	memset(ifr.ifr_name, 0, WAN_IFNAME_SZ);
 	strncpy(ifr.ifr_name, aft->if_name, strlen(aft->if_name));
 	ifr.ifr_data = (char*)&api_cmd;
 
@@ -1183,7 +1260,7 @@
 	char		msg[100];
 
 	memset(api_cmd.data, 0, WAN_MAX_DATA_SIZE);
-	memset(ifr.ifr_name, 0, IFNAMSIZ);
+	memset(ifr.ifr_name, 0, WAN_IFNAME_SZ);
 	strncpy(ifr.ifr_name, aft->if_name, strlen(aft->if_name));
 	ifr.ifr_data = (char*)&api_cmd;
 
@@ -1218,7 +1295,7 @@
 	char		msg[100];
 
 	memset(api_cmd.data, 0, WAN_MAX_DATA_SIZE);
-	memset(ifr.ifr_name, 0, IFNAMSIZ);
+	memset(ifr.ifr_name, 0, WAN_IFNAME_SZ);
 	strncpy(ifr.ifr_name, aft->if_name, strlen(aft->if_name));
 	ifr.ifr_data = (char*)&api_cmd;
 
@@ -1254,7 +1331,7 @@
 	char		msg[100];
 
 	memset(api_cmd.data, 0, WAN_MAX_DATA_SIZE);
-	memset(ifr.ifr_name, 0, IFNAMSIZ);
+	memset(ifr.ifr_name, 0, WAN_IFNAME_SZ);
 	strncpy(ifr.ifr_name, aft->if_name, strlen(aft->if_name));
 	ifr.ifr_data = (char*)&api_cmd;
 
@@ -1281,50 +1358,3 @@
 	return err;
 }
 
-static int aft_a200_a400_warning(wan_aftup_t *aft)
-{
-	char   	sel[20];
-        int	warning=0;
-	
-        if (aft->board_id == A200_REMORA_SHARK_SUBSYS_VENDOR &&
-	    (aft->flash_rev == 7 || 
-	     aft->flash_rev == 8)) {
-       		warning=1; 	
-       	}      
-
-	if (!warning) {
-		return 0;
-	}
-
-	
-        printf ("\n");
-        printf ("WARNING: User Confirmation Required!\n");
-        printf ("------------------------------------\n");
-	printf ("Please confirm your hardware type, an\n");
-	printf ("incorrect choice will corrupt the firmware.\n");
-	printf ("If firmware gets corrupted, a firmware recovery procedure\n");
-	printf ("using a jumper will have to be invoked to recover the card. \n");
-	printf ("For recovery procedures refer to: wiki.sangoma.com \n");
-        printf ("------------------------------------\n\n");
-        printf ("Please confirm hardware type:\n");
-	printf (" 1. A200 (front end connector RJ45)\n");
-	printf (" 2. A400 (front end connector DB25)\n");
-	printf (" Select: [1|2|q]:");
-
-	if (scanf("%s", sel)){
-	       	if (strcmp(sel, "q") == 0){
-	       		return -EINVAL;
-		} else if (strcmp(sel, "1") == 0) {
-			return 0;
-		} else if (strcmp(sel, "2") == 0) {
-			aft->board_id=A400_REMORA_SHARK_SUBSYS_VENDOR;
-			return 0;
-		} else {
-                 	return aft_a200_a400_warning(aft);
-		}
-	}
-
-	printf ("\nError: Invalid Selection %s\n",sel);
-	return -EINVAL;	
-}
-
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/firmware/wan_aftup/wan_aftup.h wanpipe-3.3.14b/firmware/wan_aftup/wan_aftup.h
--- wanpipe-3.3.14/firmware/wan_aftup/wan_aftup.h	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/firmware/wan_aftup/wan_aftup.h	2008-10-20 14:08:02.000000000 -0400
@@ -4,6 +4,14 @@
 #define MAX_IFNAME_LEN	20
 #define MAX_HWINFO_LEN	100
 
+#include "wan_aft_prg.h"
+
+#define u32 	unsigned int
+#define u8 	unsigned char
+#define u16	unsigned short
+#define s16	signed short
+
+
 typedef struct wan_aftup_ {
 
 	char		if_name[MAX_IFNAME_LEN];
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/include/sdla_aft_te1.h wanpipe-3.3.14b/patches/kdrivers/include/sdla_aft_te1.h
--- wanpipe-3.3.14/patches/kdrivers/include/sdla_aft_te1.h	2008-09-18 16:36:20.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/include/sdla_aft_te1.h	2008-10-20 12:16:10.000000000 -0400
@@ -50,7 +50,22 @@
 #define AFT_PORT6_OFFSET		0x18000
 #define AFT_PORT7_OFFSET		0x1C000
 
-#define AFT_PORT_REG(card,reg)		(reg+(0x4000*card->wandev.comm_port))
+static __inline u32 AFT_PORT_REG(sdla_t *card, u32 reg)
+{
+	if (card->adptr_type == AFT_ADPTR_A600) {
+		if (reg < 0x100) {
+			return (reg+0x1000);
+		} else {
+			return (reg+0x2000);
+		}
+	} else {
+		if (reg < 0x100) {
+			return reg;	
+		}
+		return 	(reg+(0x4000*card->wandev.comm_port));
+	}
+}
+
 
 /*======================================================
  * GLOBAL  (All Ports)
@@ -99,6 +114,9 @@
 # define AFT_CHIPCFG_A200_EC_SEC_KEY_MASK	0x3
 # define AFT_CHIPCFG_A200_EC_SEC_KEY_SHIFT  	16 
 
+# define AFT_CHIPCFG_A600_EC_SEC_KEY_MASK	0x3
+# define AFT_CHIPCFG_A600_EC_SEC_KEY_SHIFT  	4
+
 # define AFT_CHIPCFG_SPI_SLOW_BIT	5	/* Slow down SPI */
 #if 0
 # define AFT_CHIPCFG_EC_INTR_CFG_BIT	4	/* Shark or Analog */
@@ -186,7 +204,16 @@
 #  define AFT_CHIPCFG_WDT_TX_INTR_STAT  1
 #  define AFT_CHIPCFG_WDT_RX_INTR_STAT	2
 
-
+# define AFT_CLKCFG_A600_CLK_OUTPUT_BIT         0
+# define AFT_CLKCFG_A600_CLK_EXT_CLK_SRC_BIT    4
+# define AFT_CLKCFG_A600_CLK_SRC_BIT_MASK       0x6
+# define AFT_CLKCFG_A600_CLK_SRC_BIT_SHIFT      1
+# define AFT_CLKCFG_A600_CLK_OUT_BIT_MASK       0x7
+# define AFT_CLKCFG_A600_CLK_OUT_BIT_SHIFT      5
+# define AFT_CLKCFG_A600_CLK_SRC_OSC            0x00
+# define AFT_CLKCFG_A600_CLK_SRC_EXT_NO_PLL     0x01
+# define AFT_CLKCFG_A600_CLK_SRC_EXT_PLL        0x02
+# define AFT_CLKCFG_A600_CLK_OUT_BOARD          0x04
 
 /* A104 & A104D Interrupt Status Funcitons */
 
@@ -404,7 +431,22 @@
 	}
 	
 	return 0;
-}        
+}
+
+static __inline u32
+aft_chipcfg_get_a600_ec_channels(u32 reg)
+{
+	switch ((reg>>AFT_CHIPCFG_A600_EC_SEC_KEY_SHIFT)&AFT_CHIPCFG_A600_EC_SEC_KEY_MASK){
+		case 0x00:
+			return 0;
+		case 0x01:
+			return 5;
+		default:
+			return 0;
+	}
+	
+	return 0;
+}
 
 # define AFT_WDTCTRL_MASK		0xFF
 # define AFT_WDTCTRL_TIMEOUT 		75	/* ms */
@@ -1555,6 +1597,7 @@
 #define AFT_SERIAL_MIN_FRMW_VER	0x04
 
 #define AFT_MIN_ANALOG_FRMW_VER 0x05
+#define AFT_MIN_A600_FRMW_VER 	0x01
 
 #define A500_MAX_EC_CHANS 64
 
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/include/sdladrv.h wanpipe-3.3.14b/patches/kdrivers/include/sdladrv.h
--- wanpipe-3.3.14/patches/kdrivers/include/sdladrv.h	2008-09-05 18:02:56.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/include/sdladrv.h	2008-10-20 11:29:28.000000000 -0400
@@ -71,6 +71,7 @@
 #if defined(__LINUX__)
 # include <linux/version.h>
 # include <linux/wanpipe_kernel.h>
+# include <linux/sdlasfm.h>
 #elif defined(__FreeBSD__)
 # if defined(__SDLADRV__)
 #  if defined(SDLA_AUTO_PROBE)
@@ -516,6 +517,7 @@
 	void		(*busdma_sync)(void *phw, wan_dma_descr_t*, int ndescr, int single, int dir);
 	char*		(*hwec_name)(void *phw);
 	int		(*get_hwec_index)(void *phw);
+	void		(*reset_fe)(void*);
 #if defined(__WINDOWS__)
 	sdlahw_t *hw;
 #endif
@@ -534,7 +536,7 @@
 	unsigned char aft_isdn_adapters;
 	unsigned char aft_56k_adapters;
 	unsigned char aft_serial_adapters;
-	
+	unsigned char aft_a600_adapters;	
 	unsigned char aft_x_adapters;
 }sdla_hw_type_cnt_t;
 
@@ -875,6 +877,7 @@
 	*value = 0;
 # warning "__sdla_bus_read_4: Not supported yet!"
 #endif
+
 		if (offset == 0x40 && *value == (u32)-1) {
 			if (WAN_NET_RATELIMIT()){
 			DEBUG_EVENT("%s:%d: wanpipe PCI Error: Illegal Register read: 0x%04X = 0x%08X\n",
@@ -901,6 +904,7 @@
 	WAN_ASSERT(hwcpu->hwcard == NULL);	
 	SDLA_MAGIC(hwcpu);
 	if (!(hwcpu->status & SDLA_MEM_MAPPED)) return 0;
+
 #if defined(__FreeBSD__)
 	writel(((u8*)hwcpu->dpmbase + offset), value);
 #elif defined(__NetBSD__) || defined(__OpenBSD__)
@@ -915,6 +919,24 @@
 	return 0;
 }
 
+
+static __inline u32 SDLA_REG_OFF(sdlahw_card_t	*hwcard, u32 reg)
+{
+	if (hwcard == NULL) {
+		DEBUG_EVENT("sdladrv: Critical error: hw or hw->cpu is NULL\n");
+		return reg;
+	}
+	
+	if (hwcard->adptr_type == AFT_ADPTR_A600) {
+		if (reg < 0x100) {
+			return (reg+0x1000);
+		} else {
+			return (reg+0x2000);
+		}
+	}
+	return reg;
+}
+
 static __inline int __sdla_is_same_hwcard(void* phw1, void *phw2)
 {
 	sdlahw_cpu_t	*hwcpu1, *hwcpu2;
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/include/sdla_front_end.h wanpipe-3.3.14b/patches/kdrivers/include/sdla_front_end.h
--- wanpipe-3.3.14/patches/kdrivers/include/sdla_front_end.h	2008-08-12 16:31:56.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/include/sdla_front_end.h	2008-10-17 10:49:45.000000000 -0400
@@ -474,6 +474,8 @@
 	int		(*read_fe_cpld)(void*, unsigned short, unsigned char);
 	int 		(*write_framer)(void*,unsigned short,unsigned short);
 	unsigned int 	(*read_framer)(void*,unsigned short);
+	void		(*reset_fe)(void*);
+
 	WRITE_FRONT_END_REG_T	*write_fe_reg;
 	READ_FRONT_END_REG_T	*read_fe_reg;
 	READ_FRONT_END_REG_T	*__read_fe_reg;
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/include/sdlapci.h wanpipe-3.3.14b/patches/kdrivers/include/sdlapci.h
--- wanpipe-3.3.14/patches/kdrivers/include/sdlapci.h	2008-09-05 18:03:09.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/include/sdlapci.h	2008-10-17 10:51:27.000000000 -0400
@@ -75,6 +75,8 @@
 #define AFT_ISDN_BRI_SHARK_SUBSYS_VENDOR	0xA500	/* AFT-ISDN BRI SHARK board */
 #define AFT_56K_SHARK_SUBSYS_VENDOR		0xA056	/* AFT-56K SHARK board */
 
+#define AFT_A600_SUBSYS_VENDOR			0xA600	/* AFT-600 Series board */
+
 #define AFT_2SERIAL_V35X21_SUBSYS_VENDOR	0xA031	/* AFT-A142 2 Port V.35/X.21 board */
 #define AFT_4SERIAL_V35X21_SUBSYS_VENDOR	0xA032	/* AFT-A144 4 Port V.35/X.21 board */
 #define AFT_2SERIAL_RS232_SUBSYS_VENDOR		0xA033	/* AFT-A142 2 Port RS232 board */
@@ -104,6 +106,7 @@
 #define AFT_CHIP_OLD_X300	0x0300
 #define AFT_CHIP_OLD_X400	0x0400
 #define AFT_CHIP_X200		0x0020
+#define AFT_CHIP_X250		0x0025
 #define AFT_CHIP_X300		0x0030
 #define AFT_CHIP_X400		0x0040
 #define AFT_CHIP_X1000		0x0100
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/include/sdlasfm.h wanpipe-3.3.14b/patches/kdrivers/include/sdlasfm.h
--- wanpipe-3.3.14/patches/kdrivers/include/sdlasfm.h	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/include/sdlasfm.h	2008-10-17 10:54:35.000000000 -0400
@@ -166,6 +166,10 @@
 #define AFT_ADPTR_2SERIAL_RS232		0x4003	/* AFT-A142 2 Port RS232 board */
 #define AFT_ADPTR_4SERIAL_RS232		0x4004	/* AFT-A144 4 Port RS232 board */
 
+/* Adapter types cannot be more than 2 bytes */
+#define AFT_ADPTR_A600_MASK             0x8100  /* AFT A600 board mask */
+#define AFT_ADPTR_A600                  0x8101  /* AFT A600 board */
+
 #define OPERATE_T1E1_AS_SERIAL		0x8000  /* For bitstreaming only 
 						 * Allow the applicatoin to 
 						 * E1 front end */
@@ -275,6 +279,9 @@
 	((val) == AFT_RM_SECURITY_16_ECCHAN) ? 16 :	\
 	((val) == AFT_RM_SECURITY_32_ECCHAN) ? 32 : 0
 
+#define AFT_600_SECURITY_05_ECCHAN	0x01
+#define A600_ECCHAN(val) \
+  	((val) == AFT_600_SECURITY_05_ECCHAN) ? 05 : 0
 
 #define SDLA_ADPTR_NAME(adapter_type)			\
 		(adapter_type == S5141_ADPTR_1_CPU_SERIAL) ? "S514-1-PCI" : \
@@ -297,6 +304,7 @@
 		(adapter_type == AFT_ADPTR_4SERIAL_V35X21) ? "AFT-A144" : \
 		(adapter_type == AFT_ADPTR_2SERIAL_RS232)  ? "AFT-A142" : \
 		(adapter_type == AFT_ADPTR_4SERIAL_RS232)  ? "AFT-A144" : \
+		(adapter_type == AFT_ADPTR_A600)           ? "AFT-A600" : \
 							     "UNKNOWN"
 			
 #define AFT_GET_SECURITY(security)					\
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/include/wanpipe_cfg_def.h wanpipe-3.3.14b/patches/kdrivers/include/wanpipe_cfg_def.h
--- wanpipe-3.3.14/patches/kdrivers/include/wanpipe_cfg_def.h	2008-09-05 18:36:26.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/include/wanpipe_cfg_def.h	2008-10-20 12:19:45.000000000 -0400
@@ -101,6 +101,7 @@
 #define WANOPT_AFT_56K		12
 #define WANOPT_AFT101		13
 #define WANOPT_AFT_SERIAL	14
+#define WANOPT_AFT600		15
 
 /*
  * Configuration options defines.
@@ -215,6 +216,7 @@
 #define WANOPT_NETWORK_SYNC_OUT	0x00
 #define WANOPT_NETWORK_SYNC_IN	0x01
 
-
+#define WAN_CLK_OUT_OSC         0x03
+#define WAN_CLK_OUT_LINE        0x04
 
 #endif /* __WANPIPE_CFG_DEF_H__ */
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/include/wanpipe_cfg.h wanpipe-3.3.14b/patches/kdrivers/include/wanpipe_cfg.h
--- wanpipe-3.3.14/patches/kdrivers/include/wanpipe_cfg.h	2008-09-05 18:36:27.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/include/wanpipe_cfg.h	2008-10-17 12:32:08.000000000 -0400
@@ -6,6 +6,7 @@
 # include <sdla_te1.h>
 # include <sdla_te3.h>
 # include <sdla_remora.h>
+# include <sdla_a600_remora.h>
 # include <sdla_bri.h>
 # include <sdla_serial.h>
 # include <sdla_front_end.h>
@@ -21,6 +22,7 @@
 # include <linux/sdla_te1.h>
 # include <linux/sdla_te3.h>
 # include <linux/sdla_remora.h>
+# include <linux/sdla_a600_remora.h>
 # include <linux/sdla_bri.h>
 # include <linux/sdla_serial.h>
 # include <linux/sdla_front_end.h>
@@ -37,6 +39,7 @@
 # include <sdla_te3.h>
 # include <sdla_bri.h>
 # include <sdla_remora.h>
+# include <sdla_a600_remora.h>
 # include <sdla_bri.h>
 # include <sdla_serial.h>
 # include <sdla_front_end.h>
@@ -81,6 +84,8 @@
 #define CONFIG_PRODUCT_WANPIPE_AFT_BRI
 /* compile AFT Serial code */
 #define CONFIG_PRODUCT_WANPIPE_AFT_SERIAL
+/* compile A600 code */
+#define CONFIG_PRODUCT_WANPIPE_AFT_A600
 /********** end of compilation flags ************/
 
 /* Frame Relay definitions for sprotocol.dll 
@@ -202,7 +207,7 @@
 		 card_type == WANOPT_AFT104 ||			\
 		 card_type == WANOPT_AFT108) ?     "A101/1D/A102/2D/4/4D/8" :	\
 		(card_type == WANOPT_AFT300) ?     "A300"  :	\
-		(card_type == WANOPT_AFT_ANALOG) ? "A200/400"  :	\
+		(card_type == WANOPT_AFT_ANALOG) ? "A200/400/600"  :	\
 		(card_type == WANOPT_AFT_ISDN) ?   "A500"  :	\
 		(card_type == WANOPT_AFT_56K) ?    "A056"  :	\
 		(card_type == WANOPT_AFT_SERIAL) ? "A14x"  :	\
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/include/wanpipe_debug.h wanpipe-3.3.14b/patches/kdrivers/include/wanpipe_debug.h
--- wanpipe-3.3.14/patches/kdrivers/include/wanpipe_debug.h	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/include/wanpipe_debug.h	2008-10-17 11:00:00.000000000 -0400
@@ -32,6 +32,7 @@
 #undef WAN_DEBUG_UDP
 #undef WAN_DEBUG_TE1
 #undef WAN_DEBUG_56K
+#undef WAN_DEBUG_A600
 #undef WAN_DEBUG_PROCFS
 #undef WAN_DEBUG_TDM_VOICE
 #undef WAN_DEBUG_TEST
@@ -82,6 +83,7 @@
 # define DEBUG_TE1	DEBUG_NONE
 # define DEBUG_TE3	DEBUG_NONE
 # define DEBUG_56K	DEBUG_NONE
+# define DEBUG_A600	DEBUG_NONE
 # define DEBUG_BRI	DEBUG_NONE
 # define DEBUG_PROCFS	DEBUG_NONE
 # define DEBUG_TDMV	DEBUG_NONE
@@ -173,7 +175,11 @@
 # ifdef WAN_DEBUG_56K
 #  undef  DEBUG_56K
 #  define DEBUG_56K	DEBUG_PRINT
-# endif 
+# endif
+# ifdef WAN_DEBUG_A600
+#  undef  DEBUG_A600
+#  define DEBUG_A600	DEBUG_PRINT
+# endif  
 # ifdef WAN_DEBUG_BRI
 #  undef  DEBUG_BRI
 #  define DEBUG_BRI	DEBUG_PRINT
@@ -352,6 +358,7 @@
 # define DEBUG_BRI(format,msg...)
 # define DEBUG_PROCFS(format,msg...)
 # define DEBUG_TDMV(format,msg...)
+# define DEBUG_A600(format,msg...)
 # define DEBUG_TEST(format,msg...)
 # define DEBUG_DBG(format,msg...)
 # define DEBUG_DMA(format,msg...)
@@ -462,7 +469,11 @@
 # ifdef WAN_DEBUG_BRI
 #  undef  DEBUG_BRI
 #  define DEBUG_BRI(format,msg...)		DEBUG_PRINT(format,##msg)
-# endif 
+# endif
+# ifdef WAN_DEBUG_A600
+#  undef  DEBUG_A600
+#  define DEBUG_A600(format,msg...)		DEBUG_PRINT(format,##msg)
+# endif  
 # ifdef WAN_DEBUG_PROCFS
 #  undef  DEBUG_PROCFS
 #  define DEBUG_PROCFS(format,msg...)		DEBUG_PRINT(format,##msg)
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/include/wanpipe.h wanpipe-3.3.14b/patches/kdrivers/include/wanpipe.h
--- wanpipe-3.3.14/patches/kdrivers/include/wanpipe.h	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/include/wanpipe.h	2008-10-17 11:00:33.000000000 -0400
@@ -50,7 +50,7 @@
 #include <wanpipe_events.h>
 #include <wanpipe_cfg.h>
 # include <wanrouter.h>
-#elif defined(__WINDOWS__)
+#elif defined(__WINDOWS__)
 #if defined (__KERNEL__)
 # include <wanpipe_defines.h>
 # include <wanpipe_debug.h>
@@ -58,7 +58,7 @@
 # include <wanpipe_events.h>
 # include <wanpipe_cfg.h>
 # include <wanrouter.h>
-# include <wanpipe_structs.h>
+# include <wanpipe_structs.h>
 #endif
 #elif defined(__LINUX__) || defined (__KERNEL__)
 #include <linux/wanpipe_defines.h>
@@ -1005,6 +1005,7 @@
 int wp_pos_init(sdla_t* card, wandev_conf_t* conf);	/* POS Driver */	
 int wp_xilinx_init(sdla_t* card, wandev_conf_t* conf);	/* Xilinx Hardware Support */
 int wp_aft_te1_init(sdla_t* card, wandev_conf_t* conf);	/* Xilinx Hardware Support */
+int wp_aft_a600_init(sdla_t* card, wandev_conf_t* conf);	/* A600 Hardware Support */
 int wp_aft_56k_init(sdla_t* card, wandev_conf_t* conf);	/* Xilinx Hardware Support */
 int wp_aft_analog_init(sdla_t* card, wandev_conf_t* conf);	/* Xilinx Hardware Support */
 int wp_aft_bri_init(sdla_t* card, wandev_conf_t* conf);	/* BRI Hardware Support */
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/include/wanpipe_version.h wanpipe-3.3.14b/patches/kdrivers/include/wanpipe_version.h
--- wanpipe-3.3.14/patches/kdrivers/include/wanpipe_version.h	2008-10-08 17:30:52.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/include/wanpipe_version.h	2008-10-24 17:15:14.000000000 -0400
@@ -6,7 +6,7 @@
 #define WANPIPE_COMPANY         "Sangoma Technologies Inc"
 
 /********** LINUX **********/
-#define WANPIPE_VERSION			"3.3.14"
+#define WANPIPE_VERSION			"3.3.14b"
 #define WANPIPE_SUB_VERSION		"0"
 #define WANPIPE_VERSION_BETA		1
 #define WANPIPE_LITE_VERSION		"1.1.1"
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/src/net/aft_a104.c wanpipe-3.3.14b/patches/kdrivers/src/net/aft_a104.c
--- wanpipe-3.3.14/patches/kdrivers/src/net/aft_a104.c	2008-08-12 16:34:11.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/src/net/aft_a104.c	2008-10-17 11:03:02.000000000 -0400
@@ -385,7 +385,7 @@
 #if INIT_FE_ONLY
 #else
 	for (i=0;i<10;i++){
-		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 (!wan_test_bit(AFT_CHIPCFG_HDLC_CTRL_RDY_BIT,&reg) ||
 		    !wan_test_bit(AFT_CHIPCFG_RAM_READY_BIT,&reg)){
@@ -525,7 +525,7 @@
 
 	DEBUG_CFG("--- AFT Chip Reset. -- \n");
 
-	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(10);
 
@@ -555,7 +555,7 @@
 
 	DEBUG_CFG("--- Chip enable/config. -- \n");
 
-	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);
 
 	if (card->u.aft.firm_id == AFT_DS_FE_CORE_ID){
 		/* A104/A108 with Dallas FE */
@@ -612,9 +612,9 @@
 		if (max_ec_chans) {
 			DEBUG_EVENT("%s: Global HWEC Clock Source : %i\n", 
 					card->devname,card->wandev.comm_port+1); 
-			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); 
                  	aft_chipcfg_set_oct_clk_src(&reg,card->wandev.comm_port);  
-			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); 
 		}
 	}
 #endif/*INIT_FE_ONLY*/
@@ -645,7 +645,7 @@
 	wan_set_bit(AFT_CHIPCFG_SFR_IN_BIT,&reg);
 	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);
 #endif
 	return 0;
 }
@@ -718,9 +718,9 @@
 		card->hw_iface.hw_lock(card->hw,&smp_flags);
 		wan_spin_lock_irq(&card->wandev.lock,&flags);
 
-		card->hw_iface.bus_read_4(card->hw,AFT_CHIP_CFG_REG, &cfg_reg);
+		card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card, AFT_CHIP_CFG_REG), &cfg_reg);
 	     	aft_chipcfg_set_oct_clk_src(&cfg_reg,card->hwec_conf.clk_src);
-		card->hw_iface.bus_write_4(card->hw,AFT_CHIP_CFG_REG, cfg_reg);
+		card->hw_iface.bus_write_4(card->hw,AFT_PORT_REG(card, AFT_CHIP_CFG_REG), cfg_reg);
 
 		wan_spin_unlock_irq(&card->wandev.lock,&flags);
 		card->hw_iface.hw_unlock(card->hw,&smp_flags);
@@ -940,7 +940,7 @@
 
 		card->hw_iface.getcfg(card->hw, SDLA_HWEC_NO, &max_ec_chans);
 
-		card->hw_iface.bus_read_4(card->hw,AFT_CHIP_CFG_REG, &cfg_reg); 
+		card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card, AFT_CHIP_CFG_REG), &cfg_reg); 
 		if (max_ec_chans > aft_chipcfg_get_ec_channels(cfg_reg)){
 	        	DEBUG_EVENT("%s: Critical Error: Exceeded Maximum Available Echo Channels!\n",
 					card->devname);
@@ -1308,7 +1308,7 @@
 		security_bit=AFT_CHIPCFG_A108_EC_SECURITY_BIT;
 	}
 	
-    	card->hw_iface.bus_read_4(card->hw,AFT_CHIP_CFG_REG, &cfg_reg);
+    	card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card, AFT_CHIP_CFG_REG), &cfg_reg);
 	if (wan_test_bit(security_bit,&cfg_reg)){ 
     		return 1; 	
 	}
@@ -1470,7 +1470,7 @@
 void a104_fifo_adjust(sdla_t *card, u32 level)
 {
 	u32 fifo_size,reg;
-	card->hw_iface.bus_read_4(card->hw, AFT_FIFO_MARK_REG, &fifo_size);
+	card->hw_iface.bus_read_4(card->hw, AFT_PORT_REG(card, AFT_FIFO_MARK_REG), &fifo_size);
 
 	aft_fifo_mark_gset(&reg,(u8)level);
 
@@ -1485,7 +1485,7 @@
 		return;
 	}
 	
-	card->hw_iface.bus_write_4(card->hw, AFT_FIFO_MARK_REG, reg);		
+	card->hw_iface.bus_write_4(card->hw, AFT_PORT_REG(card, AFT_FIFO_MARK_REG), reg);		
 	DEBUG_EVENT("%s:    Fifo Level Map:0x%08X\n",card->devname,reg);
 }
 
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/src/net/aft_analog.c wanpipe-3.3.14b/patches/kdrivers/src/net/aft_analog.c
--- wanpipe-3.3.14/patches/kdrivers/src/net/aft_analog.c	2008-09-17 17:33:35.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/src/net/aft_analog.c	2008-10-20 12:34:53.000000000 -0400
@@ -58,6 +58,8 @@
 #if defined(CONFIG_WANPIPE_HWEC)
 static int aft_analog_hwec_reset(void *pcard, int reset);
 static int aft_analog_hwec_enable(void *pcard, int enable, int fe_chan);
+
+static int aft_a600_hwec_reset(void *pcard, int reset);
 #endif
 
 static int aft_map_fifo_baddr_and_size(sdla_t *card, unsigned char fifo_size, unsigned char *addr);
@@ -322,28 +324,100 @@
 }
 
 
+int aft_a600_clock_config(sdla_t *card)
+{
+	u32 reg_1090;
+
+	reg_1090 = 0x00;
+	card->hw_iface.bus_read_4(card->hw, 0x1090, &reg_1090);	
+
+	switch (WAN_FE_NETWORK_SYNC(&card->fe)) {
+		default:
+			DEBUG_EVENT("%s: Warning:Invalid FE_NETWORK_SYNC value\n",
+					card->devname);
+		case WANOPT_NO:
+			DEBUG_EVENT("%s: Configuring for internal oscillator\n",
+						card->devname);
+		
+			reg_1090 &= ~AFT_CLKCFG_A600_CLK_SRC_BIT_MASK;
+			break;
+		case WANOPT_YES:
+			reg_1090 = 0x00;
+			DEBUG_EVENT("%s: Analog Clock set to Network Sync!\n",
+					card->devname);
+		
+			/* Set the board clock source to external clocking */
+			reg_1090 |= (AFT_CLKCFG_A600_CLK_SRC_EXT_NO_PLL << 1);
+
+			/* Set external clock source to 8.192 Mhz */
+			wan_clear_bit(AFT_CLKCFG_A600_CLK_EXT_CLK_SRC_BIT, &reg_1090);
+			break;
+		case WAN_CLK_OUT_OSC:
+			DEBUG_EVENT("%s: Configuring for clock output oscillator\n",
+					card->devname);
+
+			reg_1090 = 0x00;
+			/* Enable clock output on jumper */
+			wan_set_bit(AFT_CLKCFG_A600_CLK_OUTPUT_BIT, &reg_1090);
+			reg_1090 &= ~AFT_CLKCFG_A600_CLK_SRC_BIT_MASK;
+			break;
+		case WAN_CLK_OUT_LINE:
+/* daughter card is required for line clock output - not supported yet*/
+#if 1
+			/* Configure for oscillator output for now */
+			DEBUG_EVENT("%s: Warning: Clock output line not supported on A600\n",
+					card->devname);
+			DEBUG_EVENT("%s: Configuring for oscillator output\n",
+					card->devname);
+		
+			reg_1090 = 0x00;
+			/* Enable clock output on jumper */
+			wan_set_bit(AFT_CLKCFG_A600_CLK_OUTPUT_BIT, &reg_1090);
+			reg_1090 &= ~AFT_CLKCFG_A600_CLK_SRC_BIT_MASK;	
+			break;
+#else
+/* Use this section of code once daughter card is implemented */
+			DEBUG_EVENT("%s: Configuring for clock output line\n",
+					card->devname);
+
+			/* Configure board to use clock from daughter card */
+			reg_1090 |= (AFT_CLKCFG_A600_CLK_SRC_EXT_PLL << 1);
+			break;
+#endif
+	}
+	/* Set the external clock output mux to use board clock */
+	reg_1090 |= (AFT_CLKCFG_A600_CLK_OUT_BOARD << 5);
+
+	card->hw_iface.bus_write_4(card->hw, 0x1090, reg_1090);	
+
+	return 0;
+}
+
+
 int aft_analog_global_chip_config(sdla_t *card)
 {
 	u32	reg;
 	int	err;
 
 	/*============ GLOBAL CHIP CONFIGURATION ===============*/
-	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);
 
 	/* Enable the chip/hdlc reset condition */
 	reg=0;
 	wan_set_bit(AFT_CHIPCFG_SFR_EX_BIT,&reg);
 	wan_set_bit(AFT_CHIPCFG_SFR_IN_BIT,&reg);
 
-	if (WAN_FE_NETWORK_SYNC(&card->fe)){	/*card->fe.fe_cfg.cfg.remora.network_sync*/
-		DEBUG_EVENT("%s: Analog Clock set to Network Sync!\n",
-				card->devname);
-		wan_set_bit(AFT_CHIPCFG_ANALOG_CLOCK_SELECT_BIT,&reg);	
+	if (!IS_A600_CARD(card)) {
+		if (WAN_FE_NETWORK_SYNC(&card->fe)){	/*card->fe.fe_cfg.cfg.remora.network_sync*/
+			DEBUG_EVENT("%s: Analog Clock set to Network Sync!\n",
+					card->devname);
+			wan_set_bit(AFT_CHIPCFG_ANALOG_CLOCK_SELECT_BIT,&reg);	
+		}
 	}
-
+	
 	DEBUG_CFG("--- AFT Chip Reset. -- \n");
 
-	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(10);
@@ -361,10 +435,39 @@
 #endif
 	DEBUG_CFG("--- Chip enable/config. -- \n");
 
-	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);
+	
+	if (IS_A600_CARD(card)) {
+		u32 reg_1090 = 0x00;
+		card->hw_iface.bus_read_4(card->hw, 0x1090, &reg_1090);	
+
+#warning "DAVIDY need to implement clock source"		
+		DEBUG_A600("%s: Configuring HWEC CLK SRC to internal oscillator\n",
+			    card->devname);
+		
+		reg_1090 &= ~0x6;
+
+		card->hw_iface.bus_write_4(card->hw, 0x1090, reg_1090);	
+	
+		reg_1090 = 0x00;	
+		card->hw_iface.bus_read_4(card->hw, 0x1090, &reg_1090);	
+	}
+
+	if (IS_A600_CARD(card)) {
+		err = aft_a600_clock_config(card);
+		if (err) {
+			DEBUG_EVENT("%s: Failed to configure clock source\n",
+							card->devname);
+			return -EINVAL;
+		}
+	}
+
+	if (!IS_A600_CARD(card)) {
+		/* Set Octasic reset */
+		aft_analog_write_cpld(card, 0x00, 0x00);
+	}	
+	
 
-	/* Set Octasic reset */
-	aft_analog_write_cpld(card, 0x00, 0x00);
 
 	DEBUG_EVENT("%s: Global Front End Configuraton!\n",card->devname);
 	err = -EINVAL;
@@ -402,7 +505,7 @@
 	wan_set_bit(AFT_CHIPCFG_SFR_EX_BIT,&reg);
 	wan_set_bit(AFT_CHIPCFG_SFR_IN_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);
 
 	return 0;
 }
@@ -449,14 +552,22 @@
 	/* Enable Octasic Chip */
 	if (card->adptr_subtype == AFT_SUBTYPE_SHARK){
 		u16	max_ec_chans, max_ports_no;
+		u16	max_chip_cfg_ec_chans;
 		u32 	cfg_reg, fe_port_map;
 
 		card->hw_iface.getcfg(card->hw, SDLA_HWEC_NO, &max_ec_chans);
 		card->hw_iface.getcfg(card->hw, SDLA_PORTS_NO, &max_ports_no);
 		card->hw_iface.getcfg(card->hw, SDLA_PORT_MAP, &fe_port_map);
 
-        	card->hw_iface.bus_read_4(card->hw,AFT_CHIP_CFG_REG, &cfg_reg); 
-		if (max_ec_chans > aft_chipcfg_get_a200_ec_channels(cfg_reg)){
+        	card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card,AFT_CHIP_CFG_REG), &cfg_reg);
+		
+		if (IS_A600_CARD(card)) {
+			max_chip_cfg_ec_chans = aft_chipcfg_get_a600_ec_channels(cfg_reg);	
+		} else {
+			max_chip_cfg_ec_chans = aft_chipcfg_get_a200_ec_channels(cfg_reg);	
+		}
+		
+		if (max_ec_chans > max_chip_cfg_ec_chans){	
 	        	DEBUG_EVENT(
 			"%s: Critical Error: Exceeded Maximum Available Echo Channels!\n",
 					card->devname);
@@ -477,7 +588,13 @@
 							max_ports_no,
 							max_ec_chans,
 							(void*)&conf->oct_conf);
-			card->wandev.hwec_reset = aft_analog_hwec_reset;
+			
+			if (IS_A600_CARD(card)) {
+				card->wandev.hwec_reset = aft_a600_hwec_reset;
+			} else {
+				card->wandev.hwec_reset = aft_analog_hwec_reset;
+			}
+
 			card->wandev.hwec_enable = aft_analog_hwec_enable;
 #else
 			DEBUG_EVENT("%s: Wanpipe HW Echo Canceller modele is not compiled!\n",
@@ -520,7 +637,7 @@
 	/*============ ENABLE MUX ==================*/
 
 	reg=0;	/* 0xFFFFFFFF; */
-	card->hw_iface.bus_write_4(card->hw,AFT_ANALOG_DATA_MUX_CTRL_REG,reg);
+	card->hw_iface.bus_write_4(card->hw,AFT_PORT_REG(card, AFT_ANALOG_DATA_MUX_CTRL_REG),reg);
 
 
 	aft_wdt_reset(card);
@@ -670,7 +787,7 @@
 {  
 	u32 cfg_reg;	
 	
-    card->hw_iface.bus_read_4(card->hw,AFT_CHIP_CFG_REG, &cfg_reg);
+    	card->hw_iface.bus_read_4(card->hw,AFT_PORT_REG(card, AFT_CHIP_CFG_REG), &cfg_reg);
 	if (wan_test_bit(AFT_CHIPCFG_A200_EC_SECURITY_BIT,&cfg_reg)){ 
     	return 1; 	
 	}
@@ -756,6 +873,48 @@
 }
 
 #if defined(CONFIG_WANPIPE_HWEC)
+static int aft_a600_hwec_reset(void *pcard, int reset)
+{
+	sdla_t		*card = (sdla_t*)pcard;
+	wan_smp_flag_t	smp_flags,flags;
+	int		err = -EINVAL;
+	u32		reg;
+
+	card->hw_iface.hw_lock(card->hw,&smp_flags);
+	wan_spin_lock_irq(&card->wandev.lock,&flags);
+	card->hw_iface.bus_read_4(card->hw, 
+				  AFT_PORT_REG(card,AFT_CHIP_CFG_REG),
+					       &reg);
+	if (!reset){
+		DEBUG_EVENT("%s: A600 Clear Echo Canceller chip reset.\n",
+			    card->devname);
+
+		reg &= ~0x1000000;
+		card->hw_iface.bus_write_4(card->hw,
+						AFT_PORT_REG(card,AFT_CHIP_CFG_REG),
+						reg);
+						
+		WP_DELAY(1000);
+		err = 0;
+	}else{
+		DEBUG_EVENT("%s: A600 Set Echo Canceller chip reset.\n",
+			    card->devname);
+		
+		
+		reg |= 0x1000000;
+		card->hw_iface.bus_write_4(card->hw, 
+					   AFT_PORT_REG(card,AFT_CHIP_CFG_REG),
+							   reg);
+		
+		err = 0;
+	}
+	
+	wan_spin_unlock_irq(&card->wandev.lock,&flags);
+	card->hw_iface.hw_unlock(card->hw,&smp_flags);
+
+	return err;
+}
+
 static int aft_analog_hwec_reset(void *pcard, int reset)
 {
 	sdla_t		*card = (sdla_t*)pcard;
@@ -804,7 +963,7 @@
 
 	card->hw_iface.bus_read_4(
 			card->hw,
-			AFT_REMORA_MUX_TS_EC_ENABLE,
+			AFT_PORT_REG(card, AFT_REMORA_MUX_TS_EC_ENABLE),
 			&value);
 	if (enable){
 		value |= (1 << hw_chan);
@@ -817,7 +976,7 @@
 			fe_chan, value);
 	card->hw_iface.bus_write_4(
 			card->hw,
-			AFT_REMORA_MUX_TS_EC_ENABLE,
+			AFT_PORT_REG(card, AFT_REMORA_MUX_TS_EC_ENABLE),
 			value);
 	return 0;
 }
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/src/net/sdla_aft_te1.c wanpipe-3.3.14b/patches/kdrivers/src/net/sdla_aft_te1.c
--- wanpipe-3.3.14/patches/kdrivers/src/net/sdla_aft_te1.c	2008-10-01 15:51:48.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/src/net/sdla_aft_te1.c	2008-10-27 10:38:01.000000000 -0400
@@ -727,13 +727,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;
 	}
 
@@ -752,7 +753,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;
@@ -776,6 +778,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)
 {
@@ -1677,13 +1746,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);
@@ -5755,7 +5824,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);
@@ -5805,9 +5874,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);
@@ -5815,7 +5884,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) {
@@ -5830,7 +5899,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);
@@ -5931,7 +6000,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);
@@ -5988,7 +6057,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);
 		}
 
 		}
@@ -6086,7 +6155,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)){	
@@ -6590,7 +6659,6 @@
 
 	trace_info=&chan->trace_info;
 	wan_udp_pkt = (wan_udp_pkt_t *)chan->udp_pkt_data;
-
    	{
 
 		netskb_t *skb;
@@ -6905,7 +6973,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(
@@ -6914,7 +6981,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;
@@ -7426,7 +7492,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);
@@ -7462,7 +7528,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);
 
@@ -7474,7 +7540,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);
 		
 	}
 	
@@ -7667,7 +7733,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);
 
@@ -7677,7 +7743,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;
 
@@ -7700,11 +7766,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 */
@@ -7729,7 +7795,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;
 
@@ -7785,7 +7851,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);
@@ -7805,7 +7871,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);
@@ -8250,7 +8316,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;
 }
@@ -10063,7 +10129,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)){
@@ -10156,9 +10222,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__)
@@ -10338,13 +10404,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);
 	}
 }
 
@@ -10364,7 +10430,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",
@@ -10373,7 +10439,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);		
 
 }
@@ -10623,7 +10689,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){
@@ -11207,7 +11277,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);
@@ -11216,7 +11286,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;
 
@@ -11238,7 +11308,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);
@@ -11248,7 +11318,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;
 
@@ -12673,7 +12743,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 */
@@ -12696,7 +12766,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;
 }
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/src/net/sdladrv.c wanpipe-3.3.14b/patches/kdrivers/src/net/sdladrv.c
--- wanpipe-3.3.14/patches/kdrivers/src/net/sdladrv.c	2008-09-05 18:08:32.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/src/net/sdladrv.c	2008-10-27 10:56:32.000000000 -0400
@@ -351,6 +351,7 @@
 static sdlahw_t* sdla_hwdev_common_register(sdlahw_cpu_t* hwcpu, int, int);
 static sdlahw_t* sdla_hwdev_te1_register(sdlahw_cpu_t*, int);
 static sdlahw_t* sdla_hwdev_Remora_register(sdlahw_cpu_t*, int*);
+static sdlahw_t* sdla_hwdev_a600_register(sdlahw_cpu_t*, int*);
 static sdlahw_t* sdla_hwdev_ISDN_register(sdlahw_cpu_t*, int*);
 
 static int sdla_s514_hw_select (sdlahw_card_t*, int, int, void*);
@@ -409,6 +410,13 @@
 extern u_int8_t	__sdla_shark_rm_read_fe (void* phw, ...);
 extern u_int8_t	sdla_shark_rm_read_fe (void* phw, ...);
 
+extern void	sdla_a200_reset_fe (void* fe);
+
+extern int	sdla_a600_write_fe (void* phw, ...);
+extern u_int8_t	__sdla_a600_read_fe (void* phw, ...);
+extern u_int8_t	sdla_a600_read_fe (void* phw, ...);
+extern void 	sdla_a600_reset_fe (void* fe);
+
 extern int	sdla_shark_bri_write_fe (void* phw, ...);
 extern u_int8_t	sdla_shark_bri_read_fe (void* phw, ...);
 static int	sdla_scan_isdn_bri_modules(sdlahw_t* hw, int *rm_mod_type,  u_int8_t rm_no);
@@ -894,7 +902,7 @@
 #define SDLA_HWPROBE_AFT_SH_FORMAT			\
 	"%-10s : SLOT=%d : BUS=%d : IRQ=%d : CPU=%c : PORT=%d : HWEC=%d : V=%02X" 
 #define SDLA_HWPROBE_A200_SH_FORMAT			\
-	"%-10s : SLOT=%d : BUS=%d : IRQ=%d : CPU=%c : PORT=%s : HWEC=%d : V=%02X"
+	"%-10s : SLOT=%d : BUS=%d : IRQ=%d : HWEC=%d : V=%02X"
 #define SDLA_HWPROBE_A500_SH_FORMAT			\
 	"%-10s : SLOT=%d : BUS=%d : IRQ=%d : PORT=%d : HWEC=%d : V=%02X"
 
@@ -977,6 +985,7 @@
 
 		case A200_ADPTR_ANALOG:
 		case A400_ADPTR_ANALOG:
+		case AFT_ADPTR_A600:
 			/*sprintf(tmp_hw_probe->hw_info,*/
 			snprintf(hwprobe->hw_info, 
 				sizeof(hwprobe->hw_info),
@@ -985,12 +994,10 @@
 				hwcpu->hwcard->slot_no, 
 				hwcpu->hwcard->bus_no, 
 				hwcpu->irq, 
-				SDLA_GET_CPU(hwcpu->cpu_no), 
-				hw->port_no ? "SEC" : "PRI",
 				hwcpu->hwcard->hwec_chan_no,
 				hwcpu->hwcard->core_rev);
 			break;
-		
+
 		case A300_ADPTR_U_1TE3:
 		case AFT_ADPTR_56K:
 			if (hwcpu->hwcard->adptr_subtype == AFT_SUBTYPE_SHARK){
@@ -1045,7 +1052,7 @@
 					hw->port_no+1,
 					hwcpu->hwcard->core_rev);		/* line_no */
 			break;
-
+		
 		default:
 			/*sprintf(tmp_hw_probe->hw_info,*/
 			snprintf(hwprobe->hw_info, 
@@ -1059,6 +1066,7 @@
 				port ? "SEC" : "PRI");
 			break;
 		}
+		
 	}else{
 		/*sprintf(tmp_hw_probe->hw_info, */
 		snprintf(hwprobe->hw_info, sizeof(hwprobe->hw_info),
@@ -1249,6 +1257,140 @@
 	return first_hw;
 }
 
+static sdlahw_t* 
+sdla_hwdev_a600_register(sdlahw_cpu_t* hwcpu, int *line_num)
+{
+
+	sdlahw_t	*hw;
+	u32		reg;
+	int		mod_no, off = 0, port_cnt = 0;
+	int		rm_mod_type[NUM_A600_ANALOG_PORTS+2];
+	u_int32_t	port_map = 0;
+	u32		serial_num_lo;
+	u32		serial_num_hi;
+	
+	
+	unsigned char	str[50];
+		
+	WAN_ASSERT_RC(hwcpu == NULL, NULL);
+	*line_num = 0;
+	if ((hw = sdla_hw_register(hwcpu, 0)) == NULL){
+		return NULL;
+	}
+
+	if (sdla_get_hw_info(hw)){
+		sdla_hwdev_common_unregister(hwcpu);
+		return NULL;
+	}
+	if (sdla_save_hw_probe(hw, 0)){
+		sdla_hwdev_common_unregister(hwcpu);
+		return NULL;
+	}
+
+	if (sdla_memory_map(hw)){
+		sdla_hw_unregister(hw);
+		return NULL;
+	}
+
+	/* A600 clear reset */
+	sdla_bus_read_4(hw, A600_REG_OFF(0x40),&reg);
+	wan_set_bit(1,&reg);
+	wan_set_bit(2,&reg);
+	sdla_bus_write_4(hw,A600_REG_OFF(0x40),reg);
+	
+	WP_DELAY(10);
+
+	wan_clear_bit(1,&reg);
+	wan_clear_bit(2,&reg);
+	sdla_bus_write_4(hw,A600_REG_OFF(0x40),reg);
+
+	WP_DELAY(6000);
+
+	/* Read the serial number */
+	/* serial number is 48 bits long:
+		bits: 47-32 => reg 0x1098
+		bits: 31-0  => reg 0x109C
+	*/
+	sdla_bus_read_4(hw, 0x109C, &serial_num_lo);
+	sdla_bus_read_4(hw, 0x1098, &serial_num_hi);
+	serial_num_hi &= 0xFF;
+	
+	reg = 0x00;
+
+	/* Reset SPI bus */
+	wan_set_bit(A600_SPI_REG_FX0_RESET_BIT, &reg);
+	wan_set_bit(A600_SPI_REG_FXS_RESET_BIT, &reg);
+	
+	sdla_bus_write_4(hw,A600_REG_OFF(SPI_INTERFACE_REG),reg);
+	WP_DELAY(1000);
+	sdla_bus_write_4(hw,A600_REG_OFF(SPI_INTERFACE_REG),0x00000000);
+	WP_DELAY(1000);
+
+	for(mod_no = 0; mod_no < NUM_A600_ANALOG_PORTS; mod_no++){
+		rm_mod_type[mod_no] = MOD_TYPE_NONE;
+	}
+	
+	rm_mod_type [0] = MOD_TYPE_FXO;
+	rm_mod_type [1] = MOD_TYPE_FXO;
+	rm_mod_type [2] = MOD_TYPE_FXO;
+	rm_mod_type [3] = MOD_TYPE_FXO;
+	rm_mod_type [4] = MOD_TYPE_FXS;
+	
+	port_map = 0;
+
+	for(mod_no = 0; mod_no < NUM_A600_ANALOG_PORTS; mod_no++){
+			if (rm_mod_type[mod_no] == MOD_TYPE_FXS){
+			sprintf(str, "\n+%02d:FXS:%s",
+				mod_no+1, 
+    				AFT_PCITYPE_DECODE(hwcpu->hwcard));
+			port_cnt++;
+			port_map |= (1 << (mod_no+1));
+		}else if (rm_mod_type[mod_no] == MOD_TYPE_FXO){
+			sprintf(str, "\n+%02d:FXO:%s",
+				mod_no+1, 
+    				AFT_PCITYPE_DECODE(hwcpu->hwcard));
+			port_cnt++;		
+			port_map |= (1 << (mod_no+1));
+		}else{
+			sprintf(str, "\n+%02d:EMPTY", mod_no+1);		
+		}
+		memcpy(&hw->hwport[hw->max_port_no-1].hwprobe->hw_info_verbose[off],
+			str, strlen(str));
+		off += strlen(str);
+	}
+	
+
+#if 0
+	/* Serial number not used in production yet */
+	sprintf(str, "\n+SN:%04X%08X", serial_num_hi, serial_num_lo);
+	memcpy(&hw->hwport[hw->max_port_no-1].hwprobe->hw_info_verbose[off],
+		str, strlen(str));
+
+	off += strlen(str);
+#endif
+
+	/* Reset SPI bus */
+	wan_set_bit(A600_SPI_REG_FX0_RESET_BIT, &reg);
+	wan_set_bit(A600_SPI_REG_FXS_RESET_BIT, &reg);
+	
+	sdla_bus_write_4(hw,A600_REG_OFF(SPI_INTERFACE_REG),reg);
+	WP_DELAY(1000);
+	sdla_bus_write_4(hw,A600_REG_OFF(SPI_INTERFACE_REG),0x00000000);
+	WP_DELAY(1000);
+
+	wan_set_bit(1,&reg);
+        wan_set_bit(2,&reg);
+        sdla_bus_write_4(hw, A600_REG_OFF(0x40),reg);
+
+	sdla_memory_unmap(hw);
+	*line_num = port_cnt;
+	hwcpu->max_ports = port_cnt;	/* overwrite with real port number */
+	hwcpu->port_map = port_map;
+
+	return hw;
+}
+
+
 static sdlahw_t*
 sdla_hwdev_Remora_register(sdlahw_cpu_t* hwcpu, int *line_num)
 {
@@ -1699,11 +1841,11 @@
 	
 		case A104_ADPTR_4TE1:
 			/* Enable memory access */	
-			sdla_bus_read_4(hw, AFT_CHIP_CFG_REG, &reg1);
+			sdla_bus_read_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), &reg1);
 			reg = reg1;
 			wan_clear_bit(AFT_CHIPCFG_SFR_IN_BIT, &reg);
 			wan_clear_bit(AFT_CHIPCFG_SFR_EX_BIT, &reg);
-			sdla_bus_write_4(hw, AFT_CHIP_CFG_REG, reg);
+			sdla_bus_write_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), reg);
 	
 			cpld_off = AFT_SECURITY_CPLD_REG;
 			sdla_hw_read_cpld(hw, cpld_off, &tmp);
@@ -1722,28 +1864,29 @@
 			}
 	
 			/* Restore original value */	
-			sdla_bus_write_4(hw, AFT_CHIP_CFG_REG, reg1);
+			sdla_bus_write_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), reg1);
 			break;
 		}	
 
 	}else if (hwcard->adptr_subtype == AFT_SUBTYPE_SHARK){
 		switch(hwcard->core_id){
 		case AFT_PMC_FE_CORE_ID:
+			
 			switch(hwcard->adptr_type){
 			case A104_ADPTR_4TE1:
 				/* Enable memory access */	
-				sdla_bus_read_4(hw, AFT_CHIP_CFG_REG, &reg1);
+				sdla_bus_read_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), &reg1);
 				reg = reg1;
 				wan_clear_bit(AFT_CHIPCFG_SFR_IN_BIT, &reg);
 				wan_clear_bit(AFT_CHIPCFG_SFR_EX_BIT, &reg);
-				sdla_bus_write_4(hw, AFT_CHIP_CFG_REG, reg);
+				sdla_bus_write_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), reg);
 		
 				cpld_off = AFT_SH_CPLD_BOARD_STATUS_REG;
 				sdla_hw_read_cpld(hw, cpld_off, &status);
 				hwcard->hwec_chan_no = A104_ECCHAN(AFT_SH_SECURITY(status));
 		
 				/* Restore original value */	
-				sdla_bus_write_4(hw, AFT_CHIP_CFG_REG, reg1);
+				sdla_bus_write_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), reg1);
 				break;	
 			case A300_ADPTR_U_1TE3:
 				/* By default, AFT-A300 is unchannelized! */
@@ -1758,18 +1901,18 @@
 			case A104_ADPTR_4TE1:
 			case A108_ADPTR_8TE1:
 				/* Enable memory access */	
-				sdla_bus_read_4(hw, AFT_CHIP_CFG_REG, &reg1);
+				sdla_bus_read_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), &reg1);
 				reg = reg1;
 				wan_clear_bit(AFT_CHIPCFG_SFR_IN_BIT, &reg);
 				wan_clear_bit(AFT_CHIPCFG_SFR_EX_BIT, &reg);
-				sdla_bus_write_4(hw, AFT_CHIP_CFG_REG, reg);
+				sdla_bus_write_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), reg);
 		
 				cpld_off = AFT_SH_CPLD_BOARD_STATUS_REG;
 				sdla_hw_read_cpld(hw, cpld_off, &status);
 				hwcard->hwec_chan_no = A108_ECCHAN(AFT_SH_SECURITY(status));
 						
 				/* Restore original value */	
-				sdla_bus_write_4(hw, AFT_CHIP_CFG_REG, reg1);
+				sdla_bus_write_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), reg1);
 				break;			
 			}	
 			break;
@@ -1778,11 +1921,11 @@
 			case A200_ADPTR_ANALOG:
 			case A400_ADPTR_ANALOG:
 				/* Enable memory access */	
-				sdla_bus_read_4(hw, AFT_CHIP_CFG_REG, &reg1);
+				sdla_bus_read_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), &reg1);
 				reg = reg1;
 				wan_clear_bit(AFT_CHIPCFG_SFR_IN_BIT, &reg);
 				wan_clear_bit(AFT_CHIPCFG_SFR_EX_BIT, &reg);
-				sdla_bus_write_4(hw, AFT_CHIP_CFG_REG, reg);
+				sdla_bus_write_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), reg);
 		
 				cpld_off = A200_SH_CPLD_BOARD_STATUS_REG;
 				sdla_hw_read_cpld(hw, cpld_off, &status);
@@ -1801,20 +1944,50 @@
 				}	
 		
 				/* Restore original value */	
-				sdla_bus_write_4(hw, AFT_CHIP_CFG_REG, reg1);
+				sdla_bus_write_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), reg1);
+				break;
+			case AFT_ADPTR_A600:
+				/* Enable memory access */	
+				sdla_bus_read_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), &reg1);
+				
+				reg = reg1;
+				wan_clear_bit(AFT_CHIPCFG_SFR_IN_BIT, &reg);
+				wan_clear_bit(AFT_CHIPCFG_SFR_EX_BIT, &reg);
+				sdla_bus_write_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), reg);
+ 
+				/* Clearing AFT_CHIPCFG_SFR_IN_BIT also resets C2 security */
+				/* Dummy access to start C2 Security*/
+				sdla_bus_read_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), &reg);
+				/* Delay for C2 Security to be done */
+				WP_DELAY(1000);
+				sdla_bus_read_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), &reg);
+				hwcard->hwec_chan_no = A600_ECCHAN((reg >> 4) & 0x3); 
+				
+				if (hwcard->hwec_chan_no) {					
+					/* Clear octasic reset */
+					reg &= ~0x1000000;
+					sdla_bus_write_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), reg);
+					
+					/* Set octasic reset */
+					reg |=  0x1000000;
+					sdla_bus_write_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), reg);
+				}
+	
+				/* Restore original value */	
+				sdla_bus_write_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), reg1);
 				break;
 
 			case AFT_ADPTR_ISDN:
 				AFT_FUNC_DEBUG();
 				/* Enable memory access */	
-				sdla_bus_read_4(hw, AFT_CHIP_CFG_REG, &reg1);
+				sdla_bus_read_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), &reg1);
 				reg = reg1;
 				wan_clear_bit(AFT_CHIPCFG_SFR_IN_BIT, &reg);
 				wan_clear_bit(AFT_CHIPCFG_SFR_EX_BIT, &reg);
-				sdla_bus_write_4(hw, AFT_CHIP_CFG_REG, reg);
+				sdla_bus_write_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), reg);
 		
 				/* Restore original value */	
-				//sdla_bus_write_4(hw, AFT_CHIP_CFG_REG, reg1);
+				//sdla_bus_write_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), reg1);
 				cpld_off = A200_SH_CPLD_BOARD_STATUS_REG;
 				sdla_hw_read_cpld(hw, cpld_off, &status);
 
@@ -1835,15 +2008,14 @@
 					sdla_hw_write_cpld(hw, cpld_off, 0x00);
 				}	
 				break;
-
 			case AFT_ADPTR_56K:
 				AFT_FUNC_DEBUG();
 				/* Enable memory access */	
-				sdla_bus_read_4(hw, AFT_CHIP_CFG_REG, &reg1);
+				sdla_bus_read_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), &reg1);
 				reg = reg1;
 				wan_clear_bit(AFT_CHIPCFG_SFR_IN_BIT, &reg);
 				wan_clear_bit(AFT_CHIPCFG_SFR_EX_BIT, &reg);
-				sdla_bus_write_4(hw, AFT_CHIP_CFG_REG, reg);
+				sdla_bus_write_4(hw, SDLA_REG_OFF(hwcard, AFT_CHIP_CFG_REG), reg);
 		
 				cpld_off = AFT_SH_CPLD_BOARD_STATUS_REG;
 				sdla_hw_read_cpld(hw, cpld_off, &status);
@@ -2364,7 +2536,29 @@
 			hwcard->core_rev, ports_no,
 			hwcard->bus_no, hwcard->slot_no, irq);
 		break;
+	case AFT_ADPTR_A600:
+		hwcard->cfg_type = WANOPT_AFT_ANALOG;
+		sdla_adapter_cnt.aft_a600_adapters++;
 
+		if ((hwcpu = sdla_hwcpu_register(hwcard, cpu_no, irq, dev)) == NULL){
+			return 0;
+		}
+		/* FIXME: Temporary number of ports is 1 */
+		ports_no = 1;
+		if ((hw = sdla_hwdev_a600_register(hwcpu, &ports_no)) == NULL){
+			sdla_hwcpu_unregister(hwcpu);
+			return 0;
+		}
+
+		number_of_cards++;
+		DEBUG_EVENT("%s: %s%s A600 card found (%s rev.%X), cpu(s) 1, bus #%d, slot #%d, irq #%d\n",
+					wan_drvname,
+					hwcard->adptr_name,
+					AFT_PCITYPE_DECODE(hwcard),
+					AFT_CORE_ID_DECODE(hwcard->core_id),
+					hwcard->core_rev,
+					hwcard->bus_no, hwcard->slot_no, irq);
+		break;
 	default:
 		DEBUG_EVENT(
 		"%s: Unknown adapter %04X (bus #%d, slot #%d, irq #%d)!\n",
@@ -2612,6 +2806,10 @@
 		hwcard->adptr_type	= AFT_ADPTR_4SERIAL_RS232;
 		hwcard->adptr_subtype	= AFT_SUBTYPE_SHARK;
 		break;
+	case AFT_A600_SUBSYS_VENDOR:
+		hwcard->adptr_type	= AFT_ADPTR_A600;
+		hwcard->adptr_subtype	= AFT_SUBTYPE_SHARK;
+		break;
 	default:
 		DEBUG_EVENT(
 		"%s: Unsupported SubVendor ID:%04X (bus=%d, slot=%d)\n",
@@ -2635,6 +2833,7 @@
 	case AFT_4SERIAL_V35X21_SUBSYS_VENDOR:
 	case AFT_2SERIAL_RS232_SUBSYS_VENDOR:
 	case AFT_4SERIAL_RS232_SUBSYS_VENDOR:
+	case AFT_A600_SUBSYS_VENDOR:
 		sdla_pcibridge_detect(hwcard);
 		break;
 	}	
@@ -3993,6 +4192,7 @@
 			hw_iface->fe_read = sdla_shark_rm_read_fe;
 			hw_iface->__fe_read = __sdla_shark_rm_read_fe;
 			hw_iface->fe_write = sdla_shark_rm_write_fe;
+			hw_iface->reset_fe = sdla_a200_reset_fe;
 			break;
 		case A300_ADPTR_U_1TE3:
 			hw_iface->fe_read = sdla_te3_read_fe;
@@ -4011,8 +4211,14 @@
 			hw_iface->fe_read = sdla_shark_serial_read_fe;
 			hw_iface->fe_write = sdla_shark_serial_write_fe;
 			break;
+		case AFT_ADPTR_A600:
+			hw_iface->fe_read = sdla_a600_read_fe;
+			hw_iface->__fe_read = __sdla_a600_read_fe;
+			hw_iface->fe_write = sdla_a600_write_fe;
+			hw_iface->reset_fe = sdla_a600_reset_fe;
+			break;
+		}
 
-		}	
 		switch(hwcard->adptr_type){
 		case A101_ADPTR_1TE1:
 		case A101_ADPTR_2TE1:
@@ -4026,6 +4232,7 @@
 		case AFT_ADPTR_4SERIAL_V35X21:
 		case AFT_ADPTR_2SERIAL_RS232:
 		case AFT_ADPTR_4SERIAL_RS232:
+		case AFT_ADPTR_A600:
 			DEBUG_EVENT("%s: Found: %s card, CPU %c, PciSlot=%d, PciBus=%d, Port=%d\n",
 					devname, 
 					SDLA_DECODE_CARDTYPE(hwcard->cfg_type),
@@ -4044,7 +4251,6 @@
 			break;
 		}
 		break;
-
 	default:
 		DEBUG_EVENT("%s:%d: %s: (2) ERROR, invalid card type! 0x%X\n",
 					__FUNCTION__,__LINE__,	
@@ -4283,7 +4489,15 @@
 			return -EINVAL;
 		}
 		break;
-
+	case WANOPT_AFT600:
+		if (conf->auto_pci_cfg && sdla_adapter_cnt.aft_a600_adapters > 1){
+			DEBUG_EVENT( "%s: HW Auto PCI failed: Multiple AFT-A600 cards found! \n"
+					"%s:    Disable the Autodetect feature and supply\n"
+					"%s:    the PCI Slot and Bus numbers for each card.\n",
+     					devname,devname,devname);
+			return -EINVAL;
+		}
+		break;
 	default:
 		DEBUG_EVENT("%s: Unsupported Sangoma Card (0x%X) requested by user!\n", 
 				devname,conf->card_type);
@@ -4406,6 +4620,7 @@
 		case AFT_ADPTR_4SERIAL_V35X21:
 		case AFT_ADPTR_2SERIAL_RS232:
 		case AFT_ADPTR_4SERIAL_RS232:
+		case AFT_ADPTR_A600:
 			if (hwcpu->used > 1){
 				if (conf) conf->irq = hwcpu->irq;
 				return 0;
@@ -5081,6 +5296,7 @@
 		case AFT_ADPTR_4SERIAL_V35X21:
 		case AFT_ADPTR_2SERIAL_RS232:
 		case AFT_ADPTR_4SERIAL_RS232:
+		case AFT_ADPTR_A600:
 			if (hwcpu->used > 1){
 				break;
 			}
@@ -6865,6 +7081,7 @@
 		case A104_ADPTR_4TE1:
 		case A200_ADPTR_ANALOG:
 		case A400_ADPTR_ANALOG:
+		case AFT_ADPTR_A600:
 		case AFT_ADPTR_ISDN:
 			hwcpu->memory = AFT4_PCI_MEM_SIZE; 
 			break;
@@ -7344,6 +7561,7 @@
 		case A200_ADPTR_ANALOG:
 		case A400_ADPTR_ANALOG:
 		case AFT_ADPTR_56K:
+		case AFT_ADPTR_A600:
 			conf->comm_port = 0;
 			conf->fe_cfg.line_no = 0;
 			break;
@@ -8215,6 +8433,7 @@
 	hwcpu = hw->hwcpu;
 
 	if (!(hwcpu->status & SDLA_MEM_MAPPED)) return 0;
+
 #if defined(__FreeBSD__)
 	*value = readb(((u8*)hwcpu->dpmbase + offset));
 #elif defined(__NetBSD__) || defined(__OpenBSD__)
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/src/net/sdladrv_fe.c wanpipe-3.3.14b/patches/kdrivers/src/net/sdladrv_fe.c
--- wanpipe-3.3.14/patches/kdrivers/src/net/sdladrv_fe.c	2008-08-12 16:34:11.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/src/net/sdladrv_fe.c	2008-10-17 12:08:22.000000000 -0400
@@ -72,6 +72,9 @@
 # warning "WAN_DEBUG_REG - Debugging Enabled"
 #endif
 
+#define AFT_A600_BASE_REG_OFF	0x1000
+#define A600_REG_OFF(reg) reg+AFT_A600_BASE_REG_OFF
+
 /***************************************************************************
 ****                     M A C R O S / D E F I N E S                    ****
 ***************************************************************************/
@@ -99,6 +102,7 @@
 int		sdla_shark_rm_write_fe (void* phw, ...);
 u_int8_t	__sdla_shark_rm_read_fe (void* phw, ...);
 u_int8_t	sdla_shark_rm_read_fe (void* phw, ...);
+void 		sdla_a200_reset_fe (void* fe);
 
 static int	__sdla_shark_56k_write_fe(void *phw, ...);
 int		sdla_shark_56k_write_fe(void *phw, ...);
@@ -118,6 +122,12 @@
 int		sdla_te3_write_fe(void *phw, ...);
 u_int8_t	sdla_te3_read_fe(void *phw, ...);
 
+static int	__sdla_a600_write_fe(void *phw, ...);
+int		sdla_a600_write_fe(void *phw, ...);
+u_int8_t	__sdla_a600_read_fe (void *phw, ...);
+u_int8_t	sdla_a600_read_fe (void *phw, ...);
+void		sdla_a600_reset_fe (void *fe);
+
 extern int sdla_bus_write_1(void* phw, unsigned int offset, u8 value);
 extern int sdla_bus_read_1(void* phw, unsigned int offset, u8* value);
 extern int sdla_bus_write_2(void* phw, unsigned int offset, u16 value);
@@ -624,11 +634,267 @@
 
 
 /***************************************************************************
-	Front End FXS/FXO interface for Shark subtype cards
+	Front End FXS/FXO interface for Shark subtype cards - A600
 ***************************************************************************/
-/*============================================================================
- * Read TE1/56K Front end registers
- */
+
+static int __sdla_a600_write_fe(void *phw, ...)
+{
+	sdlahw_t	*hw = (sdlahw_t*)phw;
+	va_list		args;
+	int		mod_no, type, chain;
+	int		reg, value;
+	u32		data = 0;
+	//unsigned char	cs = 0x00, ctrl_byte = 0x00;
+	int		i;
+
+	WAN_ASSERT(hw == NULL);
+	WAN_ASSERT(hw->hwcpu == NULL);
+	WAN_ASSERT(hw->hwcpu->hwcard == NULL);
+
+	va_start(args, phw);
+	mod_no	= va_arg(args, int);
+	type	= va_arg(args, int);
+	chain	= va_arg(args, int);
+	reg	= va_arg(args, int);
+	value	= va_arg(args, int);
+	va_end(args);
+	
+	if (chain) DEBUG_EVENT ("%s :%d Error: chain mode not supported on A600 (%s:%d)\n",
+					hw->devname, mod_no, __FUNCTION__,__LINE__);
+				
+		    
+	if (type == MOD_TYPE_FXO){
+		data |= (mod_no & 0x3) << 24;
+		data &= 0xFF000000;
+			
+		/* Clear data bits */
+		data |= (value & 0xFF);
+	
+		reg = reg & 0x7F;
+		data |= (reg & 0xFF) << 8;
+			
+	}else if (type == MOD_TYPE_FXS){
+		wan_set_bit(A600_SPI_REG_CHAN_TYPE_FXS_BIT, &data); /* 1 << 28 */
+		
+		/* Clear data bits */
+		data |= (value & 0xFF);
+		
+		reg = reg & 0x7F;
+		data |= (reg & 0xFF) << 8;
+		
+	}else{
+		DEBUG_EVENT("%s: Module %d: Unsupported module type %d!\n",
+					hw->devname, mod_no, type);
+					return -EINVAL;
+	}
+	
+	sdla_bus_write_4(hw, A600_REG_OFF(SPI_INTERFACE_REG), data);	
+		
+	WP_DELAY(10);
+		
+	wan_set_bit(A600_SPI_REG_START_BIT, &data);
+	sdla_bus_write_4(hw, A600_REG_OFF(SPI_INTERFACE_REG), data);
+	
+	for (i=0;i<10;i++) {	
+		WP_DELAY(10);
+		sdla_bus_read_4(hw, A600_REG_OFF(SPI_INTERFACE_REG),&data);
+		if (!(wan_test_bit(A600_SPI_REG_SPI_BUSY_BIT, &data))) {
+			goto spi_write_done;
+		}
+	}
+			
+	if (wan_test_bit(A600_SPI_REG_SPI_BUSY_BIT, &data)) {
+		DEBUG_EVENT("%s: ERROR:SPI Iface not ready\n", hw->devname);
+		return -EINVAL;
+	}
+		
+spi_write_done:
+	return 0;
+}
+
+int sdla_a600_write_fe(void *phw, ...)
+{
+	sdlahw_t	*hw = (sdlahw_t*)phw;
+	va_list		args;
+	int		mod_no, type, chain, reg, value;
+#if defined(WAN_DEBUG_FE)
+	char		*fname;	
+	int		fline;
+#endif
+
+	WAN_ASSERT(hw->magic != SDLADRV_MAGIC);
+	va_start(args, phw);
+	mod_no	= va_arg(args, int);
+	type	= va_arg(args, int);
+	chain	= va_arg(args, int);
+	reg	= va_arg(args, int);
+	value	= va_arg(args, int);
+	va_end(args);
+
+	if (sdla_hw_fe_test_and_set_bit(hw,0)){
+		DEBUG_EVENT("%s: %s:%d: Critical Error: Re-entry in FE!\n",
+			    hw->devname, __FUNCTION__,__LINE__);
+		return -EINVAL;
+	}
+	
+	__sdla_a600_write_fe(hw, mod_no, type, chain, reg, value);
+	sdla_hw_fe_clear_bit(hw,0);
+	return 0;
+}
+
+u_int8_t __sdla_a600_read_fe (void *phw, ...)
+{
+
+	sdlahw_t	*hw = (sdlahw_t*)phw;
+	va_list		args;
+	int		mod_no, type, chain, reg;
+	u32		data = 0;
+	int		i;
+
+	WAN_ASSERT(hw == NULL);
+	WAN_ASSERT(hw->hwcpu == NULL);
+	WAN_ASSERT(hw->hwcpu->hwcard == NULL);
+
+	va_start(args, phw);
+	mod_no	= va_arg(args, int);
+	type	= va_arg(args, int);
+	chain	= va_arg(args, int);
+	reg	= va_arg(args, int);
+	va_end(args);
+
+	if (chain) DEBUG_EVENT ("%s :%d Error: chain mode not supported on A600 (%s:%d)\n",
+	    		hw->devname, mod_no, __FUNCTION__,__LINE__);
+	
+
+	wan_set_bit(A600_SPI_REG_READ_ENABLE_BIT, &data);
+	
+	if (type == MOD_TYPE_FXO){
+		data |= (mod_no & 0x3) << 24;
+		data &= 0xFF000000;
+	
+		reg = reg & 0xFF;
+		data |= (reg & 0xFF) << 8;
+		data &= 0xFFFFFF00;
+   
+	}else if (type == MOD_TYPE_FXS){
+		wan_set_bit(A600_SPI_REG_CHAN_TYPE_FXS_BIT, &data);
+		
+		reg = reg & 0x7F;
+		data |= (reg & 0xFF) << 8;
+		data &= 0xFFFFFF00;
+   
+	} else {
+		DEBUG_EVENT("%s: Module %d: Unsupported module type %d!\n",
+					hw->devname, mod_no, type);
+		return 0xFF;
+	}
+	
+	sdla_bus_write_4(hw, A600_REG_OFF(SPI_INTERFACE_REG), data);
+	WP_DELAY(10);
+
+	wan_set_bit(A600_SPI_REG_START_BIT, &data);
+	sdla_bus_write_4(hw, A600_REG_OFF(SPI_INTERFACE_REG), data);
+	
+		
+	for (i=0;i<10;i++) {
+		WP_DELAY(10);
+		sdla_bus_read_4(hw, A600_REG_OFF(SPI_INTERFACE_REG),&data);
+			
+		if (!(wan_test_bit(A600_SPI_REG_SPI_BUSY_BIT, &data))) {
+			goto spi_read_done;
+		}
+	}
+		
+spi_read_done:
+	if (wan_test_bit(A600_SPI_REG_SPI_BUSY_BIT, &data)) {
+		DEBUG_EVENT("%s: ERROR:SPI Iface not ready\n", hw->devname);
+		data = 0xFF;
+	}
+	
+	return (u8) data;
+}
+
+u_int8_t sdla_a600_read_fe (void *phw, ...)
+{
+	sdlahw_t	*hw = (sdlahw_t*)phw;
+	va_list		args;
+	int		mod_no, type, chain, reg;
+	unsigned char	data = 0;
+
+	WAN_ASSERT(hw->magic != SDLADRV_MAGIC);
+	va_start(args, phw);
+	mod_no	= va_arg(args, int);
+	type	= va_arg(args, int);
+	chain	= va_arg(args, int);
+	reg	= va_arg(args, int);
+	va_end(args);
+
+	if (sdla_hw_fe_test_and_set_bit(hw,0)){
+		DEBUG_EVENT("%s: %s:%d: Critical Error: Re-entry in FE!\n",
+			    hw->devname, __FUNCTION__,__LINE__);
+		return 0x00;
+	}
+	
+	data = __sdla_a600_read_fe (hw, mod_no, type, chain, reg);
+
+	sdla_hw_fe_clear_bit(hw,0);
+	return data;
+}
+
+void sdla_a600_reset_fe (void *fe)  
+{
+	u32 reg;
+	sdla_t *card;
+	
+	WAN_ASSERT1(fe == NULL);
+
+	card = (sdla_t*)((sdla_fe_t*)fe)->card;
+
+	WAN_ASSERT1(card == NULL);
+	
+	DEBUG_RM("%s: Resetting SPI\n", fe->name);
+	
+	/* Reset FXO */
+	reg = 0x00;
+	
+	/* set reset */
+	wan_set_bit(A600_SPI_REG_FX0_RESET_BIT, &reg);
+	card->hw_iface.bus_write_4(card->hw,
+				   A600_REG_OFF(SPI_INTERFACE_REG),
+						   reg);
+	
+	WP_DELAY(1000);
+	
+	/* clear reset */
+	wan_clear_bit(A600_SPI_REG_FX0_RESET_BIT, &reg);
+	card->hw_iface.bus_write_4(card->hw,
+				   A600_REG_OFF(SPI_INTERFACE_REG),
+					   reg);
+	
+	WP_DELAY(1000);
+	
+	/* Reset FXS */
+	reg = 0x00;
+	wan_set_bit(A600_SPI_REG_FXS_RESET_BIT, &reg);
+	card->hw_iface.bus_write_4(card->hw,
+				   A600_REG_OFF(SPI_INTERFACE_REG),
+						   reg);
+	
+	WP_DELAY(1000);
+	
+	/* clear reset */
+	wan_clear_bit(A600_SPI_REG_FXS_RESET_BIT, &reg);
+	card->hw_iface.bus_write_4(card->hw,
+				   A600_REG_OFF(SPI_INTERFACE_REG),
+						   reg);
+	
+	WP_DELAY(1000);
+}
+
+/***************************************************************************
+	Front End FXS/FXO interface for Shark subtype cards - A200/A400
+***************************************************************************/
+
 static int __sdla_shark_rm_write_fe (void* phw, ...)
 {
 	sdlahw_t	*hw = (sdlahw_t*)phw;
@@ -1009,6 +1275,25 @@
 	return data;
 }
 
+void sdla_a200_reset_fe (void *fe)
+{
+	sdla_t *card;
+
+	WAN_ASSERT1(fe == NULL);
+	card = (sdla_t*)((sdla_fe_t*)fe)->card;
+
+	WAN_ASSERT1(card == NULL);
+	
+	card->hw_iface.bus_write_4(card->hw,
+					SPI_INTERFACE_REG,
+     					MOD_SPI_RESET);
+	
+	WP_DELAY(1000);
+	card->hw_iface.bus_write_4(card->hw,
+					SPI_INTERFACE_REG,
+     					0x00000000);
+	WP_DELAY(1000);
+}
 
 /***************************************************************************
 	ISDN BRI Front End interface
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/src/net/sdlamain.c wanpipe-3.3.14b/patches/kdrivers/src/net/sdlamain.c
--- wanpipe-3.3.14/patches/kdrivers/src/net/sdlamain.c	2008-08-12 16:34:11.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/src/net/sdlamain.c	2008-10-20 10:14:51.000000000 -0400
@@ -200,6 +200,10 @@
  #define wp_aft_analog_init(card,conf) (-EPROTONOSUPPORT)
 #endif
 
+#ifndef CONFIG_PRODUCT_WANPIPE_AFT_A600
+ #define wp_aft_a600_init(card, conf) (-EPROTONOSUPPORT)
+#endif
+
 #ifndef CONFIG_PRODUCT_WANPIPE_AFT_56K
  #define wp_aft_56k_init(card,conf) (-EPROTONOSUPPORT)
 #endif
@@ -931,11 +935,17 @@
 		break;
 
 	case WANCONFIG_AFT_ANALOG:
-		DEBUG_EVENT("%s: Starting AFT Analog Hardware Init.\n",
-					card->devname);
-		err = wp_aft_analog_init(card,conf);
-		break;
-
+		if (card->adptr_type == AFT_ADPTR_A600) {
+                        DEBUG_EVENT("%s: Starting AFT A600 Hardware Init.\n",
+                                                card->devname);
+                        err = wp_aft_a600_init(card,conf);
+                } else {
+                        DEBUG_EVENT("%s: Starting AFT Analog Hardware Init.\n",
+                                                card->devname);
+                        err = wp_aft_analog_init(card,conf);
+                }
+                break;
+		
 	case WANCONFIG_AFT_ISDN_BRI:
 		DEBUG_EVENT("%s: Starting AFT ISDN BRI Hardware Init.\n",
 					card->devname);
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/src/net/sdla_remora.c wanpipe-3.3.14b/patches/kdrivers/src/net/sdla_remora.c
--- wanpipe-3.3.14/patches/kdrivers/src/net/sdla_remora.c	2008-10-01 18:08:44.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/src/net/sdla_remora.c	2008-10-27 10:36:02.000000000 -0400
@@ -503,21 +503,51 @@
 static int
 wp_proslic_setreg_indirect(sdla_fe_t *fe, int mod_no, unsigned char address, unsigned short data)
 {
+	int i;
 	DEBUG_REG("%s: Indirect Register %d = %X\n",
 				fe->name, address, data);
 	WRITE_RM_REG(mod_no, IDA_LO,(unsigned char)(data & 0xFF));
 	WRITE_RM_REG(mod_no, IDA_HI,(unsigned char)((data & 0xFF00)>>8));
 	WRITE_RM_REG(mod_no, IAA,address);
+
+	/* ProSLIC indirect access updates at 16Khz */
+	for (i = 0; i < 100; i++) {
+		WP_DELAY(10);
+		if (!(READ_RM_REG(mod_no, 31) & 0x1)) {
+			break;
+		}
+	}
+
+	if (READ_RM_REG(mod_no, 31) & 0x1) {
+		DEBUG_EVENT("%s: Critical error:ProSLIC indirect write failed (mod:0x%X add:0x%X)\n",
+				fe->name, mod_no, address);
+		return -EINVAL;
+	}	
 	return 0;
 }
 
 static int
 wp_proslic_getreg_indirect(sdla_fe_t *fe, int mod_no, unsigned char address)
 { 
+	int i;
 	int res = -1;
 	unsigned char data1, data2;
 
 	WRITE_RM_REG(mod_no, IAA, address);
+
+	for (i = 0; i < 100; i++) {
+		WP_DELAY(10);
+		if (!(READ_RM_REG(mod_no, 31) & 0x1)) {
+			break;	
+		}
+	}
+
+	if (READ_RM_REG(mod_no, 31) & 0x1) {
+		DEBUG_EVENT("%s: Critical error:ProSLIC indirect read failed (mod:%X)\n",
+				fe->name, mod_no);
+		return -EINVAL;
+	}		
+	
 	data1 = READ_RM_REG(mod_no, IDA_LO);
 	data2 = READ_RM_REG(mod_no, IDA_HI);
 	res = data1 | (data2 << 8);
@@ -590,7 +620,17 @@
 	int		mod_no;
 	unsigned char	byte;
 
-	for(mod_no = 0;mod_no < MAX_REMORA_MODULES; mod_no ++){
+	WAN_ASSERT_RC(fe->reset_fe == NULL,0);
+	
+	if (IS_A600(fe)) {
+		for(mod_no = 0; mod_no < NUM_A600_ANALOG_FXO_PORTS; mod_no++) {
+			fe->rm_param.mod[mod_no].type = MOD_TYPE_FXO;
+		}
+		fe->rm_param.mod[4].type = MOD_TYPE_FXS;
+		return 0;
+	}
+	
+	for(mod_no = 0;mod_no < fe->rm_param.max_fe_channels; mod_no ++){
 		if (fe->rm_param.mod[mod_no].type == MOD_TYPE_NONE){
 			byte = READ_RM_FXS_REG(mod_no, 0, 0);
 			byte &= 0x0F;
@@ -608,8 +648,9 @@
 		}
 	}
 	/* Reset SPI interface */
-	wp_remora_reset_spi(fe);
-	for(mod_no = 0;mod_no < MAX_REMORA_MODULES; mod_no ++){
+	fe->reset_fe(fe);
+
+	for(mod_no = 0;mod_no < fe->rm_param.max_fe_channels; mod_no ++){	
 		if (fe->rm_param.mod[mod_no].type == MOD_TYPE_NONE){
 			byte = READ_RM_FXO_REG(mod_no,1,2);
 			if (byte == 0x03){
@@ -622,7 +663,7 @@
 	}
 
 	/* Reset SPI interface */
-	wp_remora_reset_spi(fe);
+	fe->reset_fe(fe);
 
 	/* Now enable chain mode for only FXS modules (FXO by default chain) */
 	for(mod_no = 0;mod_no < MAX_REMORA_MODULES; mod_no ++){
@@ -1552,9 +1593,17 @@
 	int		err=0, mod_no, mod_cnt = 0, err_cnt = 0, retry;
 	int		sane=0;
 
+	WAN_ASSERT_RC(fe->reset_fe == NULL,0);
+
 	DEBUG_EVENT("%s: Configuring FXS/FXO Front End ...\n",
         		     	fe->name);
-	fe->rm_param.max_fe_channels 	= MAX_REMORA_MODULES;
+	
+	if (IS_A600(fe)) {
+		fe->rm_param.max_fe_channels 	= NUM_A600_ANALOG_PORTS;
+	} else {
+		fe->rm_param.max_fe_channels 	= MAX_REMORA_MODULES;
+	}
+
 	fe->rm_param.module_map 	= 0;
 	fe->rm_param.intcount		= 0;
 	fe->rm_param.last_watchdog 	= SYSTEM_TICKS;
@@ -1565,7 +1614,7 @@
 
 	wait_just_a_bit(HZ, 0);
 	/* Reset SPI interface */
-	wp_remora_reset_spi(fe);
+	fe->reset_fe(fe);
 
 	/* Search for installed modules and enable chain for all modules */
 	if (wp_remora_chain_enable(fe)){
@@ -1575,7 +1624,7 @@
 	}
 
 	/* Auto detect FXS and FXO modules */
-	for(mod_no = 0; mod_no < MAX_REMORA_MODULES; mod_no++){
+	for(mod_no = 0; mod_no < fe->rm_param.max_fe_channels; mod_no++){
 		sane = 0; err = 0; retry = 0;
 retry_cfg:
 		switch(fe->rm_param.mod[mod_no].type){
@@ -1706,7 +1755,7 @@
 	/* Clear and Kill TE timer poll command */
 	wan_clear_bit(WP_RM_CONFIGURED,(void*)&fe->rm_param.critical);
 	
-	for(mod_no = 0; mod_no < MAX_REMORA_MODULES; mod_no++){
+	for(mod_no = 0; mod_no < fe->rm_param.max_fe_channels; mod_no++){
 		if (wan_test_bit(mod_no, &fe->rm_param.module_map)) {
 			wan_clear_bit(mod_no, &fe->rm_param.module_map);
 		}
@@ -1788,7 +1837,7 @@
 	if (usedby == TDM_VOICE_API){
 #if defined(AFT_RM_INTR_SUPPORT)
 		/* Enable remora interrupts (only for TDM_API) */
-		for(mod_no = 0; mod_no < MAX_REMORA_MODULES; mod_no++){
+		for(mod_no = 0; mod_no < fe->rm_param.max_fe_channels; mod_no++){
 			if (!wan_test_bit(mod_no, &fe->rm_param.module_map) ||
 			    !wan_test_bit(mod_no, &mod_map)){
 				continue;
@@ -1822,7 +1871,7 @@
 
 	if (usedby == TDM_VOICE_API){
 #if defined(AFT_RM_INTR_SUPPORT)
-		for(mod_no = 0; mod_no < MAX_REMORA_MODULES; mod_no++){
+		for(mod_no = 0; mod_no < fe->rm_param.max_fe_channels; mod_no++){
 			if (!wan_test_bit(mod_no, &fe->rm_param.module_map) ||
 			!wan_test_bit(mod_no, &mod_map)){
 			continue;
@@ -1852,7 +1901,7 @@
 		return -EINVAL;
 	}
 
-	for(mod_no = 0; mod_no < MAX_REMORA_MODULES; mod_no++){
+	for(mod_no = 0; mod_no < fe->rm_param.max_fe_channels; mod_no++){
 		if (wan_test_bit(mod_no, &fe->rm_param.module_map)) {
 			wp_remora_intr_ctrl(	fe, 
 						mod_no, 
@@ -1893,7 +1942,7 @@
 static int wp_remora_set_dtmf(sdla_fe_t *fe, int mod_no, unsigned char val)
 {
 
-	if (mod_no > MAX_REMORA_MODULES){
+	if (mod_no > fe->rm_param.max_fe_channels){
 		DEBUG_EVENT("%s: Module %d: Module number out of range!\n",
 					fe->name, mod_no+1);
 		return -EINVAL;
@@ -2381,7 +2430,7 @@
 *				wp_remora_event_verification()	
 *
 * Description: 
-* Arguments: mod_no -  Module number (1,2,3,... MAX_REMORA_MODULES)
+* Arguments: mod_no -  Module number (1,2,3,... fe->rm_param.max_fe_channels)
 * Returns:
 ******************************************************************************/
 static int
@@ -2440,7 +2489,7 @@
 *				wp_remora_event_ctrl()	
 *
 * Description: Enable/Disable event types
-* Arguments: mod_no -  Module number (1,2,3,... MAX_REMORA_MODULES)
+* Arguments: mod_no -  Module number (1,2,3,... fe->rm_param.max_fe_channels)
 * Returns:
 ******************************************************************************/
 static int
@@ -2451,7 +2500,7 @@
 
 	WAN_ASSERT(ectrl == NULL);
 	
-	if (mod_no+1 > MAX_REMORA_MODULES){
+	if (mod_no+1 > fe->rm_param.max_fe_channels){
 		DEBUG_EVENT("%s: Module %d: Module number is out of range!\n",
 					fe->name, mod_no+1);
 		return -EINVAL;
@@ -2701,12 +2750,23 @@
 static int wp_remora_udp(sdla_fe_t *fe, void* p_udp_cmd, unsigned char* data)
 {
 	wan_cmd_t		*udp_cmd = (wan_cmd_t*)p_udp_cmd;
+	wan_femedia_t		*fe_media;
 	sdla_fe_debug_t		*fe_debug;	
 	sdla_fe_timer_event_t	event;
 	int			err = -EINVAL;
 
 	memset(&event, 0, sizeof(sdla_fe_timer_event_t));
 	switch(udp_cmd->wan_cmd_command){
+	case WAN_GET_MEDIA_TYPE:
+		fe_media = (wan_femedia_t*)data;
+		memset(fe_media, 0, sizeof(wan_femedia_t));
+		fe_media->media		= fe->fe_cfg.media;
+		fe_media->sub_media	= fe->fe_cfg.sub_media;
+		fe_media->chip_id	= 0x00;
+		fe_media->max_ports	= 1;
+		udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
+		udp_cmd->wan_cmd_data_len = sizeof(wan_femedia_t); 
+		break;
 	case WAN_FE_TONES:
 		event.type	= WP_RM_POLL_TONE;
 		event.rm_event.mod_no	= data[0];
@@ -3406,7 +3466,7 @@
 *			wp_remora_watchdog()	
 *
 * Description:
-* Arguments: mod_no -  Module number (1,2,3,... MAX_REMORA_MODULES)
+* Arguments: mod_no -  Module number (1,2,3,... fe->rm_param.max_fe_channels)
 * Returns:
 ******************************************************************************/
 static int wp_remora_watchdog(sdla_fe_t *fe)
@@ -3524,7 +3584,7 @@
 {
 	int		err = 0;
 
-	if (mod_no >= MAX_REMORA_MODULES){
+	if (mod_no >= fe->rm_param.max_fe_channels){
 		DEBUG_EVENT(
 		"%s: Module %d: Module number is out of range!\n",
 					fe->name, mod_no+1);
@@ -3625,7 +3685,7 @@
 	int	mod_no = 0, pending = 0;
 
 	fe->rm_param.intcount++;
-	for(mod_no = 0; mod_no < MAX_REMORA_MODULES; mod_no++){
+	for(mod_no = 0; mod_no < fe->rm_param.max_fe_channels; mod_no++){
 		if (wan_test_bit(mod_no, &fe->rm_param.module_map)) {
 			if (fe->rm_param.mod[mod_no].type == MOD_TYPE_FXS){
 				pending = wp_remora_check_intr_fxs(fe, mod_no);
@@ -3881,7 +3941,7 @@
 	int	mod_no = 0;
 	
 	/* calling per module per interupt  */
-	mod_no = fe->rm_param.access_counter  % MAX_REMORA_MODULES;
+	mod_no = fe->rm_param.access_counter  % fe->rm_param.max_fe_channels;
 	
   	if ( mod_no < fe->rm_param.max_fe_channels ) { /*sanity check for mod_no */
 		if (wan_test_bit(mod_no, &fe->rm_param.module_map)) { 
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/src/net/sdla_remora_tdmv.c wanpipe-3.3.14b/patches/kdrivers/src/net/sdla_remora_tdmv.c
--- wanpipe-3.3.14/patches/kdrivers/src/net/sdla_remora_tdmv.c	2008-09-12 16:45:38.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/src/net/sdla_remora_tdmv.c	2008-10-20 12:30:07.000000000 -0400
@@ -1590,7 +1590,7 @@
 	/* This feature is used to change zaptel buffering that improves
 	   faxing between analog & SMG. Enable this feature ONLY when 
 	   network sync is ON */
-	if (WAN_FE_NETWORK_SYNC(&card->fe) && 
+	if (WAN_FE_NETWORK_SYNC(&card->fe) == WANOPT_YES && 
 	    wr->chans[channo].txbufpolicy != ZT_POLICY_WHEN_FULL) {
 		DEBUG_EVENT("%s: RX CHAN %i Setting FULL POLICY\n", 
 			card->devname,channo);
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/src/wanrouter/wanproc.c wanpipe-3.3.14b/patches/kdrivers/src/wanrouter/wanproc.c
--- wanpipe-3.3.14/patches/kdrivers/src/wanrouter/wanproc.c	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/src/wanrouter/wanproc.c	2008-10-17 12:23:09.000000000 -0400
@@ -815,6 +815,9 @@
 	if (hw_cnt->aft300_adapters){
 		PROC_ADD_LINE(m, "A300=%d ", hw_cnt->aft300_adapters);
 	}
+	if (hw_cnt->aft_a600_adapters){
+		PROC_ADD_LINE(m, "A600=%d ", hw_cnt->aft_a600_adapters);
+	}
 	PROC_ADD_LINE(m, "\n");
 
 	PROC_ADD_RET(m);
@@ -856,7 +859,7 @@
 	hw_cnt=(sdla_hw_type_cnt_t*)sdla_get_hw_adptr_cnt();	
 	
 	PROC_ADD_LINE(m,
-		"\nCard Cnt: S508=%d S514X=%d S518=%d A101-2=%d A104=%d A300=%d A200=%d A108=%d A056=%d\n          A500=%d A14x=%d\n",
+		"\nCard Cnt: S508=%d S514X=%d S518=%d A101-2=%d A104=%d A300=%d A200=%d A108=%d A056=%d\n          A500=%d A14x=%d A600=%d\n",
 		hw_cnt->s508_adapters,
 		hw_cnt->s514x_adapters,
 		hw_cnt->s518_adapters,
@@ -867,7 +870,8 @@
 		hw_cnt->aft108_adapters,
 		hw_cnt->aft_56k_adapters,
 		hw_cnt->aft_isdn_adapters,
-		hw_cnt->aft_serial_adapters
+		hw_cnt->aft_serial_adapters,
+		hw_cnt->aft_a600_adapters
 		);
 
 	PROC_ADD_RET(m);
@@ -944,6 +948,9 @@
 	if (hw_cnt->aft300_adapters){
 		PROC_ADD_LINE(m, "A300=%d ", hw_cnt->aft300_adapters);
 	}
+	if (hw_cnt->aft_a600_adapters){
+		PROC_ADD_LINE(m, "A600=%d ", hw_cnt->aft_a600_adapters);
+	}
 	PROC_ADD_LINE(m, "\n");
 
 	PROC_ADD_RET(m);
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/wanec/.tmp_versions/wanec.mod wanpipe-3.3.14b/patches/kdrivers/wanec/.tmp_versions/wanec.mod
--- wanpipe-3.3.14/patches/kdrivers/wanec/.tmp_versions/wanec.mod	2008-10-23 16:43:51.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/wanec/.tmp_versions/wanec.mod	2008-10-27 10:56:24.000000000 -0400
@@ -1,2 +1,2 @@
-/root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/wanec.ko
-/root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/wanec_iface.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/wanec_cmd.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/wanec_utils.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/wanec_dev.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/apilib/bt/octapi_bt0.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/apilib/largmath/octapi_largmath.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/apilib/llman/octapi_llman.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_apimi/oct6100_mask_interrupts.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_adpcm_chan.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_chip_open.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_chip_stats.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_conf_bridge.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_debug.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_events.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_interrupts.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_memory.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_miscellaneous.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_mixer.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_phasing_tsst.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_playout_buf.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_remote_debug.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_tlv.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_tone_detection.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_tsi_cnct.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_tsst.o /root/3.3/r3314/wanpipe-3.3.14/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_user.o
+/root/3.3/wanpipe/patches/kdrivers/wanec/wanec.ko
+/root/3.3/wanpipe/patches/kdrivers/wanec/wanec_iface.o /root/3.3/wanpipe/patches/kdrivers/wanec/wanec_cmd.o /root/3.3/wanpipe/patches/kdrivers/wanec/wanec_utils.o /root/3.3/wanpipe/patches/kdrivers/wanec/wanec_dev.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/apilib/bt/octapi_bt0.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/apilib/largmath/octapi_largmath.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/apilib/llman/octapi_llman.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_apimi/oct6100_mask_interrupts.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_adpcm_chan.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_channel.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_chip_open.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_chip_stats.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_conf_bridge.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_debug.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_events.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_interrupts.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_memory.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_miscellaneous.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_mixer.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_phasing_tsst.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_playout_buf.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_remote_debug.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_tlv.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_tone_detection.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_tsi_cnct.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_tsst.o /root/3.3/wanpipe/patches/kdrivers/wanec/oct6100_api/octdeviceapi/oct6100api/oct6100_api/oct6100_user.o
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/patches/kdrivers/wanec/wanec_iface.c wanpipe-3.3.14b/patches/kdrivers/wanec/wanec_iface.c
--- wanpipe-3.3.14/patches/kdrivers/wanec/wanec_iface.c	2008-09-30 18:39:14.000000000 -0400
+++ wanpipe-3.3.14b/patches/kdrivers/wanec/wanec_iface.c	2008-10-20 12:03:47.000000000 -0400
@@ -331,6 +331,7 @@
 	case 0x000A:
 		return 0x74;
 	}
+	
 	return 0x00;
 }
 
@@ -355,6 +356,10 @@
 		return -EINVAL;
 	}
 
+	if (IS_A600_CARD(card)) {
+		addr+=0x1000;
+	}
+
 	err = card->hw_iface.bus_read_4(card->hw, addr, data);
 	
 	WP_DELAY(5);
@@ -383,6 +388,9 @@
 		return -EINVAL;
 	}
 
+	if (IS_A600_CARD(card)) {
+		addr+=0x1000;
+	}
 
 	err = card->hw_iface.bus_write_4(card->hw, addr, data);	
 
@@ -1856,7 +1864,13 @@
 	ec_dev_new->fe_media		= WAN_FE_MEDIA(&card->fe);
 	ec_dev_new->fe_lineno		= WAN_FE_LINENO(&card->fe);
 	ec_dev_new->fe_start_chan	= WAN_FE_START_CHANNEL(&card->fe);	
-	ec_dev_new->fe_max_chans	= WAN_FE_MAX_CHANNELS(&card->fe);	//max_line_no;	//
+	
+	if (IS_A600_CARD(card)) {
+		ec_dev_new->fe_max_chans	= 5;	//max_line_no;	//
+	} else {
+		ec_dev_new->fe_max_chans	= WAN_FE_MAX_CHANNELS(&card->fe);	//max_line_no;	//
+	}
+
 	ec_dev_new->fe_stop_chan	= ec_dev_new->fe_start_chan + ec_dev_new->fe_max_chans - 1;
 	/* Feb 14, 2008
 	** Ignore fe_port_mask for BRI cards. fe_port_mask is for full card, 
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/samples/wanrouter wanpipe-3.3.14b/samples/wanrouter
--- wanpipe-3.3.14/samples/wanrouter	2008-10-08 17:30:52.000000000 -0400
+++ wanpipe-3.3.14b/samples/wanrouter	2008-10-24 17:15:14.000000000 -0400
@@ -2195,7 +2195,7 @@
 {
 
 	if [ $OSYSTEM = "Linux" ]; then
-		ROUTER_VERSION=3.3.14
+		ROUTER_VERSION=3.3.14b
 		IFCONFIG_LIST=ifconfig
 		MODULE_STAT=lsmod
 		WAN_DRIVERS="wanpipe"
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/Setup wanpipe-3.3.14b/Setup
--- wanpipe-3.3.14/Setup	2008-10-08 17:30:52.000000000 -0400
+++ wanpipe-3.3.14b/Setup	2008-10-24 17:15:14.000000000 -0400
@@ -478,7 +478,7 @@
 		TDM API        : /usr/sbin/wancfg_tdmapi
 		SMG SS7/BRI    : /usr/sbin/wancfg_smg
 		WAN Routing/API: /usr/sbin/wancfg
-	2) Use the /usr/sbin/wanrouter startup scrip to start and stop
+	2) Use the /usr/sbin/wanrouter startup script to start and stop
 	   the router. (eg: wanrouter start)
 	3) To uninstall WANPIPE package run ./Setup remove
 		
@@ -6535,7 +6535,7 @@
 	if [ $? -eq 0 ]; then
 		if [ $AFT_TE1_PROT != YES ]; then
 			echo "Enabling the AFT TE1 Support"
-			PROTOCOL_DEFINES="$PROTOCOL_DEFINES -DCONFIG_PRODUCT_WANPIPE_AFT -DCONFIG_PRODUCT_WANPIPE_AFT_CORE -DCONFIG_PRODUCT_WANPIPE_AFT_TE1 -DCONFIG_PRODUCT_WANPIPE_AFT_56K -DCONFIG_PRODUCT_WANPIPE_AFT_RM -DCONFIG_PRODUCT_WANPIPE_CODEC_SLINEAR_LAW  -DCONFIG_PRODUCT_WANPIPE_AFT_BRI  -DCONFIG_PRODUCT_WANPIPE_AFT_SERIAL "
+			PROTOCOL_DEFINES="$PROTOCOL_DEFINES -DCONFIG_PRODUCT_WANPIPE_AFT -DCONFIG_PRODUCT_WANPIPE_AFT_CORE -DCONFIG_PRODUCT_WANPIPE_AFT_TE1 -DCONFIG_PRODUCT_WANPIPE_AFT_56K -DCONFIG_PRODUCT_WANPIPE_AFT_RM -DCONFIG_PRODUCT_WANPIPE_CODEC_SLINEAR_LAW  -DCONFIG_PRODUCT_WANPIPE_AFT_BRI  -DCONFIG_PRODUCT_WANPIPE_AFT_SERIAL -DCONFIG_PRODUCT_WANPIPE_AFT_A600"
 
 			#PROTOCOL_DEFINES="$PROTOCOL_DEFINES -DCONFIG_PRODUCT_WANPIPE_USB "
 		fi
@@ -7133,7 +7133,7 @@
 PKG_NAME=wanpipe
 DISTR_NAME="WANPIPE"
 PROD=wanrouter
-PROD_VER=3.3.14
+PROD_VER=3.3.14b
 PROD_HOME=`pwd`
 META_CONF=$PROD_HOME/$PROD.rc
 WAN_INTR_DIR=$PROD_HOME/interfaces
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/util/wan_aftup/wan_aft_flash.c wanpipe-3.3.14b/util/wan_aftup/wan_aft_flash.c
--- wanpipe-3.3.14/util/wan_aftup/wan_aft_flash.c	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/util/wan_aftup/wan_aft_flash.c	2008-10-20 14:04:22.000000000 -0400
@@ -62,7 +62,8 @@
 static int aft_is_protected(wan_aft_cpld_t *cpld, int stype);
 static int aft_flash_id(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id);
 static int aft_reload_flash(wan_aft_cpld_t *cpld, int sector_type);
-static int aft_prg_flash_byte(wan_aft_cpld_t*,int,unsigned long,unsigned char);
+static int aft_write_flash(wan_aft_cpld_t*,int,unsigned long,unsigned char*);
+static int aft_read_flash(wan_aft_cpld_t*,int,int,unsigned long, unsigned char**);
 static unsigned char aft_read_flash_byte(wan_aft_cpld_t*,int,int,unsigned long);
 static int aft_erase_flash_sector(wan_aft_cpld_t*,int,int);
 
@@ -72,8 +73,8 @@
 	aft_is_protected,
 	aft_flash_id,
 	aft_reload_flash,
-	aft_prg_flash_byte,
-	aft_read_flash_byte,
+	aft_write_flash,
+	aft_read_flash,
 	aft_erase_flash_sector
 };
 
@@ -236,6 +237,30 @@
 }
 
 static int
+aft_read_flash(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off, unsigned char** ppdata)
+{
+	int num_bytes = 1;
+	unsigned char* pdata = NULL;
+	unsigned long	sec_off = 0x00;
+	
+	pdata = malloc(num_bytes);
+	if (pdata == NULL) {
+		printf("Failed to allocate memory (%s:%d)\n", 
+				__FUNCTION__,__LINE__);
+		return -ENOMEM;
+	}
+	memset(pdata, 0, num_bytes);
+	
+	if (stype == USER_SECTOR_FLASH){
+		sec_off = USER_SECTOR_START_ADDR;
+       	}
+	*pdata =  __aft_read_flash_byte(cpld, stype, mtype, sec_off + off);
+	*ppdata = pdata;
+	return num_bytes;
+
+}
+
+static int
 aft_erase_flash_sector(wan_aft_cpld_t *cpld, int stype, int verify)
 {
 	unsigned long offset = 0x00;
@@ -248,7 +273,8 @@
 		printf("%s: Default sector protected (%s:%d)!\n",
 				__FUNCTION__,__FILE__,__LINE__);
 		return -EINVAL;
-	}    
+	}
+
 	for(sector_no = 0; sector_no < 8; sector_no++){
 		if (aft_flash_spec[sector_no].sector_type != stype){
 			continue;
@@ -311,12 +337,16 @@
 }
 
 static int
-aft_prg_flash_byte(	wan_aft_cpld_t	*cpld,
+aft_write_flash(	wan_aft_cpld_t	*cpld,
 			int		stype,
 			unsigned long	off32,
-			unsigned char	data)
+			unsigned char*	pdata)
 {
+	unsigned char	data;
 	unsigned char	data1 = 0x00;
+	int num_bytes = 1;
+
+	data = *pdata;
 
 	// Checking write enable to the Default Boot Flash Sector 
 	if (aft_is_protected(cpld, stype)){
@@ -348,7 +378,7 @@
 			}
 		}
 	} while(1);
-	return 0;
+	return num_bytes;
 }
 
 static int aft_reset_flash(wan_aft_cpld_t *cpld)
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/util/wan_aftup/wan_aft_flash_shark.c wanpipe-3.3.14b/util/wan_aftup/wan_aft_flash_shark.c
--- wanpipe-3.3.14/util/wan_aftup/wan_aft_flash_shark.c	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/util/wan_aftup/wan_aft_flash_shark.c	2008-10-20 14:04:22.000000000 -0400
@@ -109,23 +109,24 @@
 extern int exec_write_cmd(void*,unsigned int, unsigned int, unsigned int);
 extern void hit_any_key(void);
 
-static int aft_shark_reset_flash(wan_aft_cpld_t *cpld);
-static int aft_shark_is_protected(wan_aft_cpld_t *cpld, int stype);
-static int aft_shark_flash_id(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id);
-static int aft_shark_reload_flash(wan_aft_cpld_t *cpld, int sector_type);
-static int aft_shark_prg_flash_byte(wan_aft_cpld_t*,int,unsigned long,unsigned char);
-static unsigned char aft_shark_read_flash_byte(wan_aft_cpld_t*,int,int,unsigned long);
-static int aft_shark_erase_flash(wan_aft_cpld_t*,int,int);
+static int aft_reset_flash_shark(wan_aft_cpld_t *cpld);
+static int aft_is_protected_shark(wan_aft_cpld_t *cpld, int stype);
+static int aft_flash_id_shark(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id);
+static int aft_reload_flash_shark(wan_aft_cpld_t *cpld, int sector_type);
+static int aft_write_flash_shark(wan_aft_cpld_t*,int, unsigned long,unsigned char*);
+static int aft_read_flash_shark(wan_aft_cpld_t*,int,int,unsigned long, unsigned char**);
+static unsigned char aft_read_flash_byte_shark(wan_aft_cpld_t*,int,int,unsigned long);
+static int aft_erase_flash_shark(wan_aft_cpld_t*,int,int);
 
 aftup_flash_iface_t aftup_shark_flash_iface = 
 {
-	aft_shark_reset_flash,
-	aft_shark_is_protected,
-	aft_shark_flash_id,
-	aft_shark_reload_flash,
-	aft_shark_prg_flash_byte,
-	aft_shark_read_flash_byte,
-	aft_shark_erase_flash
+	aft_reset_flash_shark,
+	aft_is_protected_shark,
+	aft_flash_id_shark,
+	aft_reload_flash_shark,
+	aft_write_flash_shark,
+	aft_read_flash_shark,
+	aft_erase_flash_shark
 };
 
 /******************************************************************************
@@ -174,7 +175,7 @@
 }
 
 static unsigned int
-__aft_shark_write_flash_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off,unsigned char data)
+__aft_write_flash_shark_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off,unsigned char data)
 {
 	unsigned char	offset;
 
@@ -206,18 +207,18 @@
 }
 
 static unsigned int
-aft_shark_write_flash_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off,unsigned char data)
+aft_write_flash_shark_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off,unsigned char data)
 {
 	unsigned long	sec_off = 0x00;
 
 	if (stype == USER_SECTOR_FLASH){
 		sec_off = AFT_SHARK_USER_SECTOR_START_ADDR;
 	}
-	return __aft_shark_write_flash_byte(cpld, stype, mtype, sec_off + off, data);
+	return __aft_write_flash_shark_byte(cpld, stype, mtype, sec_off + off, data);
 }
 
 static unsigned char
-__aft_shark_read_flash_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off)
+__aft_read_flash_byte_shark(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off)
 {
 	unsigned char offset;
         unsigned char data;
@@ -252,17 +253,17 @@
 }
 
 static unsigned char
-aft_shark_read_flash_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off)
+aft_read_flash_byte_shark(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off)
 {
 	unsigned long	sec_off = 0x00;
 	if (stype == USER_SECTOR_FLASH){
 		sec_off = AFT_SHARK_USER_SECTOR_START_ADDR;
 	}
-	return __aft_shark_read_flash_byte(cpld, stype, mtype, sec_off + off);
+	return __aft_read_flash_byte_shark(cpld, stype, mtype, sec_off + off);
 }
 
 static int
-aft_shark_erase_flash(wan_aft_cpld_t *cpld, int stype, int verify)
+aft_erase_flash_shark(wan_aft_cpld_t *cpld, int stype, int verify)
 {
 	unsigned long offset = 0x00;
 	unsigned char data = 0x00;
@@ -273,24 +274,24 @@
 			continue;
 		}
 		offset = aft_shark_flash_spec[cpld->flash_index][sector_no].start_off;
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0x80);
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
-		aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, offset, 0x30);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0x80);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
+		aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, offset, 0x30);
 
 		do{
 //MF			for(i=0;i<100000;i++);
 			usleep(1);
-			data = aft_shark_read_flash_byte(
+			data = aft_read_flash_byte_shark(
 					cpld, stype,
 					MEMORY_TYPE_FLASH,
 					offset);
 			if (data & 0x80){
 				break;
 			}else if (data & 0x20){
-				data = aft_shark_read_flash_byte(
+				data = aft_read_flash_byte_shark(
 						cpld, stype, 
 						MEMORY_TYPE_FLASH, 
 						offset);
@@ -316,7 +317,7 @@
 	// Verify that flash is 0xFF
 	for(offset = 0; offset < 0x80000; offset++){
 //MF		for(i=0;i<10000;i++);
-		data = aft_shark_read_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, offset);	
+		data = aft_read_flash_byte_shark(cpld, stype, MEMORY_TYPE_FLASH, offset);	
 		if (data != 0xFF){
 			printf(" Failed to compare! %05lx -> %02x \n",
 						offset,data);
@@ -332,22 +333,26 @@
 }
 
 static int
-aft_shark_prg_flash_byte(wan_aft_cpld_t *cpld, int stype, unsigned long off32, unsigned char data)
+aft_write_flash_shark(wan_aft_cpld_t *cpld, int stype, unsigned long off32, unsigned char* pdata)
 {
+	unsigned char data;
 	unsigned char data1 = 0x00;
-
-	__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
-	__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
-	__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xA0);
-	aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, off32, data);
+	int num_bytes = 1;
+	
+	data = *pdata;
+	
+	__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
+	__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
+	__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xA0);
+	aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, off32, data);
 
 	do{
 //MF		for(i=0;i<1000;i++);
-		data1 = aft_shark_read_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, off32);
+		data1 = aft_read_flash_byte_shark(cpld, stype, MEMORY_TYPE_FLASH, off32);
 		if ((data1 & 0x80) == (data & 0x80)){
 			break;
 		}else if (data1 & 0x20){
-			data1 = aft_shark_read_flash_byte(
+			data1 = aft_read_flash_byte_shark(
 					cpld, stype, 
 					MEMORY_TYPE_FLASH, 
 					off32);
@@ -360,30 +365,57 @@
 			}
 		}
 	} while(1);
-	return 0;
+	return num_bytes;
 }
 
-static int aft_shark_reset_flash(wan_aft_cpld_t *cpld)
+
+static int
+aft_read_flash_shark(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off, unsigned char** ppdata)
 {
-	__aft_shark_write_flash_byte(cpld, DEF_SECTOR_FLASH, MEMORY_TYPE_FLASH, 0x00, 0xF0);
+	int num_bytes = 1;
+	unsigned char* pdata = NULL;
+	unsigned long	sec_off = 0x00;
+	
+	pdata = malloc(num_bytes);
+	if (pdata == NULL) {
+		printf("Failed to allocate memory (%s:%d)\n", 
+				__FUNCTION__,__LINE__);
+		return -ENOMEM;
+	}
+	memset(pdata, 0, num_bytes);
+	
+	if (stype == USER_SECTOR_FLASH){
+		sec_off = AFT_SHARK_USER_SECTOR_START_ADDR;
+	}	
+
+	*pdata =  __aft_read_flash_byte_shark(cpld, stype, mtype, sec_off + off);
+	*ppdata = pdata;
+	return num_bytes;
+
+}
+
+
+static int aft_reset_flash_shark(wan_aft_cpld_t *cpld)
+{
+	__aft_write_flash_shark_byte(cpld, DEF_SECTOR_FLASH, MEMORY_TYPE_FLASH, 0x00, 0xF0);
 	return 0;
 }
 
-static int aft_shark_is_protected(wan_aft_cpld_t *cpld, int stype)
+static int aft_is_protected_shark(wan_aft_cpld_t *cpld, int stype)
 {
 	return 0;
 }
 
-static int aft_shark_flash_id(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id)
+static int aft_flash_id_shark(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id)
 {
 	unsigned char	man_code, device_code;
 
-	aft_shark_reset_flash(cpld);
-	__aft_shark_write_flash_byte(cpld, stype, mtype, 0xAAA, 0xAA);
-	__aft_shark_write_flash_byte(cpld, stype, mtype, 0x555, 0x55);
-	__aft_shark_write_flash_byte(cpld, stype, mtype, 0xAAA, 0x90);
+	aft_reset_flash_shark(cpld);
+	__aft_write_flash_shark_byte(cpld, stype, mtype, 0xAAA, 0xAA);
+	__aft_write_flash_shark_byte(cpld, stype, mtype, 0x555, 0x55);
+	__aft_write_flash_shark_byte(cpld, stype, mtype, 0xAAA, 0x90);
 
-	man_code = aft_shark_read_flash_byte(cpld, stype, mtype, 0x00);
+	man_code = aft_read_flash_byte_shark(cpld, stype, mtype, 0x00);
 	if (man_code != MCODE_ST){
 		printf("The current flash is not supported (man id %02X)!\n",
 				man_code);
@@ -391,7 +423,7 @@
 	}
 	*flash_id = man_code << 8;
 
-	device_code = aft_shark_read_flash_byte(cpld, stype, mtype, 0x02);
+	device_code = aft_read_flash_byte_shark(cpld, stype, mtype, 0x02);
 	switch(device_code){
 	case DCODE_M29W800DT:
 		cpld->flash_index = M29W800DT_FID;
@@ -406,11 +438,11 @@
 		break;
 	}
 	*flash_id |= device_code;
-	aft_shark_reset_flash(cpld);
+	aft_reset_flash_shark(cpld);
 	return 0;
 }
 
-static int aft_shark_reload_flash(wan_aft_cpld_t *cpld, int sector_type)
+static int aft_reload_flash_shark(wan_aft_cpld_t *cpld, int sector_type)
 {
 	if (sector_type == USER_SECTOR_FLASH){
 		/* Reload new code in to Xilinx from
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/util/wan_aftup/wan_aft_flash_shark_ds.c wanpipe-3.3.14b/util/wan_aftup/wan_aft_flash_shark_ds.c
--- wanpipe-3.3.14/util/wan_aftup/wan_aft_flash_shark_ds.c	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/util/wan_aftup/wan_aft_flash_shark_ds.c	2008-10-20 14:04:22.000000000 -0400
@@ -109,23 +109,24 @@
 extern int exec_write_cmd(void*,unsigned int, unsigned int, unsigned int);
 extern void hit_any_key(void);
 
-static int aft_shark_reset_flash(wan_aft_cpld_t *cpld);
-static int aft_shark_is_protected(wan_aft_cpld_t *cpld, int stype);
-static int aft_shark_flash_id(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id);
-static int aft_shark_reload_flash(wan_aft_cpld_t *cpld, int sector_type);
-static int aft_shark_prg_flash_byte(wan_aft_cpld_t*,int,unsigned long,unsigned char);
-static unsigned char aft_shark_read_flash_byte(wan_aft_cpld_t*,int,int,unsigned long);
-static int aft_shark_erase_flash(wan_aft_cpld_t*,int,int);
+static int aft_reset_flash_shark(wan_aft_cpld_t *cpld);
+static int aft_is_protected_shark(wan_aft_cpld_t *cpld, int stype);
+static int aft_flash_id_shark(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id);
+static int aft_reload_flash_shark(wan_aft_cpld_t *cpld, int sector_type);
+static int aft_write_flash_shark(wan_aft_cpld_t*,int,unsigned long,unsigned char*);
+static int aft_read_flash_shark(wan_aft_cpld_t*,int,int,unsigned long,unsigned char**);
+static unsigned char aft_read_flash_shark_byte(wan_aft_cpld_t*,int,int,unsigned long);
+static int aft_erase_flash_shark(wan_aft_cpld_t*,int,int);
 
 aftup_flash_iface_t aftup_shark_flash_ds_iface = 
 {
-	aft_shark_reset_flash,
-	aft_shark_is_protected,
-	aft_shark_flash_id,
-	aft_shark_reload_flash,
-	aft_shark_prg_flash_byte,
-	aft_shark_read_flash_byte,
-	aft_shark_erase_flash
+	aft_reset_flash_shark,
+	aft_is_protected_shark,
+	aft_flash_id_shark,
+	aft_reload_flash_shark,
+	aft_write_flash_shark,
+	aft_read_flash_shark,
+	aft_erase_flash_shark
 };
 
 /******************************************************************************
@@ -157,7 +158,7 @@
 }
 
 static unsigned int
-__aft_shark_write_flash_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off,unsigned char data)
+__aft_write_flash_shark_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off,unsigned char data)
 {
 	unsigned char	offset;
 
@@ -189,18 +190,18 @@
 }
 
 static unsigned int
-aft_shark_write_flash_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off,unsigned char data)
+aft_write_flash_shark_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off,unsigned char data)
 {
 	unsigned long	sec_off = 0x00;
 
 	if (stype == USER_SECTOR_FLASH){
 		sec_off = AFT_SHARK_USER_SECTOR_START_ADDR;
 	}
-	return __aft_shark_write_flash_byte(cpld, stype, mtype, sec_off + off, data);
+	return __aft_write_flash_shark_byte(cpld, stype, mtype, sec_off + off, data);
 }
 
 static unsigned char
-__aft_shark_read_flash_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off)
+__aft_read_flash_shark_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off)
 {
 	unsigned char offset;
         unsigned char data;
@@ -235,17 +236,43 @@
 }
 
 static unsigned char
-aft_shark_read_flash_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off)
+aft_read_flash_shark_byte(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off)
 {
+	
 	unsigned long	sec_off = 0x00;
 	if (stype == USER_SECTOR_FLASH){
 		sec_off = AFT_SHARK_USER_SECTOR_START_ADDR;
 	}
-	return __aft_shark_read_flash_byte(cpld, stype, mtype, sec_off + off);
+	return __aft_read_flash_shark_byte(cpld, stype, mtype, sec_off + off);
 }
 
 static int
-aft_shark_erase_flash(wan_aft_cpld_t *cpld, int stype, int verify)
+aft_read_flash_shark(wan_aft_cpld_t *cpld, int stype, int mtype, unsigned long off, unsigned char** ppdata)
+{
+	int num_bytes = 1;
+	unsigned char* pdata = NULL;
+	unsigned long	sec_off = 0x00;
+	
+	pdata = malloc(num_bytes);
+	if (pdata == NULL) {
+		printf("Failed to allocate memory (%s:%d)\n", 
+				__FUNCTION__,__LINE__);
+		return -ENOMEM;
+	}
+	memset(pdata, 0, num_bytes);
+	
+	if (stype == USER_SECTOR_FLASH){
+		sec_off = AFT_SHARK_USER_SECTOR_START_ADDR;
+	}	
+
+	*pdata =  __aft_read_flash_shark_byte(cpld, stype, mtype, sec_off + off);
+	*ppdata = pdata;
+	return num_bytes;
+}
+
+
+static int
+aft_erase_flash_shark(wan_aft_cpld_t *cpld, int stype, int verify)
 {
 	unsigned long offset = 0x00;
 	unsigned char data = 0x00;
@@ -256,24 +283,24 @@
 			continue;
 		}
 		offset = aft_shark_flash_ds_spec[cpld->flash_index][sector_no].start_off;
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0x80);
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
-		__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
-		aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, offset, 0x30);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0x80);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
+		__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
+		aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, offset, 0x30);
 
 		do{
 //MF			for(i=0;i<100000;i++);
 			usleep(1);
-			data = aft_shark_read_flash_byte(
+			data = aft_read_flash_shark_byte(
 					cpld, stype,
 					MEMORY_TYPE_FLASH,
 					offset);
 			if (data & 0x80){
 				break;
 			}else if (data & 0x20){
-				data = aft_shark_read_flash_byte(
+				data = aft_read_flash_shark_byte(
 						cpld, stype, 
 						MEMORY_TYPE_FLASH, 
 						offset);
@@ -295,11 +322,10 @@
 	}
 	printf("\r\tErasing sectors\t\t\t\tPassed\n");
 	if (!verify) return 0;
-	
 	// Verify that flash is 0xFF
 	for(offset = 0; offset < 0x80000; offset++){
 //MF		for(i=0;i<10000;i++);
-		data = aft_shark_read_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, offset);	
+		data = aft_read_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, offset);	
 		if (data != 0xFF){
 			printf(" Failed to compare! %05lx -> %02x \n",
 						offset,data);
@@ -315,22 +341,26 @@
 }
 
 static int
-aft_shark_prg_flash_byte(wan_aft_cpld_t *cpld, int stype, unsigned long off32, unsigned char data)
+aft_write_flash_shark(wan_aft_cpld_t *cpld, int stype, unsigned long off32, unsigned char* pdata)
 {
+	unsigned char data;
 	unsigned char data1 = 0x00;
+	int num_bytes = 1;
+	
+	data = *pdata;
 
-	__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
-	__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
-	__aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xA0);
-	aft_shark_write_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, off32, data);
+	__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xAA);
+	__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0x555, 0x55);
+	__aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, 0xAAA, 0xA0);
+	aft_write_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, off32, data);
 
 	do{
 //MF		for(i=0;i<1000;i++);
-		data1 = aft_shark_read_flash_byte(cpld, stype, MEMORY_TYPE_FLASH, off32);
+		data1 = aft_read_flash_shark_byte(cpld, stype, MEMORY_TYPE_FLASH, off32);
 		if ((data1 & 0x80) == (data & 0x80)){
 			break;
 		}else if (data1 & 0x20){
-			data1 = aft_shark_read_flash_byte(
+			data1 = aft_read_flash_shark_byte(
 					cpld, stype, 
 					MEMORY_TYPE_FLASH, 
 					off32);
@@ -343,30 +373,30 @@
 			}
 		}
 	} while(1);
-	return 0;
+	return num_bytes ;
 }
 
-static int aft_shark_reset_flash(wan_aft_cpld_t *cpld)
+static int aft_reset_flash_shark(wan_aft_cpld_t *cpld)
 {
-	__aft_shark_write_flash_byte(cpld, DEF_SECTOR_FLASH, MEMORY_TYPE_FLASH, 0x00, 0xF0);
+	__aft_write_flash_shark_byte(cpld, DEF_SECTOR_FLASH, MEMORY_TYPE_FLASH, 0x00, 0xF0);
 	return 0;
 }
 
-static int aft_shark_is_protected(wan_aft_cpld_t *cpld, int stype)
+static int aft_is_protected_shark(wan_aft_cpld_t *cpld, int stype)
 {
 	return 0;
 }
 
-static int aft_shark_flash_id(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id)
+static int aft_flash_id_shark(wan_aft_cpld_t *cpld, int mtype, int stype, int *flash_id)
 {
 	unsigned char	man_code, device_code;
 
-	aft_shark_reset_flash(cpld);
-	__aft_shark_write_flash_byte(cpld, stype, mtype, 0xAAA, 0xAA);
-	__aft_shark_write_flash_byte(cpld, stype, mtype, 0x555, 0x55);
-	__aft_shark_write_flash_byte(cpld, stype, mtype, 0xAAA, 0x90);
+	aft_reset_flash_shark(cpld);
+	__aft_write_flash_shark_byte(cpld, stype, mtype, 0xAAA, 0xAA);
+	__aft_write_flash_shark_byte(cpld, stype, mtype, 0x555, 0x55);
+	__aft_write_flash_shark_byte(cpld, stype, mtype, 0xAAA, 0x90);
 
-	man_code = aft_shark_read_flash_byte(cpld, stype, mtype, 0x00);
+	man_code = aft_read_flash_shark_byte(cpld, stype, mtype, 0x00);
 	if (man_code != MCODE_ST){
 		printf("The current flash is not supported (man id %02X)!\n",
 				man_code);
@@ -374,7 +404,7 @@
 	}
 	*flash_id = man_code << 8;
 
-	device_code = aft_shark_read_flash_byte(cpld, stype, mtype, 0x02);
+	device_code = aft_read_flash_shark_byte(cpld, stype, mtype, 0x02);
 	switch(device_code){
 	case DCODE_M29W800DT:
 		cpld->flash_index = M29W800DT_FID;
@@ -389,11 +419,11 @@
 		break;
 	}
 	*flash_id |= device_code;
-	aft_shark_reset_flash(cpld);
+	aft_reset_flash_shark(cpld);
 	return 0;
 }
 
-static int aft_shark_reload_flash(wan_aft_cpld_t *cpld, int sector_type)
+static int aft_reload_flash_shark(wan_aft_cpld_t *cpld, int sector_type)
 {
 	if (sector_type == USER_SECTOR_FLASH){
 		/* Reload new code in to Xilinx from
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/util/wan_aftup/wan_aft_prg.c wanpipe-3.3.14b/util/wan_aftup/wan_aft_prg.c
--- wanpipe-3.3.14/util/wan_aftup/wan_aft_prg.c	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/util/wan_aftup/wan_aft_prg.c	2008-10-20 14:04:22.000000000 -0400
@@ -179,7 +179,7 @@
 			  FUNCTION PROTOTYPES
  ******************************************************************************
 */
-		
+
 static unsigned long filesize(FILE* f)
 {
 	unsigned long size = 0;
@@ -333,8 +333,9 @@
 	char		line[MAX_HEX_LINE_LEN];
 	int		data[MAX_HEX_LINE_LEN];
 	int		seg = 0, addr;
-	int		len, type, i, err;
-	unsigned char	val;
+	int		len, type, i;
+	unsigned char*	val;
+	int 		page_size;
 	
 	if (cmd == CMD_FLASH_PRG){
 		cpld->iface->erase(cpld, stype, 0);
@@ -373,40 +374,24 @@
 		i = 0;
 		while(i < len){
 			if (cmd == CMD_FLASH_PRG){
-				err = cpld->iface->prg_byte(
-							cpld,
-							stype,
-							seg+addr+i,
-							data[i]);
-				//err = prg_flash_byte(
-				//		cpld,
-				//		stype,
-				//		seg+addr+i,
-				//		data[i]);
-				if (err){
+				page_size = cpld->iface->prg(cpld, stype, seg+addr+i, (u8*) &data[i]);
+				if (page_size < 0){
 					printf("\r\tUpdating flash\t\t\t\tFailed(%x)\n",
 								addr+i);
 					fclose(f);
 					return -EINVAL;
 				}
 			}else{
-				val = cpld->iface->read_byte(
-							cpld,
-							stype,
-							MEMORY_TYPE_FLASH,
-							seg+addr+i);
-				//val = read_flash(
-				//		cpld, stype, 
-				//		MEMORY_TYPE_FLASH,
-				//		seg+addr+i);
-				if (val != (unsigned char)data[i]){
+				page_size = cpld->iface->read(cpld, stype, MEMORY_TYPE_FLASH, seg+addr+i, &val);
+
+				if (memcmp(&data[i], val, page_size)) {
 					printf("\r\tVerification\t\t\t\tFailed(%x)\n",
-								addr+i);
+						addr+i);
 					fclose(f);
 					return -EINVAL;
 				}
 			}
-			i++;
+			i+=page_size;
 		}
 		if (cmd == CMD_FLASH_PRG){
 			progress_bar("\tUpdating flash\t\t\t\t",0,0);
@@ -424,14 +409,16 @@
 	return 0;
 }
 
+
 static int
-aft_flash_bin_file(wan_aft_cpld_t *cpld, int stype, char *filename, int cmd)
+aft_flash_bin_file (wan_aft_cpld_t *cpld, int stype, char *filename, int cmd)
 {
-	char		*data = NULL;
+	char*		data = NULL;
+	u8*		tmp_data_read;
 	unsigned long	findex = 0;
 	long		fsize = 0;
-	char	val;
-	int	i;
+	int 		page_size;
+	int		i;
 
 	fsize = read_bin_data_file(filename, &data);
 	if (fsize < 0){
@@ -441,24 +428,31 @@
 	if (cmd == CMD_FLASH_PRG){
 		cpld->iface->erase(cpld, stype, 0);
 	}
-	while(findex < fsize){
+	
+	while (findex < fsize) {
 		if (cmd == CMD_FLASH_PRG){
-			cpld->iface->prg_byte(cpld, stype, findex, data[findex]);
-			//prg_flash_byte(cpld, stype, offset+findex, data[findex]);
-		}else{
-			val = cpld->iface->read_byte(cpld, stype, MEMORY_TYPE_FLASH, findex);
-			//val = read_flash(
-			//		cpld, stype,
-			//		MEMORY_TYPE_FLASH,
-			//		offset+findex);
-			if (val != data[findex]){
+			page_size = cpld->iface->prg(cpld, stype, findex, (u8*)&data[findex]);
+		} else {
+			page_size = cpld->iface->read(cpld, stype, MEMORY_TYPE_FLASH, findex, &tmp_data_read);
+			if (memcmp(&data[findex], tmp_data_read, page_size)) {
 				printf("\r\tVerification\t\t\t\tFailed(%lx)\n",
-						findex);
+					findex);
 				free(data);
 				return -EINVAL;
 			}
 		}
-		findex++;
+		if (page_size < 0) {
+			if (cmd == CMD_FLASH_PRG) {
+				printf("\r\tUpdating\t\t\t\tFailed(%lx)\n",
+						findex);
+			} else {
+				printf("\r\tVerification\t\t\t\tFailed(%lx)\n",
+						findex);
+			}
+			free(data);
+			return -EINVAL;
+		}
+		findex += page_size;
 		for(i=0;i<1000;i++);
 		if ((findex & 0x1FFF) == 0x1000){
 			if (cmd == CMD_FLASH_PRG){
@@ -469,25 +463,28 @@
 							findex, fsize);
 			}
 		}
-	}
+	}	
+
 	if (cmd == CMD_FLASH_PRG){
 		printf("\r\tUpdating flash\t\t\t\tPassed\n");
 	}else{
 		printf("\r\tVerification\t\t\t\tPassed\n");
 	}
+
 	fflush(stdout);
 	free(data);
 	return 0;
+	
 }
 
 static int
 prg_flash_data(wan_aft_cpld_t *cpld, int stype, char *filename, int type)
 {
 	switch(type){
-	case HEX_FILE:
-		return aft_flash_hex_file(cpld, stype, filename, CMD_FLASH_PRG);
-	case BIN_FILE:
-		return aft_flash_bin_file(cpld, stype, filename, CMD_FLASH_PRG);
+		case HEX_FILE:
+			return aft_flash_hex_file(cpld, stype, filename, CMD_FLASH_PRG);
+		case BIN_FILE:
+			return aft_flash_bin_file(cpld, stype, filename, CMD_FLASH_PRG);
 	}
 	return -EINVAL;
 }
@@ -496,12 +493,12 @@
 verify_flash_data(wan_aft_cpld_t *cpld, int stype, char *filename, int type)
 {
 	switch(type){
-	case HEX_FILE:
-		return aft_flash_hex_file(cpld, stype, filename, CMD_FLASH_VERIFY);
-	case BIN_FILE:
-		return aft_flash_bin_file(cpld, stype, filename, CMD_FLASH_VERIFY);
+		case HEX_FILE:
+			return aft_flash_hex_file(cpld, stype, filename, CMD_FLASH_VERIFY);
+		case BIN_FILE:
+			return aft_flash_bin_file(cpld, stype, filename, CMD_FLASH_VERIFY);
 	}
-	return -EINVAL;
+	return -EINVAL;	
 }
 
 int update_flash(wan_aft_cpld_t *cpld, int stype, int mtype, char* filename)
@@ -535,9 +532,16 @@
 int board_reset(wan_aft_cpld_t *cpld, int clear)
 {
 	unsigned int	data;
+	unsigned int 	iface_reg_off;
+
+	if (cpld->core_info->board_id == AFT_A600_SUBSYS_VENDOR) {
+		iface_reg_off = 0x1040;	
+	} else {
+		iface_reg_off = 0x40;	
+	}
 
 	/* Release board internal reset (AFT-T1/E1/T3/E3 */
-	if (exec_read_cmd(cpld->private, 0x40, 4, &data)){
+	if (exec_read_cmd(cpld->private, iface_reg_off, 4, &data)){
 		printf("Failed access (read) to the board!\n");
 		return -EINVAL;
 	}
@@ -614,12 +618,16 @@
 		if (clear) data &= ~0x06;
 	       	else data |= 0x06;
 		break;
+	case AFT_A600_SUBSYS_VENDOR:
+		if (clear) data &= ~0x06;
+	       	else data |= 0x06;
+		break;
 	default:
 		printf("Unsupported card type (board_id=%X)!\n", cpld->core_info->board_id);		
 		return -EINVAL;
 	}
 
-	if (exec_write_cmd(cpld->private, 0x40,4,data)){
+	if (exec_write_cmd(cpld->private, iface_reg_off,4,data)){
 		printf("Failed access (write) to the board!\n");
 		return -EINVAL;
 	}
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/util/wan_aftup/wan_aft_prg.h wanpipe-3.3.14b/util/wan_aftup/wan_aft_prg.h
--- wanpipe-3.3.14/util/wan_aftup/wan_aft_prg.h	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/util/wan_aftup/wan_aft_prg.h	2008-10-20 14:04:22.000000000 -0400
@@ -1,6 +1,8 @@
 #ifndef __WAN_AFT_PRG_H
 # define __WAN_AFT_PRG_H
 
+#define u32 unsigned int
+#define u8 unsigned char
 
 #define MEMORY_TYPE_SRAM	0x00
 #define MEMORY_TYPE_FLASH	0x01
@@ -34,9 +36,12 @@
 #define AFT_CORE_SIZE		234456
 #define AFT4_CORE_SIZE		212392
 #define AFT_CORE_X200_SIZE	130952
+#define AFT_CORE_X250_SIZE	169216
 #define AFT_CORE_X400_SIZE	212392
 #define AFT_CORE_X1000_SIZE	402936
 
+#define A600_EEPROM_PAGE_SIZE	0x04
+
 
 struct wan_aft_cpld_;
 typedef struct {
@@ -44,11 +49,12 @@
 	int	(*is_protected)(struct wan_aft_cpld_*,int stype);
 	int	(*flash_id)(struct wan_aft_cpld_*, int mtype, int stype, int*);
 	int 	(*reload)(struct wan_aft_cpld_*, int stype);
-	int	(*prg_byte)(struct wan_aft_cpld_*, int, unsigned long, unsigned char);
-	unsigned char	(*read_byte)(struct wan_aft_cpld_*, int, int, unsigned long);
+	int	(*prg)(struct wan_aft_cpld_*, int, unsigned long, u8*);
+	int     (*read)(struct wan_aft_cpld_*, int, int, unsigned long, u8**);
 	int	(*erase)(struct wan_aft_cpld_*, int stype, int verify);
 } aftup_flash_iface_t;
 
+
 typedef struct {
 	int	id;
 	int	size;
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/util/wan_aftup/wan_aftup.c wanpipe-3.3.14b/util/wan_aftup/wan_aftup.c
--- wanpipe-3.3.14/util/wan_aftup/wan_aftup.c	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/util/wan_aftup/wan_aftup.c	2008-10-20 16:15:19.000000000 -0400
@@ -1,10 +1,9 @@
-/*
+/******************************************************************************
 **	History
 **-----------------------------------------------------------------
 **	  Date		Name		Description
 **-----------------------------------------------------------------
-**
-**
+**	
 **	24 Dec 2004	Alex Feldman	Initial version for Linux OS.
 **					(version 1.2)
 **	14 Jan 2005	Alex Feldman	Support OpenBSD OS.
@@ -22,9 +21,15 @@
 **					* PLX update 
 **					(version 1.6)
 **	22 Jan 2007	Alex Feldman	* Add new option to command line
-**					* Force Flash update with specific filename
-**					(version 1.7)
-**/
+**					* Force Flash update with specific 
+**					  filename (version 1.7)
+**	08 Aug 2008	Alex Feldman	* Add USB-FXO firmware update
+**					  (version 1.8)
+**	16 Oct 2008	David Yat Sin	* Added A600 firmware update
+					* Added Tundra and PLX update from *.dat
+					  format files
+					  (version 1.9)
+*******************************************************************************/
 
 #include <stdlib.h>
 #include <stdio.h>
@@ -61,18 +66,22 @@
 
 #include "wan_aft_prg.h"
 #include "wan_aftup.h"
+#include "wan_pcie_ctrl.h"
 
 /***********************************************************************
 **			D E F I N E S / M A C R O S
 ***********************************************************************/
-#define WAN_AFTUP_VERSION	"1.7"
+#define WAN_AFTUP_VERSION	"1.9"
 
-#define WAN_AFTUP_NONE		0x00
-#define WAN_AFTUP_AUTO		0x01
-#define WAN_AFTUP_FORCE_FIRM	0x02
-#define WAN_AFTUP_PCIEXPRESS	0x04
+#define WAN_AFTUP_NONE			0x00
+#define WAN_AFTUP_AUTO			0x01
+#define WAN_AFTUP_FORCE_FIRM		0x02
+#define WAN_AFTUP_PCIEXPRESS		0x04
+#define WAN_AFTUP_USBFXO		0x08
+#define WAN_AFTUP_PCIEXPRESS_TUNDRA 	0x10
 
-#define DYDBG printf("DYDBG:(%s,%d)\n",__FUNCTION__,__LINE__);
+
+#define WAN_IFNAME_SZ IFNAMSIZ
 
 /***********************************************************************
 **			G L O B A L  V A R I A B L E S
@@ -86,13 +95,17 @@
 
 extern aftup_flash_iface_t aftup_flash_iface;
 extern aftup_flash_iface_t aftup_shark_flash_iface;
+extern aftup_flash_iface_t aftup_a600_flash_iface;
 
 extern aftup_flash_t	aft_flash;
 extern aftup_flash_t	aft4_flash;
 extern aftup_flash_t	aft_shark_flash;
 extern aftup_flash_t	aft_shark_flash_ds;
+extern aftup_flash_t	aft_a600_flash;
+
+extern pcie_bridge_iface_t aft_pci_bridge_iface_tundra;
+extern pcie_bridge_iface_t aft_pci_bridge_iface_plx;
 
-	
 WAN_LIST_HEAD(wan_aftup_head_t, wan_aftup_) wan_aftup_head = 
 			WAN_LIST_HEAD_INITIALIZER(wan_aftup_head);
 
@@ -137,13 +150,14 @@
 	  "A056_0040_V", "A056_0040_V*.BIN", AFT_CORE_X400_SIZE },
 	{ AFT_ISDN_BRI_SHARK_SUBSYS_VENDOR, AFT_CHIP_X400, AFT_HDLC_CORE_ID, 0x01, 0x4F,	
 	  "A500_0040_V", "A500_0040_V*.BIN", AFT_CORE_X400_SIZE },
-#if 1
 	{ AFT_2SERIAL_RS232_SUBSYS_VENDOR, AFT_CHIP_X1000, AFT_HDLC_CORE_ID, 0x01, 0x4F,	
 	  "A140_0100_V", "A140_0100_V*.BIN", AFT_CORE_X1000_SIZE },
 
 	{ AFT_4SERIAL_RS232_SUBSYS_VENDOR, AFT_CHIP_X1000, AFT_HDLC_CORE_ID, 0x01, 0x4F,	
 	  "A140_0100_V", "A140_0100_V*.BIN", AFT_CORE_X1000_SIZE },
-#endif
+	{ AFT_A600_SUBSYS_VENDOR, AFT_CHIP_X250, AFT_ANALOG_FE_CORE_ID, 0x20, 0x5B,	
+	  "A600_0025_V", "A600_0025_V*.BIN", AFT_CORE_X250_SIZE },
+
 #if 0
 	{ AFT_TE1_ATM_CORE_ID,	
 	  NULL, NULL, 0x00,
@@ -155,55 +169,6 @@
 	{ 0x00, 0x00, 0x00, 0x00, 0x00, NULL, NULL, 0x00 }
 };
 
-struct wan_aftup_plxctrl_data_ {
-	unsigned char	off;
-	unsigned char	value;
-} plxctrl_data [] =
-	{
-		{ 0x00, 0x5A },
-		{ 0x01, 0x01 },
-		{ 0x02, 0x24 },
-		{ 0x03, 0x00 },
-		{ 0x04, 0x48 },
-		{ 0x05, 0x00 },
-		{ 0x06, 0x11 },
-		{ 0x07, 0x2C },
-		{ 0x08, 0x0E },
-		{ 0x09, 0x00 },
-		{ 0x0A, 0x0C },
-		{ 0x0B, 0x10 },
-		{ 0x0C, 0x10 },		{ 0x0D, 0x80 },
-		{ 0x0E, 0xFE },
-		{ 0x0F, 0x0B },
-		{ 0x10, 0x10 },
-		{ 0x11, 0x00 },
-		{ 0x12, 0x08 },
-		{ 0x13, 0x00 },
-		{ 0x14, 0x00 },
-		{ 0x15, 0x00 },
-		{ 0x16, 0x0C },
-		{ 0x17, 0x00 },
-		{ 0x18, 0x00 },
-		{ 0x19, 0xFE },
-		{ 0x1A, 0x01 },
-		{ 0x1B, 0x00 },
-		{ 0x1C, 0x48 },
-		{ 0x1D, 0x10 },
-		{ 0x1E, 0x20 },
-		{ 0x1F, 0x00 },
-		{ 0x20, 0x05 },
-		{ 0x21, 0x00 },
-		{ 0x22, 0x0C },
-		{ 0x23, 0x00 },
-		{ 0x24, 0x00 },
-		{ 0x25, 0xFE },
-		{ 0x26, 0x01 },
-		{ 0x27, 0x00 },
-		{ 0xFC, 0x19 },	/* Sangoma vendor ID		*/
-		{ 0xFD, 0x23 },	/* Sangoma vendor ID		*/
-		{ 0xFE, 0x00 },	/* Sangoma PLX config verion	*/
-		{ 0xFF, 0x02 }	/* Sangoma PLX config verion	*/
-	};
 
 /******************************************************************************
 			  FUNCTION PROTOTYPES
@@ -231,6 +196,7 @@
 extern unsigned char wan_plxctrl_read_ebyte(void*, unsigned char,int);
 extern void wan_plxctrl_write_ebyte(void*, unsigned char, unsigned char);
 
+	
 /******************************************************************************
 *			  FUNCTION DEFINITION	
 ******************************************************************************/
@@ -255,7 +221,8 @@
 	fflush(stdout);
 	return 0;
 }
-static int MakeConnection(char *ifname) 
+
+int MakeConnection(char *ifname) 
 {
 #if defined(__LINUX__)
 	char			error_msg[100];
@@ -301,7 +268,7 @@
 
 }
 
-static int CloseConnection(char *ifname)
+int CloseConnection(char *ifname)
 {
 	close(sock);
 	return 0;
@@ -361,7 +328,7 @@
 		aft->cpld.iface	= &aftup_shark_flash_iface;
 	}else if (strncmp(type,"AFT-A500",8) == 0){
 		//strcpy(aft->prefix_fw, "AFT_RM");
-		aft->cpld.adptr_type = AFT_ADPTR_ISDN;
+		aft->cpld.adptr_type  = AFT_ADPTR_ISDN;
 		aft->cpld.iface	= &aftup_shark_flash_iface;
 	}else if (strncmp(type,"AFT-A142",8) == 0){
 		//strcpy(aft->prefix_fw, "AFT_RM");
@@ -371,7 +338,11 @@
 		//strcpy(aft->prefix_fw, "AFT_RM");
 		aft->cpld.adptr_type = AFT_ADPTR_4SERIAL_RS232;
 		aft->cpld.iface	= &aftup_shark_flash_iface;
+	}else if (strncmp(type,"AFT-A600",8) == 0){
+		aft->cpld.adptr_type = AFT_ADPTR_A600;
+		aft->cpld.iface	= &aftup_a600_flash_iface;
 	}else{
+		printf("ERROR: Unknown Sangoma Card type %s!\n", type);
 		return -EINVAL;
 	}
 	return 0;
@@ -551,7 +522,11 @@
 		aft->cpld.iface->reload(&aft->cpld, USER_SECTOR_FLASH);
 	}
 
-	usleep(1000000);
+	if (aft->board_id == AFT_A600_SUBSYS_VENDOR) {
+		usleep(3000000);
+	} else {
+		usleep(1000000);
+	}
 
 	/* Read flash revision */
 	if (wan_aftup_ioctl(&api_cmd, SIOC_WAN_SET_PCI_BIOS, aft->if_name)){
@@ -608,6 +583,53 @@
 	return 0;	
 }
 
+static int aft_a200_a400_warning(wan_aftup_t *aft)
+{
+	char   	sel[20];
+        int	warning=0;
+	
+        if (aft->board_id == A200_REMORA_SHARK_SUBSYS_VENDOR &&
+	    (aft->flash_rev == 7 || 
+	     aft->flash_rev == 8)) {
+       		warning=1; 	
+       	}      
+
+	if (!warning) {
+		return 0;
+	}
+
+	
+        printf ("\n");
+        printf ("WARNING: User Confirmation Required!\n");
+        printf ("------------------------------------\n");
+	printf ("Please confirm your hardware type, an\n");
+	printf ("incorrect choice will corrupt the firmware.\n");
+	printf ("If firmware gets corrupted, a firmware recovery procedure\n");
+	printf ("using a jumper will have to be invoked to recover the card. \n");
+	printf ("For recovery procedures refer to: wiki.sangoma.com \n");
+        printf ("------------------------------------\n\n");
+        printf ("Please confirm hardware type:\n");
+	printf (" 1. A200 (front end connector RJ45)\n");
+	printf (" 2. A400 (front end connector DB25)\n");
+	printf (" Select: [1|2|q]:");
+
+	if (scanf("%s", sel)){
+	       	if (strcmp(sel, "q") == 0){
+	       		return -EINVAL;
+		} else if (strcmp(sel, "1") == 0) {
+			return 0;
+		} else if (strcmp(sel, "2") == 0) {
+			aft->board_id=A400_REMORA_SHARK_SUBSYS_VENDOR;
+			return 0;
+		} else {
+                 	return aft_a200_a400_warning(aft);
+		}
+	}
+
+	printf ("\nError: Invalid Selection %s\n",sel);
+	return -EINVAL;	
+}
+
 static int wan_aftup_program(struct wan_aftup_head_t *head)
 {
 	wan_aftup_t	*aft = NULL;
@@ -615,6 +637,7 @@
 	int		err, i;
 
 	WAN_LIST_FOREACH(aft, head, next){
+
 		if (MakeConnection(aft->if_name)){
 			printf("%s: Failed to create socket to the driver!\n",
 						 aft->if_name);
@@ -741,6 +764,9 @@
 		case AFT_4SERIAL_RS232_SUBSYS_VENDOR:
 			aft->cpld.iface	= &aftup_shark_flash_iface;
 			break;
+		case AFT_A600_SUBSYS_VENDOR:
+			aft->cpld.iface	= &aftup_a600_flash_iface;
+			break;
 		default:
 			printf("\n%s: These board are not supported (subvendor_id=%04X)!\n",
 						aft->if_name,
@@ -784,6 +810,10 @@
 			aft->cpld.chip_id = AFT_CHIP_X1000;
 			aft->cpld.flash	= &aft_shark_flash;
 			break;
+		case AFT_A600_SUBSYS_VENDOR:
+			aft->cpld.chip_id = AFT_CHIP_X250;
+			aft->cpld.flash = &aft_a600_flash;
+			break;
 		case AFT_1TE1_SHARK_SUBSYS_VENDOR:
 		case AFT_2TE1_SHARK_SUBSYS_VENDOR:
 		case AFT_8TE1_SHARK_SUBSYS_VENDOR:
@@ -795,8 +825,8 @@
 			goto program_done;
 			break;
 		}
+		
 #endif
-
 		if (wan_aftup_program_card(aft)){
 			printf("\n%s: Failed to re-program flash!\n",
 						aft->if_name);
@@ -811,13 +841,27 @@
 	return 0;
 }
 
-static int wan_aftup_verify_pciexpress(struct wan_aftup_head_t *head)
+static int wan_pcie_ctrl(struct wan_aftup_head_t *head)
 {
+	char conf_file [50];
 	wan_aftup_t	*aft = NULL;
-	unsigned char	tmp = 0x00;
-	int		i,regs_no = 0, update = 0;
+	pcie_eeprom_info_t eeprom_info;
+	pcie_bridge_iface_t pcie_iface;
+	int i;
+	int err = 0;
+	u8 byte;
 
-	regs_no = sizeof(plxctrl_data)/sizeof(struct wan_aftup_plxctrl_data_);
+	memset(&pcie_iface, 0, sizeof(pcie_bridge_iface_t));
+
+	memset(&conf_file, 0, sizeof(conf_file));
+	if (options & WAN_AFTUP_PCIEXPRESS_TUNDRA) {
+		pcie_iface = aft_pci_bridge_iface_tundra;
+		sprintf(&conf_file[0], "pcie_bridge_tundra.dat");
+	} else {
+		pcie_iface = aft_pci_bridge_iface_plx;
+		sprintf(&conf_file[0], "pcie_bridge_plx.dat");
+	}
+	
 	WAN_LIST_FOREACH(aft, head, next){
 		switch(aft->board_id){
 		case AFT_1TE1_SHARK_SUBSYS_VENDOR:
@@ -827,6 +871,7 @@
 			break;
 		case A200_REMORA_SHARK_SUBSYS_VENDOR:
 		case A400_REMORA_SHARK_SUBSYS_VENDOR:
+		case AFT_A600_SUBSYS_VENDOR:
 			break;
 		case A300_UTE3_SHARK_SUBSYS_VENDOR:
 			break;
@@ -840,46 +885,73 @@
 		default:
 			continue;
 		}
+		
 		if (MakeConnection(aft->if_name)){
 			printf(
 			"%s: Failed to create socket to the driver!\n",
 						 aft->if_name);
 			continue;
 		}
-
-		tmp = wan_plxctrl_read_ebyte(aft, (unsigned char)0x00,1);
-		if (tmp != 0x5A){
-			continue;
+		
+		memset(&eeprom_info, 0, sizeof(pcie_eeprom_info_t));
+		if (parse_pcie_reg_dat(&eeprom_info, &conf_file[0])) {
+			printf("\nFailed to parse %s \n", conf_file);
+			err = 1;
+			goto wan_pcie_ctrl_done;
 		}
-		for(i = 0; i < regs_no; i++){		
-			tmp = wan_plxctrl_read_ebyte(
-						aft,
-						plxctrl_data[i].off, 0);
-			if (tmp == plxctrl_data[i].value){
-				continue;		
+
+		if(pcie_iface.gen_eeprom_image(&eeprom_info)) {
+			printf("Failed to generate PCIe bridge image %s\n", 
+						conf_file);
+			err = 1;
+			goto wan_pcie_ctrl_done;
+		} 
+		
+		/* Program EEPROM */
+		printf("Updating PCI Express Bridge settings\n");
+		for(i = 0; i < eeprom_info.num_eeprom_bytes; i++) {
+			err = pcie_iface.write_byte(aft,
+					eeprom_info.image_vals[i].off,
+					eeprom_info.image_vals[i].value);
+					
+			if (err) {
+				printf("Failed to write to PCI-e bridge eeprom\n");
+				err = 1;
+				goto wan_pcie_ctrl_done;
 			}
-			if (!update){
-				printf(
-       				"Updating PCI Express Bridge settings");
+		}
+		
+		/* Verify EEPROM */
+		printf("Verifying PCI Express Bridge settings\n");
+		for(i = 0; i < eeprom_info.num_eeprom_bytes; i++) {
+			byte = 0x00;
+			err = pcie_iface.read_byte(aft,
+					eeprom_info.image_vals[i].off,
+					&byte);
+					
+			if (err) {
+				printf("Failed to read from PCI-e bridge eeprom\n");
+				err = 1;
+				goto wan_pcie_ctrl_done;
 			}
-			wan_plxctrl_write_ebyte(aft, 
-						plxctrl_data[i].off, 
-						plxctrl_data[i].value);
-			tmp = wan_plxctrl_read_ebyte(
-						aft,
-						plxctrl_data[i].off,0);
-			printf(".");
-			if (tmp != plxctrl_data[i].value){
-				printf("\tFailed (verification:%X:%X:%X)!\n\n",
-						plxctrl_data[i].off,tmp,plxctrl_data[i].value);
+			
+			if (byte != eeprom_info.image_vals[i].value) {
+				printf("Failed verification (%X, %X %X)\n",
+					i, 
+					byte, eeprom_info.image_vals[i].value);
+
 				printf("\tPlease call Sangoma Technical Support at 905.474.1990!\n\n");
-				return -EINVAL;
+				err = 1;
+				goto wan_pcie_ctrl_done;
 			}
-			update = 1;
-		}			
+		}
+		printf("PCI Express Bridge settings updated to version:%d\n", eeprom_info.version);
+		err = pcie_iface.reload(aft);
 		CloseConnection(aft->if_name);
 	}
-	return update;
+
+wan_pcie_ctrl_done:
+	return err;
 }
 
 static int wan_aftup_parse_hwprobe(wan_cmd_api_t *api_cmd)
@@ -1035,8 +1107,11 @@
 	}
 
 	/* Extra code here */
-	if (options & WAN_AFTUP_PCIEXPRESS){
-		err = wan_aftup_verify_pciexpress(&wan_aftup_head);
+	if (options & WAN_AFTUP_PCIEXPRESS || 
+	    options & WAN_AFTUP_PCIEXPRESS_TUNDRA){
+	
+		err = wan_pcie_ctrl(&wan_aftup_head);
+		//err = wan_aftup_verify_pciexpress(&wan_aftup_head);
 		if (err < 0){
 			goto main_done;
 		}
@@ -1124,6 +1199,8 @@
 			i++;
 		}else if (!strcmp(argv[i],"-pcie")){
 			options |= WAN_AFTUP_PCIEXPRESS;
+		}else if (!strcmp(argv[i],"-pcieT")){
+			options |= WAN_AFTUP_PCIEXPRESS_TUNDRA;
 		}else if (!strcmp(argv[i],"-auto")){
 			options |= WAN_AFTUP_AUTO;
 #if 0
@@ -1147,7 +1224,7 @@
 	char		msg[100];
 
 	memset(api_cmd.data, 0, WAN_MAX_DATA_SIZE);
-	memset(ifr.ifr_name, 0, IFNAMSIZ);
+	memset(ifr.ifr_name, 0, WAN_IFNAME_SZ);
 	strncpy(ifr.ifr_name, aft->if_name, strlen(aft->if_name));
 	ifr.ifr_data = (char*)&api_cmd;
 
@@ -1183,7 +1260,7 @@
 	char		msg[100];
 
 	memset(api_cmd.data, 0, WAN_MAX_DATA_SIZE);
-	memset(ifr.ifr_name, 0, IFNAMSIZ);
+	memset(ifr.ifr_name, 0, WAN_IFNAME_SZ);
 	strncpy(ifr.ifr_name, aft->if_name, strlen(aft->if_name));
 	ifr.ifr_data = (char*)&api_cmd;
 
@@ -1218,7 +1295,7 @@
 	char		msg[100];
 
 	memset(api_cmd.data, 0, WAN_MAX_DATA_SIZE);
-	memset(ifr.ifr_name, 0, IFNAMSIZ);
+	memset(ifr.ifr_name, 0, WAN_IFNAME_SZ);
 	strncpy(ifr.ifr_name, aft->if_name, strlen(aft->if_name));
 	ifr.ifr_data = (char*)&api_cmd;
 
@@ -1254,7 +1331,7 @@
 	char		msg[100];
 
 	memset(api_cmd.data, 0, WAN_MAX_DATA_SIZE);
-	memset(ifr.ifr_name, 0, IFNAMSIZ);
+	memset(ifr.ifr_name, 0, WAN_IFNAME_SZ);
 	strncpy(ifr.ifr_name, aft->if_name, strlen(aft->if_name));
 	ifr.ifr_data = (char*)&api_cmd;
 
@@ -1281,50 +1358,3 @@
 	return err;
 }
 
-static int aft_a200_a400_warning(wan_aftup_t *aft)
-{
-	char   	sel[20];
-        int	warning=0;
-	
-        if (aft->board_id == A200_REMORA_SHARK_SUBSYS_VENDOR &&
-	    (aft->flash_rev == 7 || 
-	     aft->flash_rev == 8)) {
-       		warning=1; 	
-       	}      
-
-	if (!warning) {
-		return 0;
-	}
-
-	
-        printf ("\n");
-        printf ("WARNING: User Confirmation Required!\n");
-        printf ("------------------------------------\n");
-	printf ("Please confirm your hardware type, an\n");
-	printf ("incorrect choice will corrupt the firmware.\n");
-	printf ("If firmware gets corrupted, a firmware recovery procedure\n");
-	printf ("using a jumper will have to be invoked to recover the card. \n");
-	printf ("For recovery procedures refer to: wiki.sangoma.com \n");
-        printf ("------------------------------------\n\n");
-        printf ("Please confirm hardware type:\n");
-	printf (" 1. A200 (front end connector RJ45)\n");
-	printf (" 2. A400 (front end connector DB25)\n");
-	printf (" Select: [1|2|q]:");
-
-	if (scanf("%s", sel)){
-	       	if (strcmp(sel, "q") == 0){
-	       		return -EINVAL;
-		} else if (strcmp(sel, "1") == 0) {
-			return 0;
-		} else if (strcmp(sel, "2") == 0) {
-			aft->board_id=A400_REMORA_SHARK_SUBSYS_VENDOR;
-			return 0;
-		} else {
-                 	return aft_a200_a400_warning(aft);
-		}
-	}
-
-	printf ("\nError: Invalid Selection %s\n",sel);
-	return -EINVAL;	
-}
-
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/util/wan_aftup/wan_aftup.h wanpipe-3.3.14b/util/wan_aftup/wan_aftup.h
--- wanpipe-3.3.14/util/wan_aftup/wan_aftup.h	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/util/wan_aftup/wan_aftup.h	2008-10-20 14:08:02.000000000 -0400
@@ -4,6 +4,14 @@
 #define MAX_IFNAME_LEN	20
 #define MAX_HWINFO_LEN	100
 
+#include "wan_aft_prg.h"
+
+#define u32 	unsigned int
+#define u8 	unsigned char
+#define u16	unsigned short
+#define s16	signed short
+
+
 typedef struct wan_aftup_ {
 
 	char		if_name[MAX_IFNAME_LEN];
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/util/wancfg_zaptel/wancfg_zaptel.pl wanpipe-3.3.14b/util/wancfg_zaptel/wancfg_zaptel.pl
--- wanpipe-3.3.14/util/wancfg_zaptel/wancfg_zaptel.pl	2008-10-07 15:10:17.000000000 -0400
+++ wanpipe-3.3.14b/util/wancfg_zaptel/wancfg_zaptel.pl	2008-10-27 10:02:30.000000000 -0400
@@ -9,6 +9,7 @@
 #               as published by the Free Software Foundation; either version
 #               2 of the License, or (at your option) any later version.
 # ----------------------------------------------------------------------------
+# Oct 16   2008  2.22	Jignesh Patel	Added Support for A600 
 # Oct 07   2008  2.21   Jignesh Patel 	Dahdi Soft-EC conf support for Analog & A101/2 cards
 # Sep 30   2008  2.20	Jignesh Patel   Configuration Support for Dahdi
 # Aug 20   2008  2.19	Jignesh Patel 	Suppor for HP TDM API for A10x added hp_a100
@@ -45,7 +46,7 @@
 print "\n########################################################################";
 print "\n#    		           Sangoma Wanpipe                              #";
 print "\n#        Dahdi/Zaptel/SMG/TDMAPI/BOOT Configuration Script             #";
-print "\n#                             v2.21                                    #";
+print "\n#                             v2.22                                    #";
 print "\n#                     Sangoma Technologies Inc.                        #";
 print "\n#                        Copyright(c) 2008.                            #";
 print "\n########################################################################\n\n";
@@ -2083,7 +2084,7 @@
 	foreach my $dev (@hwprobe) {
 		if ( $dev =~ /A(\d+)(.*):.*SLOT=(\d+).*BUS=(\d+).*CPU=(\w+).*PORT=(\w+).*/){
 
-		  	if ( ! ($1 eq '200' | $1 eq '400' | $1 eq '500') ){
+		  	if ( ! ($1 eq '200' | $1 eq '400' | $1 eq '500' | $1 eq '600') ){
 				#do not count analog devices
 				$num_digital_devices_total++;
 			}
@@ -2756,7 +2757,7 @@
 	}
 	$first_cfg=0;
 	print "------------------------------------\n";
-	print "Configuring analog cards [A200/A400]\n";
+	print "Configuring analog cards [A200/A400/A600]\n";
 	print "------------------------------------\n";
 
 	my $skip_card=$FALSE;
@@ -2766,7 +2767,9 @@
 	}
 	foreach my $dev (@hwprobe) {
 		
-		if ( $dev =~ /(\d+).(\w+\w+).*SLOT=(\d+).*BUS=(\d+).*CPU=(\w+).*PORT=(\w+).*HWEC=(\d+)/){
+		
+	        if ( $dev =~ /(\d+).(\w+\w+).*SLOT=(\d+).*BUS=(\d+).*.*HWEC=(\d+)/){
+
 			$skip_card=$FALSE;
 			my $card = eval {new Card(); } or die ($@);
 			$card->current_dir($current_dir);
@@ -2775,8 +2778,9 @@
 			$card->card_model($1);
 			$card->pci_slot($3);
 			$card->pci_bus($4);
-			$card->fe_cpu($5);
-			my $hwec=$7;
+			#fe_cpu is not used for analog cards
+			#$card->fe_cpu($5);
+			my $hwec=$5;
 			if($dahdi_installed == $TRUE) {
 					$card->dahdi_conf('YES');
 					$card->dahdi_echo($dahdi_echo)
@@ -2788,7 +2792,7 @@
 				$card->hwec_mode('YES');
 				
 			}
-			if ($card->card_model eq '200' | $card->card_model eq '400'){
+			if ($card->card_model eq '200' | $card->card_model eq '400' | $card->card_model eq '600'){
 				$num_analog_devices_total++;
 				if($silent==$FALSE) {
 					system('clear');
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/util/wanconfig/wanconfig.c wanpipe-3.3.14b/util/wanconfig/wanconfig.c
--- wanpipe-3.3.14/util/wanconfig/wanconfig.c	2008-09-02 16:25:57.000000000 -0400
+++ wanpipe-3.3.14b/util/wanconfig/wanconfig.c	2008-10-20 12:17:31.000000000 -0400
@@ -1477,6 +1477,8 @@
         { WAN_MASTER_CLK,   	"MASTER"        },
         { WAN_NORMAL_CLK,	"LINE"          },
 	{ WAN_MASTER_CLK, 	"OSC"     	},
+	{ WAN_CLK_OUT_OSC,	"OUT_OSC"	},
+	{ WAN_CLK_OUT_LINE,	"OUT_LINE"	},
 	{ WANOPT_NETWORK_SYNC_IN,   "IN" },
 	{ WANOPT_NETWORK_SYNC_OUT,  "OUT" },
         { WAN_TE1_SIG_CAS,	"CAS"           },
diff -dur --exclude=ssmg --exclude='*.deb' --exclude=Makefile --exclude='*.sh' --exclude='*.beta' --exclude='*src.c' --exclude='*.mod.c' --exclude='*.spec' wanpipe-3.3.14/util/wanec_apilib/wanec_api_lib.c wanpipe-3.3.14b/util/wanec_apilib/wanec_api_lib.c
--- wanpipe-3.3.14/util/wanec_apilib/wanec_api_lib.c	2008-07-17 08:20:35.000000000 -0400
+++ wanpipe-3.3.14b/util/wanec_apilib/wanec_api_lib.c	2008-10-20 12:02:30.000000000 -0400
@@ -160,6 +160,7 @@
 
 wanec_image_list_t	wanec_image_list[] = 
 	{
+		{ 5,   2, { &wanec_image_64, &wanec_image_32 } },
 		{ 16,  2, { &wanec_image_64, &wanec_image_32 } },
 		{ 32,  2, { &wanec_image_64, &wanec_image_32 } },
 		{ 64,  1, { &wanec_image_64  } },
