--- sdla_chdlc.c	2006-03-13 11:54:59.000000000 -0500
+++ /wanpipe/code/router/sdla_chdlc.c	2006-04-11 16:37:16.000000000 -0400
@@ -448,12 +448,13 @@
 	if (IS_TE1_MEDIA(&conf->fe_cfg)){
 		
 		memcpy(&card->fe.fe_cfg, &conf->fe_cfg, sizeof(sdla_fe_cfg_t));
+		sdla_te_iface_init(&card->wandev.fe_iface);
 		card->fe.name		= card->devname;
 		card->fe.card		= card;
 		card->fe.write_fe_reg	= write_front_end_reg;
 		card->fe.read_fe_reg	= read_front_end_reg;
 
-		card->wandev.te_enable_timer = chdlc_enable_timer;
+		card->wandev.fe_enable_timer = chdlc_enable_timer;
 		card->wandev.te_link_state = chdlc_handle_front_end_state;
 		conf->interface = 
 			(IS_T1_CARD(card)) ? WANOPT_V35 : WANOPT_RS232;
@@ -465,6 +466,7 @@
 	}else if (IS_56K_MEDIA(&conf->fe_cfg)){
 
 		memcpy(&card->fe.fe_cfg, &conf->fe_cfg, sizeof(sdla_fe_cfg_t));
+		sdla_56k_iface_init(&card->wandev.fe_iface);
 		card->fe.name		= card->devname;
 		card->fe.card		= card;
 		card->fe.write_fe_reg	= write_front_end_reg;
@@ -1372,7 +1374,9 @@
 
 	/* TE1 - Unconfiging, only on shutdown */
 	if (IS_TE1_CARD(card)) {
-		sdla_te_unconfig(&card->fe);
+		if (card->wandev.fe_iface.unconfig){
+			card->wandev.fe_iface.unconfig(&card->fe);
+		}
 	}
 
 #if 1 
@@ -1880,7 +1884,9 @@
 
 	/* TE1 - Unconfiging, only on shutdown */
 	if (IS_TE1_CARD(card)) {
-		sdla_te_unconfig(&card->fe);
+		if (card->wandev.fe_iface.unconfig){
+			card->wandev.fe_iface.unconfig(&card->fe);
+		}
 	}
 
 	return 0;
@@ -1978,7 +1984,7 @@
 	if (IS_TE1_CARD(card)) {	
 		card->wandev.fe_iface.read_alarm(&card->fe, 0); 
 		/* TE1 Update T1/E1 perfomance counters */
-		card->wandev.fe_iface.read_pmon(&card->fe); 
+		card->wandev.fe_iface.read_pmon(&card->fe, 0); 
 	}else if (IS_56K_CARD(card)) {
 		/* 56K Update CSU/DSU alarms */
 		card->wandev.fe_iface.read_alarm(&card->fe, 1); 
@@ -2055,13 +2061,20 @@
 /*============================================================================
  * Read TE1/56K Front end registers
  */
-static unsigned char read_front_end_reg (void* card1, unsigned short reg)
+//static unsigned char read_front_end_reg (void* card1, unsigned short reg)
+static unsigned char read_front_end_reg (void* card1, ...)
 {
-	sdla_t* card = (sdla_t*)card1;
-        wan_mbox_t* mb = &card->wan_mbox;
-	char* data = mb->wan_data;
+	va_list		args;
+	sdla_t		*card = (sdla_t*)card1;
+        wan_mbox_t	*mb = &card->wan_mbox;
+	char		*data = mb->wan_data;
+	u16		reg;
         int err;
 
+	va_start(args, card1);
+	reg	= (u16)va_arg(args, int);
+	va_end(args);
+
 	((FRONT_END_REG_STRUCT *)data)->register_number = (unsigned short)reg;
 	mb->wan_data_len = sizeof(FRONT_END_REG_STRUCT);
         mb->wan_command = READ_FRONT_END_REGISTER;
@@ -2076,13 +2089,22 @@
 /*============================================================================
  * Write to TE1/56K Front end registers  
  */
-static unsigned char write_front_end_reg (void* card1, unsigned short reg, unsigned char value)
+//static unsigned char write_front_end_reg (void* card1, unsigned short reg, unsigned char value)
+static int write_front_end_reg (void* card1, ...)
 {
-	sdla_t* card = (sdla_t*)card1;
-        wan_mbox_t* mb = &card->wan_mbox;
-	char* data = mb->wan_data;
+	va_list		args;
+	sdla_t		*card = (sdla_t*)card1;
+        wan_mbox_t	*mb = &card->wan_mbox;
+	char		*data = mb->wan_data;
+	u16		reg;
+	u8		value;
         int err;
 	int retry=15;
+
+	va_start(args, card1);
+	reg	= (u16)va_arg(args, int);
+	value	= (u8)va_arg(args, int);
+	va_end(args);
 	
 	do {
 		((FRONT_END_REG_STRUCT *)data)->register_number = (unsigned short)reg;
@@ -2477,11 +2499,16 @@
 	} else if(chdlc_priv_area->common.usedby == API) {
 
 		api_rx_hdr_t* api_rx_hdr;
+		struct timeval tv;
        		skb_push(skb, sizeof(api_rx_hdr_t));
                 api_rx_hdr = (api_rx_hdr_t*)&skb->data[0x00];
 		api_rx_hdr->error_flag = rxbuf.error_flag;
      		api_rx_hdr->time_stamp = rxbuf.time_stamp;
 
+		do_gettimeofday(&tv);
+		api_rx_hdr->sec=tv.tv_sec;
+		api_rx_hdr->usec=tv.tv_usec;		
+
                 skb->protocol = htons(WP_PVC_PROT);
      		skb->mac.raw  = skb->data;
 		skb->dev      = dev;
@@ -4173,10 +4200,14 @@
 	card->hw_iface.poke_byte(card->hw, card->intr_perm_off, 0x00);
 
 	if (IS_TE1_CARD(card)) {
+		int	err = -EINVAL;
 		printk(KERN_INFO "%s: Configuring onboard %s CSU/DSU\n",
 			card->devname, 
 			(IS_T1_CARD(card))?"T1":"E1");
-		if (sdla_te_config(&card->fe, &card->wandev.fe_iface)){
+		if (card->wandev.fe_iface.config){
+			err = card->wandev.fe_iface.config(&card->fe);
+		}
+		if (err){
 			printk(KERN_INFO "%s: Failed %s configuratoin!\n",
 					card->devname,
 					(IS_T1_CARD(card))?"T1":"E1");
@@ -4186,10 +4217,14 @@
 
 	 
 	if (IS_56K_CARD(card)) {
+		int	err = -EINVAL;
 		printk(KERN_INFO "%s: Configuring 56K onboard CSU/DSU\n",
 			card->devname);
 
-		if(sdla_56k_config(&card->fe, &card->wandev.fe_iface)) {
+		if (card->wandev.fe_iface.config){
+			err = card->wandev.fe_iface.config(&card->fe);
+		}
+		if(err) {
 			printk (KERN_INFO "%s: Failed 56K configuration!\n",
 				card->devname);
 			return -EINVAL;
@@ -4818,6 +4853,8 @@
 	unsigned offset=0;
 	struct tty_struct *tty;
 	int i;
+
+	i=0;
 	
 	if (!card->tty_open){
 		DEBUG_TEST("%s: TTY not open during receive\n",
@@ -4839,6 +4876,25 @@
 	
 
 	if (card->u.c.async_mode){
+		
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15)
+		unsigned char *buf;
+		struct sk_buff *skb;      
+    		
+		if (len > TTY_CHDLC_MAX_MTU){
+			if (net_ratelimit()){
+				printk(KERN_INFO 
+				"%s: Received packet size too big: %i bytes, Max: %i!\n",
+					card->devname,len,TTY_FLIPBUF_SIZE);
+			}
+			return;
+		}
+		
+		skb=skb_dequeue(&card->tty_rx_empty);
+		if (skb == NULL){
+			return;
+		}      
+#else		
 		if ((tty->flip.count+len) >= TTY_FLIPBUF_SIZE){
 			if (net_ratelimit()){
 				printk(KERN_INFO 
@@ -4848,23 +4904,46 @@
 			return;
 		}
 
-		
+#endif
 		if((addr + len) > card->u.c.rx_top_off + 1) {
 			offset = card->u.c.rx_top_off - addr + 1;
 			
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15)
+                        buf=skb_put(skb,offset);
+			card->hw_iface.peek(card->hw, addr, buf, offset);  
+
+			addr = card->u.c.rx_base_off;
+			len -= offset;
+
+			tty_insert_flip_string(tty,buf,offset);
+			
+#else			
 			card->hw_iface.peek(card->hw, addr, tty->flip.char_buf_ptr, offset);
 			
 			addr = card->u.c.rx_base_off;
 			len -= offset;
 			
+
 			tty->flip.char_buf_ptr+=offset;
 			tty->flip.count+=offset;
 			for (i=0;i<offset;i++){
 				*tty->flip.flag_buf_ptr = 0;
 				tty->flip.flag_buf_ptr++;
 			}
+#endif
 		}
 		
+		
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15)
+                buf=skb_put(skb,len);
+		card->hw_iface.peek(card->hw, addr, buf, len);
+		
+		tty_insert_flip_string(tty,buf,len);
+
+		skb_trim(skb,0);
+		skb_queue_tail(&card->tty_rx_empty,skb);
+#else		
 		card->hw_iface.peek(card->hw, addr, tty->flip.char_buf_ptr, len);
 		
 		tty->flip.char_buf_ptr+=len;
@@ -4873,9 +4952,10 @@
 			*tty->flip.flag_buf_ptr = 0;
 			tty->flip.flag_buf_ptr++;
 		}
-
+#endif
 		tty->low_latency=1;
 		tty_flip_buffer_push(tty);
+
 	}else{
 		if (len > TTY_CHDLC_MAX_MTU){
 			if (net_ratelimit()){
@@ -4963,10 +5043,14 @@
 	card->hw_iface.poke_byte(card->hw, card->intr_perm_off, 0x00);
 	
 	if (IS_TE1_CARD(card)) {
+		int	err = -EINVAL;
 		printk(KERN_INFO "%s: Configuring onboard %s CSU/DSU\n",
 			card->devname, 
 			(IS_T1_CARD(card))?"T1":"E1");
-		if (sdla_te_config(&card->fe, &card->wandev.fe_iface)){
+		if (card->wandev.fe_iface.config){
+			err = card->wandev.fe_iface.config(&card->fe);
+		}
+		if (err){
 			printk(KERN_INFO "%s: Failed %s configuratoin!\n",
 					card->devname,
 					(IS_T1_CARD(card))?"T1":"E1");
@@ -4976,10 +5060,14 @@
 
 	 
 	if (IS_56K_CARD(card)) {
+		int	err = -EINVAL;
 		printk(KERN_INFO "%s: Configuring 56K onboard CSU/DSU\n",
 			card->devname);
 
-		if(sdla_56k_config(&card->fe, &card->wandev.fe_iface)){
+		if (card->wandev.fe_iface.config){
+			err = card->wandev.fe_iface.config(&card->fe);
+		}
+		if(err){
 			printk (KERN_INFO "%s: Failed 56K configuration!\n",
 				card->devname);
 			return -EINVAL;
