enable start-stop-daemon by default, i want to use this to clean up a few init script...
[15.05/openwrt.git] / target / linux / amazon-2.6 / files / drivers / char / amazon_mei.c
1 /* ============================================================================
2  * Copyright (C) 2004 -Infineon Technologies AG.
3  *
4  * All rights reserved.
5  * ============================================================================
6  *
7  *============================================================================
8  * Licensed under GNU GPL v2
9  * ============================================================================
10  */
11
12  
13 /* ===========================================================================
14  *
15  * File Name:   amazon_mei.c
16  * Author :     Ou Ke
17  *
18  * ===========================================================================
19  *
20  * Project: Amazon
21  *
22  * ===========================================================================
23  * Contents:This file implements the MEI driver for Amazon ADSL/ADSL2+
24  *  controller.
25  *  
26  * ===========================================================================
27  * References: 
28  *
29  */
30
31
32 /* ===========================================================================
33  * Revision History:
34  *              12/1/2005 : Ritesh Banerjee
35  *                      - Create a kernel thread kmibpoll to poll for periodic RFC 2662
36  *                      and RFC 3440 counters. Removes the need for user space 
37  *                      adsl_mibpoll_daemon and saves atleast 30KB of RAM.
38  *
39  * $Log$
40  * ===========================================================================
41  */
42
43 /*
44  * ===========================================================================
45  *                           INCLUDE FILES
46  * ===========================================================================
47  */
48 //000002:fchang 2005/6/2 joelin 04/27/2005 for pcm clock
49 //000003:fchang 2005/6/2 Henry added for Amazon-E support
50 //165001:henryhsu 2005/9/6 Modify for adsl firmware version 1.2.1.2.0.1 DATA_LED can't flash.
51 // 509221:tc.chen 2005/09/22 Reset DFE added when MEI_TO_ARC_CS_DONE not cleared by ARC
52 // 603221:tc.chen 2006/03/21 added APIs to support the WEB related parameters for ADSL Statistics
53
54 #ifndef EXPORT_SYMTAB
55 #define EXPORT_SYMTAB
56 #endif
57 #define AMAZON_MEI_MIB_RFC3440
58
59 #include <linux/config.h>
60 #include <linux/kernel.h>
61 #include <linux/module.h>               
62 #include <linux/version.h>
63 #include <linux/types.h>
64 #include <linux/fs.h>
65 #include <linux/mm.h>
66 #include <linux/errno.h>
67 #include <linux/interrupt.h>
68 #include <linux/netdevice.h>
69 #include <linux/etherdevice.h>
70 #include <asm/irq.h>
71 #include <asm/segment.h>
72 #include <asm/semaphore.h>
73 #include <linux/init.h>                                  
74 #include <linux/ioport.h>
75 #include <asm/uaccess.h>                       
76 #include <linux/proc_fs.h>
77 #include <asm/io.h>
78 #include <linux/vmalloc.h>
79 #include <linux/delay.h>
80 #include <linux/poll.h>
81 #include <linux/list.h>
82 #include <linux/time.h>
83
84 #include <asm/amazon/amazon.h>
85 #include <asm/irq.h>
86 #include <asm/amazon/irq.h>
87 #include <asm/amazon/amazon_mei.h>
88 #include <asm/amazon/amazon_mei_app.h>
89 #include <asm/amazon/amazon_mei_ioctl.h>
90 #include <asm/amazon/amazon_mei_app_ioctl.h>
91
92 #define SET_BIT(reg, mask)                  reg |= (mask)
93 #define CLEAR_BIT(reg, mask)                reg &= (~mask)
94 #define CLEAR_BITS(reg, mask)               CLEAR_BIT(reg, mask)
95 #define SET_BITS(reg, mask)                 SET_BIT(reg, mask)
96 #define SET_BITFIELD(reg, mask, off, val)   {reg &= (~mask); reg |= (val << off);}
97
98 extern void mask_and_ack_amazon_irq(unsigned int irq_nr);
99
100 #ifdef AMAZON_CHECK_LINK
101 //amazon_tpe.c
102 extern int (*adsl_link_notify)(int);
103 #endif //AMAZON_CHECK_LINK
104
105 // for ARC memory access
106 #define WHILE_DELAY 20000
107 #define AMAZON_DMA_DEBUG_MUTEX
108
109
110 //TODO
111 #undef DFE_LOOPBACK
112 #define ARC_READY_ACK
113
114 static amazon_mei_mib * current_intvl;
115 static struct list_head interval_list;
116 static amazon_mei_mib * mei_mib;
117
118 static int reboot_firsttime=1;//000002:fchang
119
120         //PCM
121 #define PCM_CHANNEL_NUM         2       //1 rx, 1 tx
122 static pcm_data_struct  pcm_data[PCM_CHANNEL_NUM]__attribute__ ((aligned(4)));  //0=tx0, 1=rx0, 2=tx1, 3=rx1
123 static u32 pcm_start_addr;
124 //#define PCM_HRT_TIME_HZ               4000    //?us
125 #define PCM_ACCESS_DEBUG
126 static int irqtimes=0;
127 #undef DATA_LED_ON_MODE
128 #define ADSL_LED_SUPPORT        //joelin for adsl led
129 #ifdef ADSL_LED_SUPPORT
130 static int firmware_support_led=0; //joelin version check       for adsl led    
131 static int stop_led_module=0;   //wakeup and clean led module
132 static int led_support_check=0; //1.1.2.7.1.1
133 #endif //ADSL_LED_SUPPORT
134 #define IFX_DYING_GASP
135 #ifdef IFX_DYING_GASP
136 static wait_queue_head_t wait_queue_dying_gasp; //dying gasp
137 //struct tq_struct dying_gasp_task;             //dying gasp
138 static wait_queue_head_t wait_queue_uas_poll;   //joelin 04/16/2005
139 static u16 unavailable_seconds=0;               //joelin 04/16/2005
140 static meidebug lop_debugwr;                            //dying gasp
141 #endif //IFX_DYING_GASP
142 static int dbg_int=0;
143 //#define DEBUG_ACCESS_DELAY    for(dbg_int=0;dbg_int<100;dbg_int++){;}
144 #define DEBUG_ACCESS_DELAY
145 static u8 sampledata[512];
146 static int firsttime[PCM_CHANNEL_NUM]={0,1};
147 static int num_cmp[PCM_CHANNEL_NUM]={0,0};
148 static int pcm_start_loc[PCM_CHANNEL_NUM]={0,0}; 
149
150         // for clearEoC 
151 //#define MEI_CLREOC_BUFF_SIZE  512     //double the receive fifo size, bytes
152 //static u8 clreoc[MEI_CLREOC_BUFF_SIZE]__attribute__ ((aligned(4)));   //buffer to hold clearEoC data in bytes
153 #undef AMAZON_CLEAR_EOC
154 #ifdef AMAZON_CLEAR_EOC
155 extern void ifx_push_eoc(struct sk_buff * pkt);
156 #endif
157 static int meiResetArc(void); 
158 #define IFX_POP_EOC_DONE        0
159 #define IFX_POP_EOC_FAIL        -1
160 static struct list_head clreoc_list;
161 static amazon_clreoc_pkt * clreoc_pkt;
162 #define CLREOC_BUFF_SIZE        12      //number of clreoc commands being buffered
163 //static int clreoc_wr=0;
164 //static int clreoc_rd=0;               //used to control clreoc circular buffer 
165 static wait_queue_head_t wait_queue_clreoc;
166 #ifdef ADSL_LED_SUPPORT
167 static wait_queue_head_t wait_queue_led;        //adsl led
168 static wait_queue_head_t wait_queue_led_polling;// adsl led
169 struct tq_struct led_task;                      // adsl led
170 static DECLARE_TASK_QUEUE(tq_ifx_led);          // task
171 int adsl_led_flash_task(void *ptr);             // adsl led
172 #endif  //ADSL_LED_SUPPORT
173 static void * clreoc_command_pkt=NULL;
174 static int clreoc_max_tx_len=0;
175
176 // 603221:tc.chen start
177 #define ME_HDLC_IDLE 0
178 #define ME_HDLC_INVALID_MSG 1
179 #define ME_HDLC_MSG_QUEUED 2
180 #define ME_HDLC_MSG_SENT 3
181 #define ME_HDLC_RESP_RCVD 4
182 #define ME_HDLC_RESP_TIMEOUT 5
183 #define ME_HDLC_RX_BUF_OVERFLOW 6
184 #define ME_HDLC_UNRESOLVED 1
185 #define ME_HDLC_RESOLVED 2
186 // 603221:tc.chen end
187
188 #ifdef LOCK_RETRY
189 static int reboot_lock=0;
190 #endif
191
192 static mib_previous_read mib_pread={0,0,0,0,0,0,0,0,0,0,0,0};
193 static mib_flags_pretime mib_pflagtime;// initialized when module loaded
194
195         static u32 ATUC_PERF_LOFS=0;
196         static u32 ATUC_PERF_LOSS=0;
197         static u32 ATUC_PERF_ESS=0;
198         static u32 ATUC_PERF_INITS=0;
199         static u32 ATUR_PERF_LOFS=0;
200         static u32 ATUR_PERF_LOSS=0;
201         static u32 ATUR_PERF_LPR=0;
202         static u32 ATUR_PERF_ESS=0;
203         static u32 ATUR_CHAN_RECV_BLK=0;
204         static u32 ATUR_CHAN_TX_BLK=0;
205         static u32 ATUR_CHAN_CORR_BLK=0;
206         static u32 ATUR_CHAN_UNCORR_BLK=0;
207         //RFC-3440
208         static u32 ATUC_PERF_STAT_FASTR=0;
209         static u32 ATUC_PERF_STAT_FAILED_FASTR=0;
210         static u32 ATUC_PERF_STAT_SESL=0;
211         static u32 ATUC_PERF_STAT_UASL=0;
212         static u32 ATUR_PERF_STAT_SESL=0;
213         static u32 ATUR_PERF_STAT_UASL=0;
214
215         static adslChanPrevTxRate PrevTxRate={0,0};
216         static adslPhysCurrStatus CurrStatus={0,0};
217         static ChanType chantype={0,0};
218         static adslLineAlarmConfProfileEntry AlarmConfProfile={"No Name\0",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
219 // 603221:tc.chen start
220         static adslFarEndPerfStats FarendStatsData;
221         struct timeval FarendData_acquire_time={0};
222         static u32 adsl_mode,adsl_mode_extend; // adsl mode : adsl/ 2/ 2+
223         static adslInitStats AdslInitStatsData;
224 //603221:tc.chen end
225 static u32 loop_diagnostics_mode=0;
226 static wait_queue_head_t wait_queue_loop_diagnostic;
227 #ifdef AMAZON_MEI_MIB_RFC3440
228         static adslLineAlarmConfProfileExtEntry AlarmConfProfileExt={"No Name\0",0,0,0,0,0,0};
229 #endif
230
231 static int showtime=0;
232 static int loop_diagnostics_completed=0;
233 //////////////////////////////////////////////////////////////////////////////////
234 static int phy_mei_net_init(struct net_device * dev);
235 static int interleave_mei_net_init(struct net_device * dev);
236 static int fast_mei_net_init(struct net_device * dev);
237 static struct net_device_stats * phy_mei_net_get_stats(struct net_device * dev);
238 static struct net_device_stats * interleave_mei_net_get_stats(struct net_device * dev);
239 static struct net_device_stats * fast_mei_net_get_stats(struct net_device * dev);
240
241 typedef struct mei_priv{
242         struct net_device_stats stats;
243 }mei_priv;
244
245 static struct net_device phy_mei_net = { init: phy_mei_net_init, name: "MEI_PHY"};
246 static struct net_device interleave_mei_net = { init: interleave_mei_net_init, name: "MEI_INTL"};
247 static struct net_device fast_mei_net = { init: fast_mei_net_init, name: "MEI_FAST"};
248 ///////////////////////////////////////////////////////////////////////////////////
249
250 static int major=AMAZON_MEI_MAJOR;
251
252 static struct semaphore mei_sema;
253
254 // Mei to ARC CMV count, reply count, ARC Indicator count
255 static int indicator_count=0;
256 static int cmv_count=0;
257 static int reply_count=0;
258 static u16 Recent_indicator[MSG_LENGTH];
259
260 // Used in interrupt handler as flags
261 static int arcmsgav=0;
262 static int cmv_reply=0;
263 static int cmv_waiting=0;
264
265 #define PROC_ITEMS 8
266
267 long mei_debug_mode = 0; //509221:tc.chen for adsl firmware debug
268
269 //  to wait for arc cmv reply, sleep on wait_queue_arcmsgav;
270 static wait_queue_head_t wait_queue_arcmsgav;
271 static wait_queue_head_t wait_queue_codeswap;
272 static wait_queue_head_t wait_queue_mibdaemon;
273 static wait_queue_head_t wait_queue_reboot;
274 static u32 * image_buffer=NULL;         // holding adsl firmware image
275 static u16 RxMessage[MSG_LENGTH]__attribute__ ((aligned(4)));
276 static u16 TxMessage[MSG_LENGTH]__attribute__ ((aligned(4)));                                                                                                               
277 static u32 * mei_arc_swap_buff=NULL;    //  holding swap pages
278 static ARC_IMG_HDR * img_hdr;
279 static int reboot_flag;
280
281 #ifdef DFE_LOOPBACK
282 #include "arc_pm.h"
283 #endif
284
285
286 /////////////////               net device                              ///////////////////////////////////////////////////
287 static int phy_mei_net_init(struct net_device * dev)
288 {
289         //ether_setup(dev);
290         dev->get_stats = phy_mei_net_get_stats;
291         dev->ip_ptr = NULL;
292         dev->type = 94;
293         
294 //      dev->mtu=12345;
295         dev->flags=IFF_UP;
296         
297         dev->priv = kmalloc(sizeof(struct mei_priv), GFP_KERNEL);
298         if(dev->priv == NULL)
299                 return -ENOMEM;
300         memset(dev->priv, 0, sizeof(struct mei_priv));
301         return 0;
302 }
303
304 static int interleave_mei_net_init(struct net_device * dev)
305 {
306         //ether_setup(dev);
307         dev->get_stats = interleave_mei_net_get_stats;
308         dev->ip_ptr = NULL;
309         dev->type = 124;
310         dev->flags=IFF_UP;
311         dev->priv = kmalloc(sizeof(struct mei_priv), GFP_KERNEL);
312         if(dev->priv == NULL)
313                 return -ENOMEM;
314         memset(dev->priv, 0, sizeof(struct mei_priv));
315         return 0;
316 }
317
318 static int fast_mei_net_init(struct net_device * dev)
319 {
320         //ether_setup(dev);
321         dev->get_stats = fast_mei_net_get_stats;
322         dev->ip_ptr = NULL;
323         dev->type = 125;
324         dev->flags=IFF_UP;
325         dev->priv = kmalloc(sizeof(struct mei_priv), GFP_KERNEL);
326         if(dev->priv == NULL)
327                 return -ENOMEM;
328         memset(dev->priv, 0, sizeof(struct mei_priv));
329         return 0;
330 }
331
332 static struct net_device_stats * phy_mei_net_get_stats(struct net_device * dev)
333 {
334         struct mei_priv * priv;
335         priv = (struct mei_priv *)dev->priv;
336         // update statistics
337         (priv->stats).rx_packets = ATUR_CHAN_RECV_BLK;
338         (priv->stats).tx_packets = ATUR_CHAN_TX_BLK;
339         (priv->stats).rx_errors = ATUR_CHAN_CORR_BLK + ATUR_CHAN_UNCORR_BLK;
340         (priv->stats).rx_dropped = ATUR_CHAN_UNCORR_BLK;
341         
342         return &(priv->stats);
343 }
344
345 static struct net_device_stats * interleave_mei_net_get_stats(struct net_device * dev)
346 {
347         struct mei_priv * priv;
348         priv = (struct mei_priv *)dev->priv;
349         // update statistics
350         (priv->stats).rx_packets = ATUR_CHAN_RECV_BLK;
351         (priv->stats).tx_packets = ATUR_CHAN_TX_BLK;
352         (priv->stats).rx_errors = ATUR_CHAN_CORR_BLK + ATUR_CHAN_UNCORR_BLK;
353         (priv->stats).rx_dropped = ATUR_CHAN_UNCORR_BLK;
354         
355         return &(priv->stats);
356 }
357
358 static struct net_device_stats * fast_mei_net_get_stats(struct net_device * dev)
359 {
360         struct mei_priv * priv;
361         priv = (struct mei_priv *)dev->priv;
362         // update statistics
363         (priv->stats).rx_packets = ATUR_CHAN_RECV_BLK;
364         (priv->stats).tx_packets = ATUR_CHAN_TX_BLK;
365         (priv->stats).rx_errors = ATUR_CHAN_CORR_BLK + ATUR_CHAN_UNCORR_BLK;
366         (priv->stats).rx_dropped = ATUR_CHAN_UNCORR_BLK;
367         
368         return &(priv->stats);
369 }
370 /////////////////               mei access Rd/Wr methods       ///////////////////////////////////////////////////
371 void meiLongwordWrite(u32 ul_address, u32 ul_data)
372 {
373         *((volatile u32 *)ul_address) = ul_data;
374         asm("SYNC");
375         return;
376 } //    end of "meiLongwordWrite(..."
377
378 void meiLongwordRead(u32 ul_address, u32 *pul_data)
379 {
380         *pul_data = *((volatile u32 *)ul_address);
381         asm("SYNC");
382         return;
383 } //    end of "meiLongwordRead(..."
384
385 MEI_ERROR meiDMAWrite(u32 destaddr, u32 *databuff, u32 databuffsize)
386 {
387         u32 *p = databuff;
388         u32 temp;
389         u32 flags;
390
391         if( destaddr & 3)
392                 return MEI_FAILURE;
393
394 #ifdef AMAZON_DMA_DEBUG_MUTEX
395         save_flags(flags);
396         cli();
397 #endif
398                 
399
400         //      Set the write transfer address
401         meiLongwordWrite(MEI_XFR_ADDR, destaddr);
402
403         //      Write the data pushed across DMA
404         while (databuffsize--)
405         {
406                 temp = *p;
407                 if(databuff==(u32 *)TxMessage)  // swap half word
408                         temp = ((temp & 0xffff)<<16) + ((temp & 0xffff0000)>>16);
409                 meiLongwordWrite(MEI_DATA_XFR, temp);
410                 p++;
411         } //    end of "while(..."
412
413 #ifdef AMAZON_DMA_DEBUG_MUTEX
414         restore_flags(flags);   
415 #endif
416         
417         return MEI_SUCCESS;
418
419 } //    end of "meiDMAWrite(..."
420
421 MEI_ERROR meiDMAWrite_16(u32 destaddr, u32 *databuff, u32 databuffsize)
422 {
423         u32 *p = databuff;
424         u32 temp;
425         u32 flags;
426
427         if( destaddr & 3)
428                 return MEI_FAILURE;
429                 
430 #ifdef AMAZON_DMA_DEBUG_MUTEX
431         save_flags(flags);
432         cli();
433 #endif
434                 
435
436         //      Set the write transfer address
437         meiLongwordWrite(MEI_XFR_ADDR, destaddr);
438
439         //      Write the data pushed across DMA
440         while (databuffsize--)
441         {
442                 temp = *p;
443                 temp = ((temp & 0xffff)<<16) + ((temp & 0xffff0000)>>16);//swap half word
444                 meiLongwordWrite(MEI_DATA_XFR, temp);
445                 p++;
446         } //    end of "while(..."
447         
448 #ifdef AMAZON_DMA_DEBUG_MUTEX
449         restore_flags(flags);
450 #endif
451
452         return MEI_SUCCESS;
453
454 } //    end of "meiDMAWrite_16(..."
455
456 MEI_ERROR meiDMAWrite_8(u32 destaddr, u32 *databuff, u32 databuffsize)
457 {
458         u32 *p = databuff;
459         u32 temp;
460         u32 flags;
461
462         if( destaddr & 3)
463                 return MEI_FAILURE;
464                 
465 #ifdef AMAZON_DMA_DEBUG_MUTEX
466         save_flags(flags);
467         cli();
468 #endif
469                 
470
471         //      Set the write transfer address
472         meiLongwordWrite(MEI_XFR_ADDR, destaddr);
473
474         //      Write the data pushed across DMA
475         while (databuffsize--)
476         {
477                 temp = *p;
478                 temp = ((temp & 0xff)<<24) + ((temp & 0xff00)<<8)+ ((temp & 0xff0000)>>8)+ ((temp & 0xff000000)>>24);//swap byte
479                 meiLongwordWrite(MEI_DATA_XFR, temp);
480                 p++;
481         } //    end of "while(..."
482         
483 #ifdef AMAZON_DMA_DEBUG_MUTEX
484         restore_flags(flags);
485 #endif
486
487         return MEI_SUCCESS;
488
489 } //    end of "meiDMAWrite_8(..."
490
491 MEI_ERROR meiDMARead(u32 srcaddr, u32 *databuff, u32 databuffsize)
492 {
493         u32 *p = databuff;
494         u32 temp;
495         u32 flags;
496         
497         if( srcaddr & 3)
498                 return MEI_FAILURE;
499
500 #ifdef AMAZON_DMA_DEBUG_MUTEX
501         save_flags(flags);
502         cli();
503 #endif
504         
505
506         //      Set the read transfer address
507         meiLongwordWrite(MEI_XFR_ADDR, srcaddr);
508
509         //      Read the data popped across DMA
510         while (databuffsize--)
511         {
512                 meiLongwordRead(MEI_DATA_XFR, &temp);
513                 if(databuff==(u32 *)RxMessage)  // swap half word
514                         temp = ((temp & 0xffff)<<16) + ((temp & 0xffff0000)>>16);
515                 *p=temp;
516                 p++;
517         } //    end of "while(..."
518
519 #ifdef AMAZON_DMA_DEBUG_MUTEX
520         restore_flags(flags);
521 #endif
522
523         return MEI_SUCCESS;
524
525 } //    end of "meiDMARead(..."
526
527 MEI_ERROR meiDMARead_16(u32 srcaddr, u32 *databuff, u32 databuffsize)
528 {
529         u32 *p = databuff;
530         u32 temp;
531         u32 flags;
532         
533         if( srcaddr & 3)
534                 return MEI_FAILURE;
535                 
536 #ifdef AMAZON_DMA_DEBUG_MUTEX
537         save_flags(flags);
538         cli();
539 #endif
540                 
541
542         //      Set the read transfer address
543         meiLongwordWrite(MEI_XFR_ADDR, srcaddr);
544
545         //      Read the data popped across DMA
546         while (databuffsize--)
547         {
548                 meiLongwordRead(MEI_DATA_XFR, &temp);
549                 temp = ((temp & 0xffff)<<16) + ((temp & 0xffff0000)>>16);
550                 *p=temp;
551                 p++;
552         } //    end of "while(..."
553         
554 #ifdef AMAZON_DMA_DEBUG_MUTEX
555         restore_flags(flags);
556 #endif
557
558         return MEI_SUCCESS;
559
560 } //    end of "meiDMARead_16(..."
561
562 MEI_ERROR meiDMARead_8(u32 srcaddr, u32 *databuff, u32 databuffsize)
563 {
564         u32 *p = databuff;
565         u32 temp;
566         u32 flags;
567         
568         if( srcaddr & 3)
569                 return MEI_FAILURE;
570                 
571 #ifdef AMAZON_DMA_DEBUG_MUTEX
572         save_flags(flags);
573         cli();
574 #endif
575                 
576
577         //      Set the read transfer address
578         meiLongwordWrite(MEI_XFR_ADDR, srcaddr);
579
580         //      Read the data popped across DMA
581         while (databuffsize--)
582         {
583                 meiLongwordRead(MEI_DATA_XFR, &temp);
584                 temp = ((temp & 0xff)<<24) + ((temp & 0xff00)<<8)+ ((temp & 0xff0000)>>8)+ ((temp & 0xff000000)>>24);//swap byte
585                 *p=temp;
586                 p++;
587         } //    end of "while(..."
588         
589 #ifdef AMAZON_DMA_DEBUG_MUTEX
590         restore_flags(flags);
591 #endif
592
593         return MEI_SUCCESS;
594
595 } //    end of "meiDMARead_8(..."
596
597 void meiPollForDbgDone(void)
598 {
599         u32     query = 0;
600         int     i=0;
601         while (i<WHILE_DELAY)
602         {
603                 meiLongwordRead(ARC_TO_MEI_INT, &query);
604                 query &= (ARC_TO_MEI_DBG_DONE);
605                 if(query)
606                         break;
607                 i++;
608                 if(i==WHILE_DELAY){
609 #ifdef AMAZON_MEI_DEBUG_ON
610                         printk("\n\n PollforDbg fail");
611 #endif
612                 }
613                         DEBUG_ACCESS_DELAY;
614         } 
615         meiLongwordWrite(ARC_TO_MEI_INT,  ARC_TO_MEI_DBG_DONE);  // to clear this interrupt
616 } //    end of "meiPollForDbgDone(..."
617
618 MEI_ERROR meiDebugWrite_8(u32 destaddr, u32 *databuff, u32 databuffsize)
619 {
620         u32 i;
621         u32 temp = 0x0;
622         u32 address = 0x0;
623         u32 *buffer = 0x0;
624         u32 flags;
625         
626 #ifdef AMAZON_DMA_DEBUG_MUTEX
627         save_flags(flags);
628         cli();
629 #endif
630         
631
632         //      Open the debug port before DMP memory write
633         meiLongwordRead(MEI_CONTROL, &temp);
634                 DEBUG_ACCESS_DELAY;     
635         temp |= (HOST_MSTR);
636         meiLongwordWrite(MEI_CONTROL, temp);
637                 DEBUG_ACCESS_DELAY;
638         meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_DMP1_MASK);
639                 DEBUG_ACCESS_DELAY;
640
641         //      For the requested length, write the address and write the data
642         address = destaddr;
643         buffer = databuff;
644         for (i=0; i < databuffsize; i++)
645         {
646                 meiLongwordWrite(MEI_DEBUG_WAD, address);
647                         DEBUG_ACCESS_DELAY;
648                 temp=*buffer;
649                 temp = ((temp & 0xff)<<24) + ((temp & 0xff00)<<8)+ ((temp & 0xff0000)>>8)+ ((temp & 0xff000000)>>24);//swap byte
650                 meiLongwordWrite(MEI_DEBUG_DATA, temp);
651                         DEBUG_ACCESS_DELAY;
652                 meiPollForDbgDone();
653                 address += 4;
654                 buffer++;
655         } //    end of "for(..."
656
657         //      Close the debug port after DMP memory write
658         meiLongwordRead(MEI_CONTROL, &temp);
659                 DEBUG_ACCESS_DELAY;
660         temp &= ~(HOST_MSTR);
661         meiLongwordWrite(MEI_CONTROL, temp);
662                 DEBUG_ACCESS_DELAY;
663                 
664 #ifdef AMAZON_DMA_DEBUG_MUTEX
665         restore_flags(flags);
666 #endif
667
668         //      Return
669         return MEI_SUCCESS;
670
671 } //    end of "meiDebugWrite_8(..."
672
673 MEI_ERROR meiDebugRead_8(u32 srcaddr, u32 *databuff, u32 databuffsize)
674 {
675         u32 i;
676         u32 temp = 0x0;
677         u32 address = 0x0;
678         u32 *buffer = 0x0;
679         u32 flags;
680         
681 #ifdef AMAZON_DMA_DEBUG_MUTEX
682         save_flags(flags);
683         cli();
684 #endif
685         
686
687         //      Open the debug port before DMP memory read
688         meiLongwordRead(MEI_CONTROL, &temp);
689                 DEBUG_ACCESS_DELAY;
690         temp |= (HOST_MSTR);
691         meiLongwordWrite(MEI_CONTROL, temp);
692                 DEBUG_ACCESS_DELAY;
693         meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_DMP2_MASK);
694                 DEBUG_ACCESS_DELAY;
695
696         //      For the requested length, write the address and read the data
697         address = srcaddr;
698         buffer = databuff;
699         for (i=0; i<databuffsize; i++)
700         {
701                 meiLongwordWrite(MEI_DEBUG_RAD, address);
702                         DEBUG_ACCESS_DELAY;
703                 meiPollForDbgDone();
704                 meiLongwordRead(MEI_DEBUG_DATA, &temp);
705                         DEBUG_ACCESS_DELAY;
706                 temp = ((temp & 0xff)<<24) + ((temp & 0xff00)<<8)+ ((temp & 0xff0000)>>8)+ ((temp & 0xff000000)>>24);//swap byte
707                 *buffer=temp;
708                 address += 4;
709                 buffer++;
710         } //    end of "for(..."
711
712         //      Close the debug port after DMP memory read
713         meiLongwordRead(MEI_CONTROL, &temp);
714                 DEBUG_ACCESS_DELAY;
715         temp &= ~(HOST_MSTR);
716         meiLongwordWrite(MEI_CONTROL, temp);
717                 DEBUG_ACCESS_DELAY;
718                 
719 #ifdef AMAZON_DMA_DEBUG_MUTEX
720         restore_flags(flags);
721 #endif
722
723         //      Return
724         return MEI_SUCCESS;
725
726 } //    end of "meiDebugRead_8(..."
727
728 MEI_ERROR meiDebugWrite_16(u32 destaddr, u32 *databuff, u32 databuffsize)
729 {
730         u32 i;
731         u32 temp = 0x0;
732         u32 address = 0x0;
733         u32 *buffer = 0x0;
734         u32 flags;
735         
736 #ifdef AMAZON_DMA_DEBUG_MUTEX
737         save_flags(flags);
738         cli();
739 #endif
740         
741
742         //      Open the debug port before DMP memory write
743         meiLongwordRead(MEI_CONTROL, &temp);
744                 DEBUG_ACCESS_DELAY;
745         temp |= (HOST_MSTR);
746         meiLongwordWrite(MEI_CONTROL, temp);
747                 DEBUG_ACCESS_DELAY;
748         meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_DMP1_MASK);
749                 DEBUG_ACCESS_DELAY;
750
751         //      For the requested length, write the address and write the data
752         address = destaddr;
753         buffer = databuff;
754         for (i=0; i < databuffsize; i++)
755         {
756                 meiLongwordWrite(MEI_DEBUG_WAD, address);
757                         DEBUG_ACCESS_DELAY;
758                 temp=*buffer;
759                 temp = ((temp & 0xffff)<<16) + ((temp & 0xffff0000)>>16);//swap half word
760                 meiLongwordWrite(MEI_DEBUG_DATA, temp);
761                         DEBUG_ACCESS_DELAY;
762                 meiPollForDbgDone();
763                 address += 4;
764                 buffer++;
765         } //    end of "for(..."
766
767         //      Close the debug port after DMP memory write
768         meiLongwordRead(MEI_CONTROL, &temp);
769                 DEBUG_ACCESS_DELAY;
770         temp &= ~(HOST_MSTR);
771         meiLongwordWrite(MEI_CONTROL, temp);
772                 DEBUG_ACCESS_DELAY;
773                 
774 #ifdef AMAZON_DMA_DEBUG_MUTEX
775         restore_flags(flags);
776 #endif
777
778         //      Return
779         return MEI_SUCCESS;
780
781 } //    end of "meiDebugWrite_16(..."
782
783 MEI_ERROR meiDebugRead_16(u32 srcaddr, u32 *databuff, u32 databuffsize)
784 {
785         u32 i;
786         u32 temp = 0x0;
787         u32 address = 0x0;
788         u32 *buffer = 0x0;
789         u32 flags;
790         
791 #ifdef AMAZON_DMA_DEBUG_MUTEX
792         save_flags(flags);
793         cli();
794 #endif
795         
796
797         //      Open the debug port before DMP memory read
798         meiLongwordRead(MEI_CONTROL, &temp);
799                 DEBUG_ACCESS_DELAY;
800         temp |= (HOST_MSTR);
801         meiLongwordWrite(MEI_CONTROL, temp);
802                 DEBUG_ACCESS_DELAY;
803         meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_DMP2_MASK);
804                 DEBUG_ACCESS_DELAY;
805
806         //      For the requested length, write the address and read the data
807         address = srcaddr;
808         buffer = databuff;
809         for (i=0; i<databuffsize; i++)
810         {
811                 meiLongwordWrite(MEI_DEBUG_RAD, address);
812                         DEBUG_ACCESS_DELAY;
813                 meiPollForDbgDone();
814                 meiLongwordRead(MEI_DEBUG_DATA, &temp);
815                         DEBUG_ACCESS_DELAY;
816                 temp = ((temp & 0xffff)<<16) + ((temp & 0xffff0000)>>16);//swap half word
817                 *buffer=temp;
818                 address += 4;
819                 buffer++;
820         } //    end of "for(..."
821
822         //      Close the debug port after DMP memory read
823         meiLongwordRead(MEI_CONTROL, &temp);
824                 DEBUG_ACCESS_DELAY;
825         temp &= ~(HOST_MSTR);
826         meiLongwordWrite(MEI_CONTROL, temp);
827                 DEBUG_ACCESS_DELAY;
828                 
829 #ifdef AMAZON_DMA_DEBUG_MUTEX
830         restore_flags(flags);
831 #endif
832
833         //      Return
834         return MEI_SUCCESS;
835
836 } //    end of "meiDebugRead_16(..."
837
838 MEI_ERROR meiDebugWrite(u32 destaddr, u32 *databuff, u32 databuffsize)
839 {
840         u32 i;
841         u32 temp = 0x0;
842         u32 address = 0x0;
843         u32 *buffer = 0x0;
844         u32 flags;
845         
846 #ifdef AMAZON_DMA_DEBUG_MUTEX
847         save_flags(flags);
848         cli();
849 #endif
850         
851
852         //      Open the debug port before DMP memory write
853         meiLongwordRead(MEI_CONTROL, &temp);
854                 DEBUG_ACCESS_DELAY;
855         temp |= (HOST_MSTR);
856         meiLongwordWrite(MEI_CONTROL, temp);
857                 DEBUG_ACCESS_DELAY;
858         meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_DMP1_MASK);
859                 DEBUG_ACCESS_DELAY;
860
861         //      For the requested length, write the address and write the data
862         address = destaddr;
863         buffer = databuff;
864         for (i=0; i < databuffsize; i++)
865         {
866                 meiLongwordWrite(MEI_DEBUG_WAD, address);
867                         DEBUG_ACCESS_DELAY;
868                 temp=*buffer;
869                 meiLongwordWrite(MEI_DEBUG_DATA, temp);
870                         DEBUG_ACCESS_DELAY;
871                 meiPollForDbgDone();
872                 address += 4;
873                 buffer++;
874         } //    end of "for(..."
875
876         //      Close the debug port after DMP memory write
877         meiLongwordRead(MEI_CONTROL, &temp);
878                 DEBUG_ACCESS_DELAY;
879         temp &= ~(HOST_MSTR);
880         meiLongwordWrite(MEI_CONTROL, temp);
881                 DEBUG_ACCESS_DELAY;
882
883 #ifdef AMAZON_DMA_DEBUG_MUTEX
884         restore_flags(flags);
885 #endif
886
887         //      Return
888         return MEI_SUCCESS;
889
890 } //    end of "meiDebugWrite(..."
891
892 MEI_ERROR meiDebugRead(u32 srcaddr, u32 *databuff, u32 databuffsize)
893 {
894         u32 i;
895         u32 temp = 0x0;
896         u32 address = 0x0;
897         u32 *buffer = 0x0;
898         u32 flags;
899         
900 #ifdef AMAZON_DMA_DEBUG_MUTEX
901         save_flags(flags);
902         cli();
903 #endif
904         
905
906         //      Open the debug port before DMP memory read
907         meiLongwordRead(MEI_CONTROL, &temp);
908                 DEBUG_ACCESS_DELAY;
909         temp |= (HOST_MSTR);
910         meiLongwordWrite(MEI_CONTROL, temp);
911                 DEBUG_ACCESS_DELAY;
912         meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_DMP2_MASK);
913                 DEBUG_ACCESS_DELAY;
914
915         //      For the requested length, write the address and read the data
916         address = srcaddr;
917         buffer = databuff;
918         for (i=0; i<databuffsize; i++)
919         {
920                 meiLongwordWrite(MEI_DEBUG_RAD, address);
921                         DEBUG_ACCESS_DELAY;
922                 meiPollForDbgDone();
923                 meiLongwordRead(MEI_DEBUG_DATA, &temp);
924                         DEBUG_ACCESS_DELAY;
925                 *buffer=temp;
926                 address += 4;
927                 buffer++;
928         } //    end of "for(..."
929
930         //      Close the debug port after DMP memory read
931         meiLongwordRead(MEI_CONTROL, &temp);
932                 DEBUG_ACCESS_DELAY;
933         temp &= ~(HOST_MSTR);
934         meiLongwordWrite(MEI_CONTROL, temp);
935                 DEBUG_ACCESS_DELAY;
936                 
937 #ifdef AMAZON_DMA_DEBUG_MUTEX
938         restore_flags(flags);
939 #endif
940
941         //      Return
942         return MEI_SUCCESS;
943
944 } //    end of "meiDebugRead(..."
945 EXPORT_SYMBOL(meiDebugRead);
946
947 void meiMailboxInterruptsDisable(void)
948 {
949         meiLongwordWrite(ARC_TO_MEI_INT_MASK, 0x0);
950 } //    end of "meiMailboxInterruptsDisable(..."
951
952 void meiMailboxInterruptsEnable(void)
953 {
954         meiLongwordWrite(ARC_TO_MEI_INT_MASK, MSGAV_EN); 
955 } //    end of "meiMailboxInterruptsEnable(..."
956
957 MEI_ERROR meiMailboxWrite(u16 *msgsrcbuffer, u16 msgsize)
958 {
959         int i;
960         u32 arc_mailbox_status = 0x0;
961         u32 temp=0;
962         MEI_ERROR meiMailboxError = MEI_SUCCESS;
963
964         //      Check arc if mailbox write can be initiated
965 /*      meiLongwordRead(MEI_TO_ARC_INT, &arc_mailbox_status);
966         if ((arc_mailbox_status & MEI_TO_ARC_MSGAV))
967         {
968                 return MEI_MAILBOX_FULL;
969         }
970 */
971         //      Write to mailbox
972         meiMailboxError = meiDMAWrite(MEI_TO_ARC_MAILBOX, (u32*)msgsrcbuffer, msgsize/2);
973         meiMailboxError = meiDMAWrite(MEI_TO_ARC_MAILBOXR, (u32 *)(&temp), 1); 
974
975         //      Notify arc that mailbox write completed
976         cmv_waiting=1;
977         meiLongwordWrite(MEI_TO_ARC_INT, MEI_TO_ARC_MSGAV);
978         
979         i=0;
980         while(i<WHILE_DELAY){ // wait for ARC to clear the bit
981                 meiLongwordRead(MEI_TO_ARC_INT, &arc_mailbox_status);
982                 if((arc_mailbox_status & MEI_TO_ARC_MSGAV) != MEI_TO_ARC_MSGAV)
983                         break;
984                 i++;
985                 if(i==WHILE_DELAY){
986 #ifdef AMAZON_MEI_DEBUG_ON
987                         printk("\n\n MEI_TO_ARC_MSGAV not cleared by ARC");
988 #endif
989                         meiMailboxError = MEI_FAILURE;
990 #if 0                   
991                         for(i=0;i<msgsize;i++)
992                                 printk("\n %8x", (*(msgsrcbuffer+i)));
993 #endif
994                 }       
995         }      
996                 
997         //      Return
998         return meiMailboxError;
999
1000 } //    end of "meiMailboxWrite(..."
1001
1002 MEI_ERROR meiMailboxRead(u16 *msgdestbuffer, u16 msgsize)
1003 {
1004         //u32 arc_mailbox_status = 0x0;
1005         //u32 *mei_arc_msgbuff = 0x0;
1006         MEI_ERROR meiMailboxError = MEI_SUCCESS;
1007
1008             /*
1009             //  Check arc if mailbox read can be initiated
1010         meiLongwordRead(ARC_TO_MEI_INT, &arc_mailbox_status);
1011         if ((arc_mailbox_status & ARC_TO_MEI_MSGAV) == 0)
1012         {
1013                 return MEI_MAILBOX_EMPTY;
1014         } //    end of "if(..."
1015             */
1016             
1017         //      Read from mailbox
1018         meiMailboxError = meiDMARead(ARC_TO_MEI_MAILBOX, (u32*)msgdestbuffer, msgsize/2);
1019
1020         //      Notify arc that mailbox read completed
1021         meiLongwordWrite(ARC_TO_MEI_INT, ARC_TO_MEI_MSGAV);
1022
1023         //      Return
1024         return meiMailboxError;
1025
1026 } //    end of "meiMailboxRead(..."
1027
1028 MEI_ERROR meiHaltArc(void)
1029 {
1030         u32 arc_control_mode = 0x0;
1031         u32 arc_debug_addr = 0x5;
1032         u32 arc_debug_data = 0x0;
1033
1034         //      Switch arc control from JTAG mode to MEI mode- write '1' to bit0
1035         meiLongwordRead(MEI_CONTROL, &arc_control_mode);
1036         arc_control_mode |= (HOST_MSTR);
1037         meiLongwordWrite(MEI_CONTROL, arc_control_mode);
1038
1039         //      Write arc aux reg access mask (0x0) into debug addr decode reg
1040         meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_AUX_MASK);
1041
1042         //      Write arc debug reg addr (0x5) into debug read addr reg
1043         meiLongwordWrite(MEI_DEBUG_RAD, arc_debug_addr);
1044         meiPollForDbgDone();
1045
1046         //      Read debug data reg and save content
1047         meiLongwordRead(MEI_DEBUG_DATA, &arc_debug_data);
1048
1049         //      Write arc debug reg addr (0x5) into debug write addr reg
1050         meiLongwordWrite(MEI_DEBUG_WAD, arc_debug_addr);
1051
1052         //      Write debug data reg with content ORd with 0x2 (halt bit set)
1053         arc_debug_data |= (BIT1);
1054         meiLongwordWrite(MEI_DEBUG_DATA, arc_debug_data);
1055         meiPollForDbgDone();
1056
1057         //      Switch arc control from MEI mode to JTAG mode- write '0' to bit0
1058         meiLongwordRead(MEI_CONTROL, &arc_control_mode);
1059         arc_control_mode &= ~(HOST_MSTR);
1060         meiLongwordWrite(MEI_CONTROL, arc_control_mode);
1061
1062         //      Return
1063         return MEI_SUCCESS;
1064
1065 } //    end of "meiHalt(..."
1066
1067 MEI_ERROR meiDownloadBootCode(void)
1068 {
1069         u32 arc_control_mode;
1070         u32 boot_loop;
1071         u32 page_size;
1072         u32 dest_addr;
1073
1074         u32 arc_debug_addr = 0x31F00;
1075         u32 arc_debug_data = 0x10;
1076         u32 temp;
1077 //      int i;
1078
1079         //MEI_ERROR meiDMAError = MEI_SUCCESS;
1080
1081         //      Disable mask for arc codeswap interrupts
1082         meiMailboxInterruptsDisable();
1083
1084         //      Switch arc control from JTAG mode to MEI mode- write '1' to bit0
1085         meiLongwordRead(MEI_CONTROL, &arc_control_mode);
1086         arc_control_mode |= (HOST_MSTR);
1087         meiLongwordWrite(MEI_CONTROL, arc_control_mode);
1088
1089         //      Write (0x10) to CRI_CCR0(0x31F00) to enable ac_clk signal       
1090         meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_DMP1_MASK);
1091         meiLongwordWrite(MEI_DEBUG_RAD, arc_debug_addr);
1092         meiPollForDbgDone();
1093         meiLongwordRead(MEI_DEBUG_DATA, &temp);
1094         temp |=arc_debug_data;
1095         
1096         meiLongwordWrite(MEI_DEBUG_WAD, arc_debug_addr);
1097         meiLongwordWrite(MEI_DEBUG_DATA, temp);
1098         meiPollForDbgDone();
1099             //meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_AUX_MASK);
1100
1101         //      Switch arc control from MEI mode to JTAG mode- write '0' to bit0
1102         meiLongwordRead(MEI_CONTROL, &arc_control_mode);
1103         arc_control_mode &= ~(HOST_MSTR);
1104         meiLongwordWrite(MEI_CONTROL, arc_control_mode);
1105         
1106 #ifdef  AMAZON_MEI_DEBUG_ON   //to test ac_clk setting correctness
1107         meiLongwordRead(MEI_CONTROL, &arc_control_mode);
1108         arc_control_mode |= (HOST_MSTR);
1109         meiLongwordWrite(MEI_CONTROL, arc_control_mode);
1110         
1111         meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_DMP1_MASK);
1112         meiLongwordWrite(MEI_DEBUG_RAD, arc_debug_addr);
1113         meiPollForDbgDone();
1114         meiLongwordRead(MEI_DEBUG_DATA, &arc_debug_data);
1115
1116         meiLongwordRead(MEI_CONTROL, &arc_control_mode);
1117         arc_control_mode &= ~(HOST_MSTR);
1118         meiLongwordWrite(MEI_CONTROL, arc_control_mode);
1119         
1120 //      printk("\n\n ac_clk is %8x\n", arc_debug_data);
1121 #endif
1122
1123         /*
1124         **      DMA the boot code page(s)
1125         */
1126 #ifdef AMAZON_MEI_DEBUG_ON
1127 //      printk("\n\n start download pages");
1128 #endif
1129         for( boot_loop = 0; boot_loop < img_hdr->count; boot_loop++)
1130         {
1131                 if( img_hdr->page[boot_loop].p_size & BOOT_FLAG)
1132                 {
1133                         page_size = meiGetPage( boot_loop, GET_PROG, MAXSWAPSIZE, mei_arc_swap_buff, &dest_addr);
1134                         if( page_size > 0)
1135                         {
1136                                 meiDMAWrite(dest_addr, mei_arc_swap_buff, page_size);
1137                         }
1138                 }
1139                 if( img_hdr->page[boot_loop].d_size & BOOT_FLAG)
1140                 {
1141                         page_size = meiGetPage( boot_loop, GET_DATA, MAXSWAPSIZE, mei_arc_swap_buff, &dest_addr);
1142                         if( page_size > 0)
1143                         {
1144                                 meiDMAWrite( dest_addr, mei_arc_swap_buff, page_size);
1145                         }
1146                 }
1147         }
1148 #ifdef AMAZON_MEI_DEBUG_ON
1149 //      printk("\n\n pages downloaded");
1150 #endif
1151         return MEI_SUCCESS;
1152
1153 } //    end of "meiDownloadBootCode(..."
1154
1155 MEI_ERROR meiRunArc(void)
1156 {
1157         u32 arc_control_mode = 0x0;
1158         u32 arc_debug_addr = 0x0;
1159         u32 arc_debug_data = 0x0;
1160
1161         //      Switch arc control from JTAG mode to MEI mode- write '1' to bit0
1162         meiLongwordRead(MEI_CONTROL, &arc_control_mode);
1163         arc_control_mode |= (HOST_MSTR);
1164         meiLongwordWrite(MEI_CONTROL, arc_control_mode);
1165
1166         //      Write arc aux reg access mask (0x0) into debug addr decode reg
1167         meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_AUX_MASK);
1168
1169         //      Write arc status aux reg addr (0x0) into debug read addr reg
1170         meiLongwordWrite(MEI_DEBUG_RAD, arc_debug_addr);
1171         meiPollForDbgDone();
1172
1173         //      Read debug data reg and save content
1174         meiLongwordRead(MEI_DEBUG_DATA, &arc_debug_data);
1175
1176         //      Write arc status aux reg addr (0x0) into debug write addr reg
1177         meiLongwordWrite(MEI_DEBUG_WAD, arc_debug_addr);
1178
1179         //      Write debug data reg with content ANDd with 0xFDFFFFFF (halt bit cleared)
1180         arc_debug_data &= ~(BIT25);
1181         meiLongwordWrite(MEI_DEBUG_DATA, arc_debug_data);
1182         meiPollForDbgDone();
1183
1184         //      Switch arc control from MEI mode to JTAG mode- write '0' to bit0
1185         meiLongwordRead(MEI_CONTROL, &arc_control_mode);
1186         arc_control_mode &= ~(HOST_MSTR);
1187         meiLongwordWrite(MEI_CONTROL, arc_control_mode);
1188
1189         //      Enable mask for arc codeswap interrupts
1190         meiMailboxInterruptsEnable();
1191
1192         //      Return
1193         return MEI_SUCCESS;
1194
1195 } //    end of "meiActivate(..."
1196
1197 int meiGetPage( u32 Page, u32 data, u32 MaxSize, u32 *Buffer, u32 *Dest)
1198 {
1199         u32     size;
1200         u32     i;
1201         u32     *p;
1202
1203         if( Page > img_hdr->count)
1204                 return -2;
1205
1206         /*
1207         **      Get program or data size, depending on "data" flag
1208         */
1209         size = (data == GET_DATA) ? img_hdr->page[ Page].d_size : img_hdr->page[ Page].p_size;
1210
1211         size &= BOOT_FLAG_MASK;         //      Clear boot bit!
1212         if( size > MaxSize)
1213                 return -1;
1214
1215         if( size == 0)
1216                 return 0;
1217         /*
1218         **      Get program or data offset, depending on "data" flag
1219         */
1220         i = data ? img_hdr->page[ Page].d_offset : img_hdr->page[ Page].p_offset;
1221
1222         /*
1223         **      Copy data/program to buffer
1224         */
1225
1226         i /= 4; //      Adjust offset for byte-to-UINT for array operation
1227
1228         p = (u32 *)img_hdr + i;
1229         for(i = 0; i < size; i++)
1230                 Buffer[i] = *p++;
1231         /*
1232         **      Pass back data/program destination address
1233         */
1234         *Dest = data ? img_hdr->page[Page].d_dest : img_hdr->page[Page].p_dest;
1235
1236         return size;
1237 }
1238
1239 MEI_ERROR meiCMV(u16 * request, int reply)            // write cmv to arc, if reply needed, wait for reply
1240 {
1241         MEI_ERROR meierror;
1242         wait_queue_t wait;
1243         
1244         cmv_reply=reply;
1245         
1246         meierror = meiMailboxWrite(request, MSG_LENGTH);
1247         
1248         if(meierror != MEI_SUCCESS){
1249 #ifdef AMAZON_MEI_DEBUG_ON
1250                 printk("\n\n MailboxWrite Fail.");
1251 #endif
1252                 return meierror;
1253         }
1254         else{
1255                 cmv_count++;
1256         }
1257
1258         if(cmv_reply == NO_REPLY)
1259                 return MEI_SUCCESS;
1260
1261         init_waitqueue_entry(&wait, current);
1262         add_wait_queue(&wait_queue_arcmsgav, &wait);
1263         set_current_state(TASK_INTERRUPTIBLE);
1264 //      cmv_waiting=1;
1265         
1266         if(arcmsgav==1){
1267                 set_current_state(TASK_RUNNING);
1268                 remove_wait_queue(&wait_queue_arcmsgav, &wait);
1269         }
1270         else{
1271                 schedule_timeout(CMV_TIMEOUT);
1272                 remove_wait_queue(&wait_queue_arcmsgav, &wait);
1273         }
1274         if(arcmsgav==0){//CMV_timeout
1275                 cmv_waiting=0;
1276                 arcmsgav=0;
1277 #ifdef AMAZON_MEI_DEBUG_ON
1278                 printk("\nmeiCMV: MEI_MAILBOX_TIMEOUT\n");
1279 #endif
1280                 return MEI_MAILBOX_TIMEOUT;     
1281         }
1282         else{
1283                 arcmsgav=0;
1284                 reply_count++;
1285                 return MEI_SUCCESS;
1286         }
1287 }
1288
1289 //TODO, for loopback test
1290 #ifdef DFE_LOOPBACK
1291 #define mte_reg_base                    (0x4800*4+0x20000)
1292  
1293 /* Iridia Registers Address Constants */
1294 #define MTE_Reg(r)                              (int)(mte_reg_base + (r*4))
1295  
1296 #define IT_AMODE                                MTE_Reg(0x0004)
1297
1298
1299 #define OMBOX_BASE 0x15F80
1300 #define IMBOX_BASE 0x15FC0
1301
1302 #define TIMER_DELAY   (1024)
1303 #define BC0_BYTES     (32)
1304 #define BC1_BYTES     (30)
1305 #define NUM_MB        (12)
1306 #define TIMEOUT_VALUE 2000
1307
1308 void BFMWait (u32 cycle) {
1309   u32 i;
1310   for (i = 0 ; i< cycle ; i++); 
1311 }
1312
1313 void WriteRegLong(u32 addr, u32 data){
1314   //printk("[%8x] <= %8x \n\n", addr, data);
1315   *((volatile u32 *)(addr)) =  data; 
1316 }
1317
1318 u32 ReadRegLong (u32 addr) {
1319   u32   rd_val;
1320   
1321   rd_val = *((volatile u32 *)(addr));
1322   //printk("[%8x] => %8x \n\n", addr, rd_val);
1323   return rd_val;
1324
1325 }
1326
1327 /* This routine writes the mailbox with the data in an input array */
1328 void WriteMbox(u32 *mboxarray,u32 size) {
1329   u32 i;
1330   
1331   WriteRegLong(MEI_XFR_ADDR,IMBOX_BASE);
1332   for (i=0;i<size;i++) {
1333     WriteRegLong(MEI_DATA_XFR,*(mboxarray+i));
1334   }
1335 }
1336
1337 /* This routine reads the output mailbox and places the results into an array */
1338 void ReadMbox(u32 *mboxarray,u32 size) {
1339   u32 i;
1340   
1341   WriteRegLong(MEI_XFR_ADDR,OMBOX_BASE);
1342   for (i=0;i<size;i++) {
1343     mboxarray[i] = ReadRegLong(MEI_DATA_XFR);
1344   }
1345 }
1346
1347 void MEIWriteARCValue(u32 address, u32 value)
1348 {
1349   u32 i,check = 0;
1350   /* Write address register */
1351   *((volatile u32 *)MEI_DEBUG_WAD) =  address;
1352
1353   /* Write data register */
1354   *((volatile u32 *)MEI_DEBUG_DATA) =  value;
1355
1356   /* wait until complete - timeout at 40*/
1357   for (i=0;i<40;i++) {
1358     check = *((volatile u32 *)ARC_TO_MEI_INT);
1359     if ((check & 0x20)) break;
1360     //printk("MEIWriteARCValue: check:%8x\n\n", check);
1361     }
1362
1363   /* clear the flag */
1364   *((volatile u32 *)ARC_TO_MEI_INT)  = 0x20;
1365
1366 }
1367
1368
1369 void post_mei_init(void)
1370 {
1371 u32 mailbox[NUM_MB];
1372
1373   mailbox[0] = TIMER_DELAY;
1374  
1375   /* set bytes per bearer channel */
1376   mailbox[1] = BC0_BYTES;
1377   mailbox[2] = BC1_BYTES;
1378   WriteMbox(mailbox, 3);
1379
1380   WriteRegLong(AAI_ACCESS, 0x00000001);
1381
1382   /* enable ADSL block clock, ac_clk */
1383   WriteRegLong(MEI_CONTROL, 0x01);
1384   WriteRegLong(MEI_DEBUG_DEC, 0x00000001); // select ld/st space
1385   MEIWriteARCValue(0x31F00,   0x00000010); // write CRI_CCR0 to enable ac_clk
1386
1387   /* set the MTE to register start */
1388   MEIWriteARCValue(IT_AMODE, 0xF);
1389   BFMWait(10); 
1390 }
1391
1392
1393 int wait_sync(void)
1394 {
1395 u32 mailbox[NUM_MB];
1396   /* wait for ATM sync to be achieved on both BC0 and BC1 */
1397   u32 timeout=0;
1398   ReadMbox(mailbox, 1);
1399   u32 readval = mailbox[0];
1400   while( ((readval & 0xFFFFFFFF) == 0) && (timeout < TIMEOUT_VALUE) ) {
1401     BFMWait(1);
1402     //printk("wait_sync\n\n");
1403     ReadMbox(mailbox, 1);
1404     readval = mailbox[0];
1405     timeout++;
1406   }
1407   if(timeout == TIMEOUT_VALUE)return 0;
1408   else return 1;
1409 }
1410 #endif //DFE_LOOPBACK
1411 //end of TODO, for loopback test
1412
1413 MEI_ERROR meiForceRebootAdslModem(void)
1414 {
1415 #if 0
1416 //#ifdef        ARC_READY_ACK
1417                 if(down_interruptible(&mei_sema))       //disable CMV access until ARC ready
1418                 {
1419                         return -ERESTARTSYS;
1420                 }
1421 #endif
1422         if(reboot_firsttime==1){//000002:fchang Start
1423                 // reset ARC
1424                 *((volatile u32 *)0xB0100910) = 0x80;   //reset DFE
1425                 asm("SYNC");
1426                 *((volatile u32 *)0xB0100910) = 0x0;
1427                 asm("SYNC");
1428                 if((*((volatile u32 *)0xB0100910))!=0x0)
1429 #ifdef AMAZON_MEI_DEBUG_ON
1430                         printk("\n reset DFE fail");
1431 #endif
1432                 
1433                 // reset ARC
1434                 meiLongwordWrite(MEI_CONTROL, SOFT_RESET);
1435                 asm("SYNC");
1436                 meiLongwordWrite(MEI_CONTROL, 0);
1437                 asm("SYNC");    
1438
1439         }       //000002:fchang End             
1440 #ifdef DFE_LOOPBACK
1441                 img_hdr=(ARC_IMG_HDR *)lp_image;
1442 #else
1443                 img_hdr=(ARC_IMG_HDR *)image_buffer;
1444 #endif          
1445 //              printk("\n\n enter haltarc");
1446                 meiHaltArc();
1447 //              printk("\n\n haltarc done");
1448 //000002:fchang Start
1449         if(reboot_firsttime==0){
1450                 printk("\n\n new reboot");
1451                 meiResetArc();
1452                 meiResetCore();
1453         }
1454         if(reboot_firsttime==1)
1455                 meiDownloadBootCode();
1456         else
1457                 mei_ioctl((struct inode *)NULL, (struct file *)NULL, AMAZON_MEI_DOWNLOAD, (unsigned long)NULL);
1458
1459 //000002:fchang End
1460 #ifdef AMAZON_MEI_DEBUG_ON
1461 //              printk("\n\n Download Done");
1462 #endif
1463
1464 #ifdef  DFE_LOOPBACK
1465                 post_mei_init();
1466 #endif          
1467
1468 //              sema_init(&mei_sema, 1);
1469                 //up(&mei_sema);
1470
1471 //              enable_irq(AMAZON_MEI_INT);
1472                                         
1473                 meiRunArc();
1474 //000002:fchang Start           
1475         if(reboot_firsttime==0){
1476                 meiEnalbeMailboxInt();
1477         }               
1478 //000002:fchang End
1479                 
1480 #ifdef AMAZON_MEI_DEBUG_ON
1481 //              printk("\n\n ARC Running");
1482 #endif
1483                 
1484 #ifdef  AMAZON_MEI_DEBUG_ON   //to test ac_clk setting correctness
1485         {
1486         u32 arc_control_mode;
1487         u32 arc_debug_addr = 0x31F00;
1488         u32 arc_debug_data = 0x10;
1489         meiLongwordRead(MEI_CONTROL, &arc_control_mode);
1490         arc_control_mode |= (HOST_MSTR);
1491         meiLongwordWrite(MEI_CONTROL, arc_control_mode);
1492         
1493         meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_DMP1_MASK);
1494         meiLongwordWrite(MEI_DEBUG_RAD, arc_debug_addr);
1495         meiPollForDbgDone();
1496         meiLongwordRead(MEI_DEBUG_DATA, &arc_debug_data);
1497
1498         meiLongwordRead(MEI_CONTROL, &arc_control_mode);
1499         arc_control_mode &= ~(HOST_MSTR);
1500         meiLongwordWrite(MEI_CONTROL, arc_control_mode);
1501         
1502 //      printk("\n\n ac_clk is %8x\n", arc_debug_data);
1503         }
1504 #endif          
1505                         
1506                 
1507 #ifdef DFE_LOOPBACK
1508                 if (wait_sync() == 0){
1509                         printk("ARC fails to run: time out\n\n");
1510                 }else{
1511 //                      printk("ARC is ready\n\n");
1512                 }
1513 #endif          
1514                 if(reboot_firsttime==1) //000002:fchang
1515                         reboot_firsttime=0;     //000002:fchang
1516                 
1517                 return MEI_SUCCESS;
1518 }
1519
1520 ////////////////////            procfs debug            ////////////////////////////////////////////////////////
1521 #define MEI_DIRNAME     "mei"
1522 static struct proc_dir_entry *meidir;
1523
1524 static ssize_t proc_write(struct file *, const char *, size_t, loff_t *);
1525 static ssize_t proc_read(struct file *, char *, size_t, loff_t *);
1526
1527 static struct file_operations proc_operations = {
1528         read:   proc_read,
1529         write:  proc_write,
1530 };
1531
1532 typedef struct reg_entry {
1533         int * flag;
1534         char name[30];          // big enough to hold names
1535         char description[100];      // big enough to hold description
1536         unsigned short low_ino;
1537 } reg_entry_t;
1538
1539 static reg_entry_t regs[PROC_ITEMS];       // total items to be monitored by /proc/mei
1540
1541 #define NUM_OF_REG_ENTRY        (sizeof(regs)/sizeof(reg_entry_t))
1542
1543 static int proc_read(struct file * file, char * buf, size_t nbytes, loff_t *ppos)
1544 {
1545         int i_ino = (file->f_dentry->d_inode)->i_ino;
1546         char outputbuf[64];
1547         int count=0;
1548         int i;
1549         u32 version=0;
1550         reg_entry_t* current_reg=NULL;
1551         
1552         for (i=0;i<NUM_OF_REG_ENTRY;i++) {
1553                 if (regs[i].low_ino==i_ino) {
1554                         current_reg = &regs[i];
1555                         break;
1556                 }
1557         }
1558         if (current_reg==NULL)
1559                 return -EINVAL;
1560         
1561         if (current_reg->flag == (int *) 8){
1562         ///proc/mei/version
1563         //format:
1564         //Firmware version: major.minor.sub_version.int_version.rel_state.spl_appl
1565         //Firmware Date Time Code: date/month min:hour
1566                 if (*ppos>0) /* Assume reading completed in previous read*/
1567                         return 0;               // indicates end of file
1568                 if(down_interruptible(&mei_sema))
1569                         return -ERESTARTSYS;
1570                 
1571                 //if (indicator_count != 1){
1572                 if (indicator_count < 1){
1573                         up(&mei_sema);
1574                         return -EAGAIN;
1575                 }
1576                 //major:bits 0-7 
1577                 //minor:bits 8-15
1578                 makeCMV(H2D_CMV_READ, INFO, 54, 0, 1, NULL);
1579                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
1580 #if 0
1581 #ifdef AMAZON_MEI_DEBUG_ON
1582                         printk("\n\n WINHOST CMV fail");
1583 #endif  
1584 #endif
1585                         up(&mei_sema);
1586                         return -EIO;
1587                 }
1588                 version = RxMessage[4];
1589                 count = sprintf(outputbuf, "%d.%d.",(version)&0xff,(version>>8)&0xff);
1590                 
1591                 //sub_version:bits 4-7
1592                 //int_version:bits 0-3
1593                 //spl_appl:bits 8-13
1594                 //rel_state:bits 14-15
1595                 makeCMV(H2D_CMV_READ, INFO, 54, 1, 1, NULL);
1596                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
1597 #if 0
1598 #ifdef AMAZON_MEI_DEBUG_ON
1599                         printk("\n\n WINHOST CMV fail");        
1600 #endif
1601 #endif
1602                         up(&mei_sema);
1603                         return -EFAULT;
1604                 }
1605                 version =RxMessage[4];
1606                 count += sprintf(outputbuf+count, "%d.%d.%d.%d",
1607                                 (version>>4)&0xf, 
1608                                 version&0xf,
1609                                 (version>>14)&0x3, 
1610                                 (version>>8)&0x3f);     
1611 #ifdef ADSL_LED_SUPPORT                         
1612 // version check -start for adsl led                    
1613                 if ((((version>>4)&0xf)==2)&&((version&0xf)>=3)&&((version&0xf)<7)) firmware_support_led=1;
1614                 else if ((((version>>4)&0xf)==2)&&((version&0xf)>=7)) firmware_support_led=2;
1615                 else if (((version>>4)&0xf)>2) firmware_support_led=2;
1616
1617 //165001:henryhsu:20050906:Modify for adsl firmware version 1.2.1.2.0.1 DATA_LED can't flash.
1618         //else firmware_support_led=0;
1619         else firmware_support_led=2;
1620 //165001                
1621
1622
1623 // version check -end   
1624 #endif  
1625                 //Date:bits 0-7
1626                 //Month:bits 8-15
1627                 makeCMV(H2D_CMV_READ, INFO, 55, 0, 1, NULL);
1628                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
1629 #if 0
1630 #ifdef AMAZON_MEI_DEBUG_ON
1631                         printk("\n\n WINHOST CMV fail");
1632 #endif  
1633 #endif
1634                         up(&mei_sema);
1635                         return -EIO;
1636                 }
1637                 version = RxMessage[4];
1638                 
1639                 //Hour:bits 0-7
1640                 //Minute:bits 8-15
1641                 makeCMV(H2D_CMV_READ, INFO, 55, 1, 1, NULL);
1642                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
1643 #if 0
1644 #ifdef AMAZON_MEI_DEBUG_ON
1645                         printk("\n\n WINHOST CMV fail");
1646 #endif  
1647 #endif
1648                         up(&mei_sema);
1649                         return -EFAULT;
1650                 }
1651                 version += (RxMessage[4]<<16);
1652                 count += sprintf(outputbuf+count, " %d/%d %d:%d\n"
1653                                 ,version&0xff
1654                                 ,(version>>8)&0xff
1655                                 ,(version>>25)&0xff
1656                                 ,(version>>16)&0xff);
1657                                 
1658                 up(&mei_sema);  
1659                 
1660                 *ppos+=count;
1661         }else if(current_reg->flag != (int *)Recent_indicator){
1662                 if (*ppos>0) /* Assume reading completed in previous read*/
1663                         return 0;               // indicates end of file
1664                 count = sprintf(outputbuf, "0x%08X\n\n", *(current_reg->flag));
1665                 *ppos+=count;
1666                 if (count>nbytes)  /* Assume output can be read at one time */
1667                         return -EINVAL;
1668         }else{
1669                 if((int)(*ppos)/((int)7)==16)
1670                         return 0;  // indicate end of the message
1671                 count = sprintf(outputbuf, "0x%04X\n\n", *(((u16 *)(current_reg->flag))+ (int)(*ppos)/((int)7)));
1672                 *ppos+=count;
1673         }
1674         if (copy_to_user(buf, outputbuf, count))
1675                 return -EFAULT;
1676         return count;
1677 }
1678
1679 static ssize_t proc_write(struct file * file, const char * buffer, size_t count, loff_t *ppos)
1680 {
1681         int i_ino = (file->f_dentry->d_inode)->i_ino;
1682         reg_entry_t* current_reg=NULL;
1683         int i;
1684         unsigned long newRegValue;
1685         char *endp;
1686
1687         for (i=0;i<NUM_OF_REG_ENTRY;i++) {
1688                 if (regs[i].low_ino==i_ino) {
1689                         current_reg = &regs[i];
1690                         break;
1691                 }
1692         }
1693         if ((current_reg==NULL) || (current_reg->flag == (int *)Recent_indicator))
1694                 return -EINVAL;
1695
1696         newRegValue = simple_strtoul(buffer,&endp,0);
1697         *(current_reg->flag)=(int)newRegValue;
1698         return (count+endp-buffer);
1699 }
1700 ////////////////makeCMV(Opcode, Group, Address, Index, Size, Data), CMV in u16 TxMessage[MSG_LENGTH]///////////////////////////
1701 void makeCMV(u8 opcode, u8 group, u16 address, u16 index, int size, u16 * data)
1702 {
1703         memset(TxMessage, 0, MSG_LENGTH*2);
1704         TxMessage[0]= (opcode<<4) + (size&0xf);
1705         TxMessage[1]= (((index==0)?0:1)<<7) + (group&0x7f);
1706         TxMessage[2]= address;
1707         TxMessage[3]= index;
1708         if(opcode == H2D_CMV_WRITE)
1709                 memcpy(TxMessage+4, data, size*2);
1710         return;
1711 }
1712
1713 ////////////////makeCMV(Opcode, Group, Address, Index, Size, Data), CMV in u16 TxMessage[MSG_LENGTH]///////////////////////////
1714 void makeCMV_local(u8 opcode, u8 group, u16 address, u16 index, int size, u16 * data,u16 *CMVMSG)
1715 {
1716         memset(CMVMSG, 0, MSG_LENGTH*2);
1717         CMVMSG[0]= (opcode<<4) + (size&0xf);
1718         CMVMSG[1]= (((index==0)?0:1)<<7) + (group&0x7f);
1719         CMVMSG[2]= address;
1720         CMVMSG[3]= index;
1721         if(opcode == H2D_CMV_WRITE)
1722                 memcpy(CMVMSG+4, data, size*2);
1723         return;
1724 }
1725
1726 ////////////////                Driver Structure                /////////////////////////////////////////////////////////////////////////////
1727 static ssize_t mei_write(struct file *, const char *, size_t, loff_t *);
1728 static int mei_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
1729
1730 static struct file_operations mei_operations = {
1731         write:          mei_write,
1732         ioctl:          mei_ioctl,
1733 };
1734
1735
1736 static ssize_t mei_write(struct file * filp, const char * buf, size_t size, loff_t * loff)
1737 {
1738 //      printk("\n\n mei_write entered");
1739 //      image_buffer = (u32 *)kmalloc(size, GFP_KERNEL);
1740         image_buffer = (u32 *)vmalloc(size);
1741 //      printk("\n\n image_buffer kmalloc done");
1742         if(image_buffer == NULL){
1743 #ifdef AMAZON_MEI_DEBUG_ON
1744 //              printk("\n\n kmalloc for firmware image fail");
1745                 printk("\n\n vmalloc for firmware image fail");
1746 #endif
1747                 return -1;
1748         }
1749         copy_from_user((char *)image_buffer, buf, size);
1750 //      printk("\n\n copy_from_user done");
1751         return size;
1752 }
1753
1754         ////////// ISR GPTU Timer 6 for high resolution timer /////////////
1755 void amazon_timer6_interrupt_MEI(int irq, void *dev_id, struct pt_regs *regs)
1756 {
1757         int i,j;
1758         u32 temp;
1759         u16 temp16;
1760         u16 rdindex, wrindex;
1761         u16 num_rd=0;   //num of byte can be read
1762         u16 bytes_to_wr=0;
1763         
1764 //      printk("\n\nenter timer\n\n");
1765         irqtimes++;
1766 //      printk("\n%d\n",irqtimes);
1767
1768
1769 /*
1770 #ifdef  PCM_ACCESS_DEBUG
1771                 meiDebugRead_8(0x30f20, &temp, 1);
1772 #else
1773                 meiDMARead_8(0x30f20, &temp, 1);
1774 #endif          
1775         if((temp&0x4000)!=0){
1776                 printk("\nER_ERR");
1777 #ifdef  PCM_ACCESS_DEBUG
1778                 meiDebugWrite_8(0x30f20, &temp, 1);
1779 #else
1780                 meiDMAWrite_8(0x30f20, &temp, 1);
1781 #endif
1782 #ifdef  PCM_ACCESS_DEBUG
1783                 meiDebugRead_8(0x30f20, &temp, 1);
1784 #else
1785                 meiDMARead_8(0x30f20, &temp, 1);
1786 #endif
1787                 if((temp&0x4000)!=0)
1788                         printk("\nER_ERR not cleared");
1789         }
1790 */      
1791         
1792         for(i=PCM_CHANNEL_NUM-1;i>=0;i--){// start from last channel, which is rx  
1793 #ifdef  PCM_ACCESS_DEBUG
1794                 meiDebugRead_16(pcm_start_addr+i*16+12, &temp, 1);
1795 #else
1796                 meiDMARead_16(pcm_start_addr+i*16+12, &temp, 1);
1797 #endif
1798                 wrindex = (u16)((temp & 0xffff0000)>>16);
1799 //              printk(" %d",wrindex);
1800 #ifdef  PCM_ACCESS_DEBUG
1801                 meiDebugRead_16(pcm_start_addr+i*16+8, &temp, 1);
1802 #else
1803                 meiDMARead_16(pcm_start_addr+i*16+8, &temp, 1);
1804 #endif
1805                 rdindex = (u16)(temp & 0xffff);
1806 //              printk(" %d",rdindex);
1807                 if(rdindex<=wrindex)
1808                         num_rd=((wrindex-rdindex)/4)*4; //read multiply of 4 bytes
1809                 else
1810                         num_rd=((pcm_data[i].len-(rdindex-wrindex))/4)*4;       //read multiply of 4 bytes
1811                 
1812                 if(i%2!=0){//rx channel
1813                         pcm_data[i].point=0;
1814                         for(j=0;j<num_rd/4;j++){
1815                                 if(pcm_data[i].finish!=1){
1816                                         if((rdindex+j*4)>=pcm_data[i].len)
1817                                                 temp16=(rdindex+j*4) - pcm_data[i].len;
1818                                         else
1819                                                 temp16=rdindex+j*4;
1820 #ifdef  PCM_ACCESS_DEBUG
1821                                         meiDebugRead_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16))+temp16, (u32*)(pcm_data[i].buff+pcm_data[i].point), 1);
1822 #else
1823                                         meiDMARead_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16))+temp16, (u32*)(pcm_data[i].buff+pcm_data[i].point), 1);
1824 #endif
1825                                 //      printk(" %8x", *((u32*)(pcm_data[i].buff+pcm_data[i].point)));  
1826                                 /*      if(pcm_data[i].point==0){
1827                                                 if(pcm_data[i].buff[0]==0xA5){// start of loopback data
1828                                                         pcm_data[i].point+=4;   
1829                                                         printk("\nstart receive data");
1830                                                 }       
1831                                         } 
1832                                         else*/
1833                                                 pcm_data[i].point+=4;
1834                                 /*      if(pcm_data[i].point==PCM_BUFF_SIZE){   //finish rx
1835                                                 pcm_data[i].finish=1;
1836                                                 printk("\nchannel[%d] finished", i);
1837                                         }       */
1838                                 }
1839                         }
1840                         if(firsttime[i]==1){
1841                                 for(j=0;j<num_rd;j++){
1842                                         if(pcm_data[i].buff[j]==0x1){
1843                                                 num_cmp[i]=num_rd-j;
1844                                                 firsttime[i]=0;
1845                                                 break;
1846                                         }
1847                                 }
1848                                 if(memcmp(sampledata+1, pcm_data[i].buff+j, num_cmp[i])!=0)
1849                                         printk("\n\ndata wrong,1st\n\n");
1850                                 else
1851                                         pcm_start_loc[i] = num_cmp[i]+1;
1852                         }
1853                         else{
1854                                 if(memcmp(sampledata+pcm_start_loc[i], pcm_data[i].buff, num_rd)!=0)
1855                                         printk("\n\ndata wrong\n\n");
1856                                 else{
1857                                         pcm_start_loc[i]+=num_rd;
1858                                         if(pcm_start_loc[i]>=256)
1859                                                 pcm_start_loc[i]=pcm_start_loc[i]-256;
1860                                 }
1861                         }
1862                         
1863                         rdindex +=num_rd;
1864                         if(rdindex>=pcm_data[i].len)
1865                                 rdindex=rdindex-pcm_data[i].len;
1866 #ifdef  PCM_ACCESS_DEBUG
1867                         meiDebugRead_16(pcm_start_addr+i*16+8, &temp, 1);
1868 #else
1869                         meiDMARead_16(pcm_start_addr+i*16+8, &temp, 1);
1870 #endif
1871                         temp= (temp & 0xffff0000) + rdindex;
1872 #ifdef  PCM_ACCESS_DEBUG
1873                         meiDebugWrite_16(pcm_start_addr+i*16+8, &temp, 1); // update rdindex 
1874 #else
1875                         meiDMAWrite_16(pcm_start_addr+i*16+8, &temp, 1); // update rdindex
1876 #endif
1877                         
1878                         bytes_to_wr = num_rd;
1879                         
1880         //              if(bytes_to_wr>0){
1881                 //              printk(" %d", num_rd);
1882                 //              printk(" %d", rdindex);
1883 //                              printk("\n\nrdindex = %d", rdindex);    
1884                         //}
1885                 }
1886                 else{   //tx channel
1887         //              if((bytes_to_wr + num_rd) < pcm_data[i].len){
1888                                 for(j=0;j<bytes_to_wr/4;j++){
1889                                         if(pcm_data[i].finish!=1){
1890                                                 if((wrindex+j*4)>=pcm_data[i].len)
1891                                                         temp16=(wrindex+j*4) - pcm_data[i].len;
1892                                                 else
1893                                                         temp16=wrindex + j*4;
1894 /*                                                      
1895 #ifdef  PCM_ACCESS_DEBUG
1896                                                 meiDebugWrite_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16))+temp16,(u32*)(pcm_data[i+1].buff+j*4), 1);
1897 #else
1898                                                 meiDMAWrite_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16))+temp16,(u32*)(pcm_data[i+1].buff+j*4), 1);
1899 #endif*/
1900                                                         
1901 #ifdef  PCM_ACCESS_DEBUG
1902                                                 meiDebugWrite_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16))+temp16,(u32*)(pcm_data[i].buff+pcm_data[i].point), 1);
1903                                 //              meiDebugWrite_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16))+temp16,(u32*)(pcm_data[i].buff), 1);
1904 #else
1905                                                 meiDMAWrite_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16))+temp16,(u32*)(pcm_data[i].buff+pcm_data[i].point), 1);
1906 #endif          
1907                                                 pcm_data[i].point+=4;
1908                                                 if(pcm_data[i].point==PCM_BUFF_SIZE){
1909                                         //              pcm_data[i].finish=1; 
1910                                         //              printk("\nchannel[%d] finished", i);
1911                                                         pcm_data[i].point=0;
1912                                                 }       
1913                                         }
1914                                 }
1915                                 wrindex+=bytes_to_wr;
1916                                 if(wrindex>=pcm_data[i].len)
1917                                         wrindex=wrindex-pcm_data[i].len;
1918 #ifdef  PCM_ACCESS_DEBUG
1919                                 meiDebugRead_16(pcm_start_addr+i*16+12, &temp, 1);
1920 #else
1921                                 meiDMARead_16(pcm_start_addr+i*16+12, &temp, 1);
1922 #endif
1923                                 temp=(temp&0xffff) + (wrindex<<16);
1924 #ifdef  PCM_ACCESS_DEBUG
1925                                 meiDebugWrite_16(pcm_start_addr+i*16+12, &temp, 1); // update wrindex
1926 #else
1927                                 meiDMAWrite_16(pcm_start_addr+i*16+12, &temp, 1); // update wrindex
1928 #endif
1929                         
1930                                 //if(bytes_to_wr>0){
1931                         //              printk(" %d", bytes_to_wr);
1932                         //              printk(" %d", wrindex);
1933 //                                      printk("\n\nwrindex = %d", wrindex);    
1934                                 //}
1935                 //      }
1936                 }
1937         }
1938         return;
1939 }
1940 //000002:fchang Start
1941 static int meiResetArc(void)
1942 {
1943         u32 auxreg0;
1944         u32 auxreg5;
1945         int flshcnt=0;
1946         int flshcnt1=0;
1947         int flshcnt2=0;
1948         
1949         meiLongwordWrite(MEI_CONTROL, 1);
1950         meiLongwordWrite(MEI_DEBUG_DEC, 3);     
1951         meiLongwordWrite(MEI_DEBUG_WAD, 0x3c);
1952         meiLongwordWrite(MEI_DEBUG_DATA, 0x10);
1953         meiPollForDbgDone();
1954         meiLongwordWrite(MEI_DEBUG_DEC, 0x0);
1955         meiLongwordWrite(MEI_DEBUG_WAD, 0x2);
1956         meiLongwordWrite(MEI_DEBUG_DATA, 0x0);
1957         meiPollForDbgDone();
1958         meiLongwordWrite(MEI_DEBUG_WAD, 0x3);
1959         meiLongwordWrite(MEI_DEBUG_DATA, 0x0);
1960         meiPollForDbgDone();
1961         meiLongwordWrite(MEI_DEBUG_DEC, 0x0);
1962         meiLongwordWrite(MEI_DEBUG_RAD, 0x0);
1963         meiPollForDbgDone();
1964         meiLongwordRead(MEI_DEBUG_DATA, &auxreg0);
1965         auxreg0 = auxreg0 & 0x03ffffff;
1966         meiLongwordWrite(MEI_DEBUG_WAD, 0x0);
1967         meiLongwordWrite(MEI_DEBUG_DATA, auxreg0);
1968         meiPollForDbgDone();
1969         meiLongwordWrite(MEI_DEBUG_WAD, 0x10a);
1970         meiLongwordWrite(MEI_DEBUG_DATA, 0x0);
1971         meiPollForDbgDone();
1972         meiLongwordWrite(MEI_DEBUG_DEC, 0x2);
1973         meiLongwordWrite(MEI_DEBUG_WAD, 0xfffc);
1974         meiLongwordWrite(MEI_DEBUG_DATA, 0x1fffffff);
1975         meiPollForDbgDone();
1976         while(flshcnt<3){
1977                 meiLongwordWrite(MEI_DEBUG_DEC, 0x0);
1978                 meiLongwordWrite(MEI_DEBUG_RAD, 0x0);
1979                 meiPollForDbgDone();
1980                 meiLongwordRead(MEI_DEBUG_DATA, &auxreg0);
1981                 auxreg0 = auxreg0 & 0xff000000;
1982                 auxreg0 = auxreg0 | 0x3fff;
1983                 meiLongwordWrite(MEI_DEBUG_WAD, 0x0);
1984                 meiLongwordWrite(MEI_DEBUG_DATA, auxreg0);
1985                 meiPollForDbgDone();
1986                 
1987                 meiLongwordWrite(MEI_DEBUG_DEC, 0x0);
1988                 meiLongwordWrite(MEI_DEBUG_RAD, 0x5);
1989                 meiPollForDbgDone();
1990                 meiLongwordRead(MEI_DEBUG_DATA, &auxreg5);
1991                 auxreg5 = auxreg5 | 0x801;
1992                 meiLongwordWrite(MEI_DEBUG_WAD, 0x5);
1993                 meiLongwordWrite(MEI_DEBUG_DATA, auxreg5);
1994                 meiPollForDbgDone();
1995                 meiLongwordWrite(MEI_DEBUG_RAD, 0x0);
1996                 meiPollForDbgDone();
1997                 meiLongwordRead(MEI_DEBUG_DATA, &auxreg0);
1998                 auxreg0 = auxreg0 & 0x00ffffff;
1999                 if(auxreg0 == 0x4000)
2000                         flshcnt = flshcnt+1;
2001                 else{
2002                         if(flshcnt == 0)
2003                                 flshcnt1 = flshcnt1 +1;
2004                         else
2005                                 flshcnt2 = flshcnt2 +1;
2006                 }       
2007         }
2008         
2009         return 1;
2010 }
2011
2012 static int meiResetCore(void)
2013 {
2014         meiLongwordWrite(MEI_CONTROL, 0x1);
2015         meiLongwordWrite(MEI_DEBUG_DEC, 0x2);
2016         meiLongwordWrite(MEI_DEBUG_WAD, 0x31f10);
2017         meiLongwordWrite(MEI_DEBUG_DATA, 0xf);
2018         meiPollForDbgDone();
2019         meiLongwordWrite(MEI_DEBUG_WAD, 0x31f10);
2020         meiLongwordWrite(MEI_DEBUG_DATA, 0x0);
2021         meiPollForDbgDone();
2022         meiLongwordWrite(MEI_DEBUG_WAD, 0x31f00);
2023         meiLongwordWrite(MEI_DEBUG_DATA, 0x55);
2024         meiPollForDbgDone();
2025         return 1;
2026 }
2027
2028 static int meiEnalbeMailboxInt(void)
2029 {
2030         u32 arc2meiintmsk;
2031         meiLongwordRead(ARC_TO_MEI_INT_MASK, &arc2meiintmsk);
2032         arc2meiintmsk = arc2meiintmsk | 0x1;
2033         meiLongwordWrite(ARC_TO_MEI_INT_MASK, arc2meiintmsk);
2034         meiLongwordWrite(MEI_CONTROL, 0x0);
2035         return 1;
2036 }
2037
2038
2039
2040 //000002:fchang End
2041
2042 static int mei_ioctl(struct inode * ino, struct file * fil, unsigned int command, unsigned long lon)
2043 {
2044         int i,k;
2045         u32 boot_loop;
2046         u32 page_size;
2047         u32 dest_addr;
2048         u32 j;
2049         u32 temp;
2050         u32 temp2;
2051         u16 trapsflag=0;
2052         amazon_clreoc_pkt * current_clreoc;
2053         struct timeval time_now;
2054         struct timeval time_fini;
2055         struct list_head * ptr;
2056         amazon_mei_mib * mib_ptr;
2057 //      u16 buff[MSG_LENGTH]__attribute__ ((aligned(4)));
2058         structpts pts;
2059         int meierr=MEI_SUCCESS;
2060         u16 data[12];  //used in makeCMV, to pass in payload when CMV set, ignored when CMV read.
2061         meireg regrdwr;
2062         meidebug debugrdwr;
2063         amazon_mei_mib * temp_intvl;
2064         struct sk_buff * eoc_skb;
2065 // 603221:tc.chen start
2066         u16 hdlc_cmd[2];
2067         u16 hdlc_rx_buffer[32];
2068         int hdlc_rx_len=0;
2069 // 603221:tc.chen end
2070         
2071         int from_kernel = 0;//joelin
2072         if (ino == (struct inode *)0) from_kernel = 1;//joelin
2073         
2074 //      printk("\n switch.command = %i\n", command);
2075         switch(command){
2076                 case GET_ADSL_LINE_CODE:
2077                         pts.adslLineTableEntry_pt = (adslLineTableEntry *)kmalloc(sizeof(adslLineTableEntry), GFP_KERNEL);
2078                         copy_from_user((char *)pts.adslLineTableEntry_pt, (char *)lon, sizeof(adslLineTableEntry));
2079                         if(IS_FLAG_SET((&(pts.adslLineTableEntry_pt->flags)), LINE_CODE_FLAG)){
2080                                 pts.adslLineTableEntry_pt->adslLineCode = 2;
2081                         }
2082                         copy_to_user((char *)lon, (char *)pts.adslLineTableEntry_pt, sizeof(adslLineTableEntry));
2083                         kfree(pts.adslLineTableEntry_pt);
2084                         break;
2085 #ifdef AMAZON_MEI_MIB_RFC3440
2086                 case GET_ADSL_ATUC_LINE_EXT:
2087                         if(down_interruptible(&mei_sema))
2088                                 return -ERESTARTSYS;
2089                         pts.adslLineExtTableEntry_pt = (adslLineExtTableEntry *)kmalloc(sizeof(adslLineExtTableEntry), GFP_KERNEL);
2090                         copy_from_user((char *)pts.adslLineExtTableEntry_pt, (char *)lon, sizeof(adslLineExtTableEntry));
2091                         if(IS_FLAG_SET((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_CAP_FLAG)){
2092                                 ATUC_LINE_TRANS_CAP_FLAG_MAKECMV;
2093                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2094 #ifdef AMAZON_MEI_DEBUG_ON
2095                                         printk("\n\nCMV fail, Group 3 Address 67 Index 0");
2096 #endif
2097                                         CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_CAP_FLAG);   
2098                                 }       
2099                                 else{
2100                                         memcpy((&(pts.adslLineExtTableEntry_pt->adslLineTransAtucCap)), RxMessage+4, ((RxMessage[0]&0xf)*2));
2101                                 }
2102                         }
2103                         if(IS_FLAG_SET((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_CONFIG_FLAG)){
2104                                 ATUC_LINE_TRANS_CONFIG_FLAG_MAKECMV;
2105                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2106 #ifdef AMAZON_MEI_DEBUG_ON
2107                                         printk("\n\nCMV fail, Group 3 Address 67 Index 0");
2108 #endif
2109                                         CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_CONFIG_FLAG);        
2110                                 }       
2111                                 else{
2112                                         memcpy((&(pts.adslLineExtTableEntry_pt->adslLineTransAtucConfig)), RxMessage+4, ((RxMessage[0]&0xf)*2));
2113                                 }
2114                         }
2115                         if(IS_FLAG_SET((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_ACTUAL_FLAG)){
2116                                 ATUC_LINE_TRANS_ACTUAL_FLAG_MAKECMV;
2117                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2118 #ifdef AMAZON_MEI_DEBUG_ON
2119                                         printk("\n\nCMV fail, Group 2 Address 1 Index 0");
2120 #endif
2121                                         CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_ACTUAL_FLAG);        
2122                                 }       
2123                                 else{
2124                                         memcpy((&(pts.adslLineExtTableEntry_pt->adslLineTransAtucActual)), RxMessage+4, ((RxMessage[0]&0xf)*2));
2125                                 }
2126                         }
2127                         if(IS_FLAG_SET((&(pts.adslLineExtTableEntry_pt->flags)), LINE_GLITE_POWER_STATE_FLAG)){    // not supported currently
2128 /*
2129                                 LINE_GLITE_POWER_STATE_FLAG_MAKECMV;
2130                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2131 #ifdef AMAZON_MEI_DEBUG_ON
2132                                         printk("\n\nCMV fail, Group 2 Address 0 Index 0");
2133 #endif
2134                                         CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), LINE_GLITE_POWER_STATE_FLAG);        
2135                                 }       
2136                                 else{
2137                                         memcpy((&(pts.adslLineExtTableEntry_pt->adslLineGlitePowerState)), RxMessage+4, ((RxMessage[0]&0xf)*2));
2138                                 }
2139 */
2140                                 CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), LINE_GLITE_POWER_STATE_FLAG);
2141                         }
2142                         copy_to_user((char *)lon, (char *)pts.adslLineExtTableEntry_pt, sizeof(adslLineExtTableEntry));
2143                         kfree(pts.adslLineTableEntry_pt);
2144                         up(&mei_sema);
2145                         break;
2146 #endif
2147
2148 #ifdef AMAZON_MEI_MIB_RFC3440
2149                 case SET_ADSL_ATUC_LINE_EXT:
2150                         if(down_interruptible(&mei_sema))
2151                                 return -ERESTARTSYS;
2152                         pts.adslLineExtTableEntry_pt = (adslLineExtTableEntry *)kmalloc(sizeof(adslLineExtTableEntry), GFP_KERNEL);
2153                         copy_from_user((char *)pts.adslLineExtTableEntry_pt, (char *)lon, sizeof(adslLineExtTableEntry));
2154                         
2155                         //only adslLineTransAtucConfig can be set.
2156                         CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_CAP_FLAG);
2157                         if(IS_FLAG_SET((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_CONFIG_FLAG)){
2158                                 memcpy(data,(&(pts.adslLineExtTableEntry_pt->adslLineTransAtucConfig)), 2); 
2159                                 ATUC_LINE_TRANS_CONFIG_FLAG_MAKECMV_WR;
2160                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2161 #ifdef AMAZON_MEI_DEBUG_ON
2162                                         printk("\n\nCMV fail, Group 3 Address 67 Index 0");
2163 #endif
2164                                         CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_CONFIG_FLAG);        
2165                                 }       
2166                         }
2167                         CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_ACTUAL_FLAG);
2168                         CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), LINE_GLITE_POWER_STATE_FLAG);
2169         
2170                         copy_to_user((char *)lon, (char *)pts.adslLineExtTableEntry_pt, sizeof(adslLineExtTableEntry));
2171                         kfree(pts.adslLineTableEntry_pt);
2172                         up(&mei_sema);
2173                         break;
2174 #endif
2175
2176                 case GET_ADSL_ATUC_PHY:
2177                         if(down_interruptible(&mei_sema))
2178                                 return -ERESTARTSYS;
2179                         
2180                         pts.adslAtucPhysEntry_pt = (adslAtucPhysEntry *)kmalloc(sizeof(adslAtucPhysEntry), GFP_KERNEL);
2181                         copy_from_user((char *)pts.adslAtucPhysEntry_pt, (char *)lon, sizeof(adslAtucPhysEntry));
2182                         if(IS_FLAG_SET((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_PHY_SER_NUM_FLAG)){
2183                                 ATUC_PHY_SER_NUM_FLAG_MAKECMV1;
2184                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2185 #ifdef AMAZON_MEI_DEBUG_ON
2186                                         printk("\n\nCMV fail, Group 3 Address 57 Index 0");
2187 #endif
2188                                         CLR_FLAG((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_PHY_SER_NUM_FLAG);  
2189                                 }
2190                                 else{
2191                                         memcpy(pts.adslAtucPhysEntry_pt->serial_no, RxMessage+4, ((RxMessage[0]&0xf)*2));
2192                                 }
2193                                 ATUC_PHY_SER_NUM_FLAG_MAKECMV2;
2194                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2195 #ifdef AMAZON_MEI_DEBUG_ON
2196                                         printk("\n\nCMV fail, Group 3 Address 57 Index 12");
2197 #endif
2198                                         CLR_FLAG((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_PHY_SER_NUM_FLAG);  
2199                                 }
2200                                 else{
2201                                         memcpy((pts.adslAtucPhysEntry_pt->serial_no+24), RxMessage+4, ((RxMessage[0]&0xf)*2));
2202                                 } 
2203                         }
2204                         if(IS_FLAG_SET((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_PHY_VENDOR_ID_FLAG)){
2205                                 ATUC_PHY_VENDOR_ID_FLAG_MAKECMV;
2206                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2207 #ifdef AMAZON_MEI_DEBUG_ON
2208                                         printk("\n\nCMV fail, Group 3 Address 64 Index 0");
2209 #endif
2210                                         CLR_FLAG((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_PHY_VENDOR_ID_FLAG);        
2211                                 }       
2212                                 else{
2213                                         memcpy(pts.adslAtucPhysEntry_pt->vendor_id.vendor_id, RxMessage+4, ((RxMessage[0]&0xf)*2));
2214                                 }
2215                         }
2216                         if(IS_FLAG_SET((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_PHY_VER_NUM_FLAG)){
2217                                 ATUC_PHY_VER_NUM_FLAG_MAKECMV;
2218                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2219 #ifdef AMAZON_MEI_DEBUG_ON
2220                                         printk("\n\nCMV fail, Group 3 Address 58 Index 0");
2221 #endif
2222                                         CLR_FLAG((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_PHY_VER_NUM_FLAG);  
2223                                 }       
2224                                 else{
2225                                         memcpy(pts.adslAtucPhysEntry_pt->version_no, RxMessage+4, ((RxMessage[0]&0xf)*2));
2226                                 }
2227                         }
2228                         if(IS_FLAG_SET((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_CURR_STAT_FLAG)){
2229                                 pts.adslAtucPhysEntry_pt->status = CurrStatus.adslAtucCurrStatus;
2230                         }               
2231                         if(IS_FLAG_SET((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_CURR_OUT_PWR_FLAG)){
2232                                 ATUC_CURR_OUT_PWR_FLAG_MAKECMV;
2233                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2234 #ifdef AMAZON_MEI_DEBUG_ON
2235                                         printk("\n\nCMV fail, Group 3 Address 68 Index 5");
2236 #endif
2237                                         CLR_FLAG((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_CURR_OUT_PWR_FLAG); 
2238                                 }       
2239                                 else{
2240                                         memcpy((&(pts.adslAtucPhysEntry_pt->outputPwr)), RxMessage+4, ((RxMessage[0]&0xf)*2));
2241                                 }
2242                         }
2243                         if(IS_FLAG_SET((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_CURR_ATTR_FLAG)){
2244                                 ATUC_CURR_ATTR_FLAG_MAKECMV;
2245                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2246 #ifdef AMAZON_MEI_DEBUG_ON
2247                                         printk("\n\nCMV fail, Group 3 Address 69 Index 0");
2248 #endif
2249                                         CLR_FLAG((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_CURR_ATTR_FLAG);    
2250                                 }       
2251                                 else{
2252                                         memcpy((&(pts.adslAtucPhysEntry_pt->attainableRate)), RxMessage+4, ((RxMessage[0]&0xf)*2));
2253                                 }
2254                         }
2255                         copy_to_user((char *)lon, (char *)pts.adslAtucPhysEntry_pt, sizeof(adslAtucPhysEntry));
2256                         kfree(pts.adslAtucPhysEntry_pt);
2257                         
2258                         up(&mei_sema);
2259                         break;
2260                 case GET_ADSL_ATUR_PHY:
2261                         if(down_interruptible(&mei_sema))
2262                                 return -ERESTARTSYS;
2263                         
2264                         pts.adslAturPhysEntry_pt = (adslAturPhysEntry *)kmalloc(sizeof(adslAturPhysEntry), GFP_KERNEL);
2265                         copy_from_user((char *)pts.adslAturPhysEntry_pt, (char *)lon, sizeof(adslAturPhysEntry));
2266                         if(IS_FLAG_SET((&(pts.adslAturPhysEntry_pt->flags)), ATUR_PHY_SER_NUM_FLAG)){
2267                                 ATUR_PHY_SER_NUM_FLAG_MAKECMV1;
2268                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2269 #ifdef AMAZON_MEI_DEBUG_ON
2270                                         printk("\n\nCMV fail, Group 3 Address 62 Index 0");
2271 #endif
2272                                         CLR_FLAG((&(pts.adslAturPhysEntry_pt->flags)), ATUR_PHY_SER_NUM_FLAG);  
2273                                 }
2274                                 else{
2275                                         memcpy(pts.adslAturPhysEntry_pt->serial_no, RxMessage+4, ((RxMessage[0]&0xf)*2));
2276                                 }
2277                                 ATUR_PHY_SER_NUM_FLAG_MAKECMV2;
2278                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2279 #ifdef AMAZON_MEI_DEBUG_ON
2280                                         printk("\n\nCMV fail, Group 3 Address 62 Index 12");
2281 #endif
2282                                         CLR_FLAG((&(pts.adslAturPhysEntry_pt->flags)), ATUR_PHY_SER_NUM_FLAG);  
2283                                 }
2284                                 else{
2285                                         memcpy((pts.adslAturPhysEntry_pt->serial_no+24), RxMessage+4, ((RxMessage[0]&0xf)*2));
2286                                 } 
2287                         }
2288                         if(IS_FLAG_SET((&(pts.adslAturPhysEntry_pt->flags)), ATUR_PHY_VENDOR_ID_FLAG)){
2289                                 ATUR_PHY_VENDOR_ID_FLAG_MAKECMV;
2290                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2291 #ifdef AMAZON_MEI_DEBUG_ON
2292                                         printk("\n\nCMV fail, Group 3 Address 65 Index 0");
2293 #endif
2294                                         CLR_FLAG((&(pts.adslAturPhysEntry_pt->flags)), ATUR_PHY_VENDOR_ID_FLAG);        
2295                                 }       
2296                                 else{
2297                                         memcpy(pts.adslAturPhysEntry_pt->vendor_id.vendor_id, RxMessage+4, ((RxMessage[0]&0xf)*2));
2298                                 }
2299                         }
2300                         if(IS_FLAG_SET((&(pts.adslAturPhysEntry_pt->flags)), ATUR_PHY_VER_NUM_FLAG)){
2301                                 ATUR_PHY_VER_NUM_FLAG_MAKECMV;
2302                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2303 #ifdef AMAZON_MEI_DEBUG_ON
2304                                         printk("\n\nCMV fail, Group 3 Address 61 Index 0");
2305 #endif
2306                                         CLR_FLAG((&(pts.adslAturPhysEntry_pt->flags)), ATUR_PHY_VER_NUM_FLAG);  
2307                                 }       
2308                                 else{
2309                                         memcpy(pts.adslAturPhysEntry_pt->version_no, RxMessage+4, ((RxMessage[0]&0xf)*2));
2310                                 }
2311                         }
2312                         if(IS_FLAG_SET((&(pts.adslAturPhysEntry_pt->flags)), ATUR_SNRMGN_FLAG)){
2313                                 ATUR_SNRMGN_FLAG_MAKECMV;
2314                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2315 #ifdef AMAZON_MEI_DEBUG_ON
2316                                         printk("\n\nCMV fail, Group 3 Address 68 Index 4");
2317 #endif
2318                                         CLR_FLAG((&(pts.adslAturPhysEntry_pt->flags)), ATUR_SNRMGN_FLAG);       
2319                                 }       
2320                                 else{
2321                                         memcpy((&(pts.adslAturPhysEntry_pt->SnrMgn)), RxMessage+4, ((RxMessage[0]&0xf)*2));
2322                                 }
2323                         }
2324                         if(IS_FLAG_SET((&(pts.adslAturPhysEntry_pt->flags)), ATUR_ATTN_FLAG)){
2325                                 ATUR_ATTN_FLAG_MAKECMV;
2326                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2327 #ifdef AMAZON_MEI_DEBUG_ON
2328                                         printk("\n\nCMV fail, Group 3 Address 68 Index 2");
2329 #endif
2330                                         CLR_FLAG((&(pts.adslAturPhysEntry_pt->flags)), ATUR_ATTN_FLAG); 
2331                                 }       
2332                                 else{
2333                                         memcpy((&(pts.adslAturPhysEntry_pt->Attn)), RxMessage+4, ((RxMessage[0]&0xf)*2));
2334                                 }
2335                         }
2336                         if(IS_FLAG_SET((&(pts.adslAturPhysEntry_pt->flags)), ATUR_CURR_STAT_FLAG)){
2337                                 pts.adslAturPhysEntry_pt->status = CurrStatus.adslAturCurrStatus;
2338                         }
2339                         if(IS_FLAG_SET((&(pts.adslAturPhysEntry_pt->flags)), ATUR_CURR_OUT_PWR_FLAG)){
2340                                 ATUR_CURR_OUT_PWR_FLAG_MAKECMV;
2341                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2342 #ifdef AMAZON_MEI_DEBUG_ON
2343                                         printk("\n\nCMV fail, Group 3 Address 69 Index 5");
2344 #endif
2345                                         CLR_FLAG((&(pts.adslAturPhysEntry_pt->flags)), ATUR_CURR_OUT_PWR_FLAG); 
2346                                 }       
2347                                 else{
2348                                         memcpy((&(pts.adslAturPhysEntry_pt->outputPwr)), RxMessage+4, ((RxMessage[0]&0xf)*2));
2349                                 }
2350                         }
2351                         if(IS_FLAG_SET((&(pts.adslAturPhysEntry_pt->flags)), ATUR_CURR_ATTR_FLAG)){
2352                                 ATUR_CURR_ATTR_FLAG_MAKECMV;
2353                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2354 #ifdef AMAZON_MEI_DEBUG_ON
2355                                         printk("\n\nCMV fail, Group 3 Address 68 Index 0");
2356 #endif
2357                                         CLR_FLAG((&(pts.adslAturPhysEntry_pt->flags)), ATUR_CURR_ATTR_FLAG);    
2358                                 }       
2359                                 else{
2360                                         memcpy((&(pts.adslAturPhysEntry_pt->attainableRate)), RxMessage+4, ((RxMessage[0]&0xf)*2));
2361                                 }
2362                         }
2363                         copy_to_user((char *)lon, (char *)pts.adslAturPhysEntry_pt, sizeof(adslAturPhysEntry));
2364                         kfree(pts.adslAturPhysEntry_pt);
2365                         
2366                         up(&mei_sema);
2367                         break;
2368                 case GET_ADSL_ATUC_CHAN_INFO:
2369                         if(down_interruptible(&mei_sema))
2370                                 return -ERESTARTSYS;
2371                         
2372                         pts.adslAtucChanInfo_pt = (adslAtucChanInfo *)kmalloc(sizeof(adslAtucChanInfo), GFP_KERNEL);
2373                         copy_from_user((char *)pts.adslAtucChanInfo_pt, (char *)lon, sizeof(adslAtucChanInfo));
2374                         if(IS_FLAG_SET((&(pts.adslAtucChanInfo_pt->flags)), ATUC_CHAN_INTLV_DELAY_FLAG)){
2375                                 if((chantype.interleave!=1) || (chantype.fast==1)){
2376                                         CLR_FLAG((&(pts.adslAtucChanInfo_pt->flags)), ATUC_CHAN_INTLV_DELAY_FLAG);
2377                                 }
2378                                 else{
2379                                         ATUC_CHAN_INTLV_DELAY_FLAG_MAKECMV;
2380                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2381 #ifdef AMAZON_MEI_DEBUG_ON
2382                                                 printk("\n\nCMV fail, Group 6 Address 3 Index 1");
2383 #endif
2384                                                 CLR_FLAG((&(pts.adslAtucChanInfo_pt->flags)), ATUC_CHAN_INTLV_DELAY_FLAG);      
2385                                         }       
2386                                         else{
2387                                                 memcpy((&(pts.adslAtucChanInfo_pt->interleaveDelay)), RxMessage+4, ((RxMessage[0]&0xf)*2));
2388                                         }
2389                                 }
2390                         }
2391                         if(IS_FLAG_SET((&(pts.adslAtucChanInfo_pt->flags)), ATUC_CHAN_CURR_TX_RATE_FLAG)){
2392                                 ATUC_CHAN_CURR_TX_RATE_FLAG_MAKECMV;
2393                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2394 #ifdef AMAZON_MEI_DEBUG_ON
2395                                         printk("\n\nCMV fail, Group 6 Address 1 Index 0");
2396 #endif
2397                                         CLR_FLAG((&(pts.adslAtucChanInfo_pt->flags)), ATUC_CHAN_CURR_TX_RATE_FLAG);     
2398                                 }       
2399                                 else{
2400                                         pts.adslAtucChanInfo_pt->currTxRate = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16);
2401                                 }
2402                         }
2403                         if(IS_FLAG_SET((&(pts.adslAtucChanInfo_pt->flags)), ATUC_CHAN_PREV_TX_RATE_FLAG)){
2404                                 pts.adslAtucChanInfo_pt->prevTxRate = PrevTxRate.adslAtucChanPrevTxRate;
2405                         }
2406                         copy_to_user((char *)lon, (char *)pts.adslAtucChanInfo_pt, sizeof(adslAtucChanInfo));
2407                         kfree(pts.adslAtucChanInfo_pt);
2408                         
2409                         up(&mei_sema);
2410                         break;
2411                 case GET_ADSL_ATUR_CHAN_INFO:
2412                         if(down_interruptible(&mei_sema))
2413                                 return -ERESTARTSYS;
2414                         
2415                         pts.adslAturChanInfo_pt = (adslAturChanInfo *)kmalloc(sizeof(adslAturChanInfo), GFP_KERNEL);
2416                         copy_from_user((char *)pts.adslAturChanInfo_pt, (char *)lon, sizeof(adslAturChanInfo));
2417                         if(IS_FLAG_SET((&(pts.adslAturChanInfo_pt->flags)), ATUR_CHAN_INTLV_DELAY_FLAG)){
2418                                 if((chantype.interleave!=1) || (chantype.fast==1)){
2419                                         CLR_FLAG((&(pts.adslAturChanInfo_pt->flags)), ATUR_CHAN_INTLV_DELAY_FLAG);
2420                                 }
2421                                 else{
2422                                         ATUR_CHAN_INTLV_DELAY_FLAG_MAKECMV;
2423                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2424 #ifdef AMAZON_MEI_DEBUG_ON
2425                                                 printk("\n\nCMV fail, Group 6 Address 2 Index 1");
2426 #endif
2427                                                 CLR_FLAG((&(pts.adslAturChanInfo_pt->flags)), ATUR_CHAN_INTLV_DELAY_FLAG);      
2428                                         }       
2429                                         else{
2430                                                 memcpy((&(pts.adslAturChanInfo_pt->interleaveDelay)), RxMessage+4, ((RxMessage[0]&0xf)*2));
2431                                         }
2432                                 }
2433                         }
2434                         if(IS_FLAG_SET((&(pts.adslAturChanInfo_pt->flags)), ATUR_CHAN_CURR_TX_RATE_FLAG)){
2435                                 ATUR_CHAN_CURR_TX_RATE_FLAG_MAKECMV;
2436                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
2437 #ifdef AMAZON_MEI_DEBUG_ON
2438                                         printk("\n\nCMV fail, Group 6 Address 0 Index 0");
2439 #endif
2440                                         CLR_FLAG((&(pts.adslAturChanInfo_pt->flags)), ATUR_CHAN_CURR_TX_RATE_FLAG);     
2441                                 }       
2442                                 else{
2443                                         pts.adslAturChanInfo_pt->currTxRate = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16);
2444                                 }
2445                         }
2446                         if(IS_FLAG_SET((&(pts.adslAturChanInfo_pt->flags)), ATUR_CHAN_PREV_TX_RATE_FLAG)){
2447                                 pts.adslAturChanInfo_pt->prevTxRate = PrevTxRate.adslAturChanPrevTxRate;
2448                         }
2449                         if(IS_FLAG_SET((&(pts.adslAturChanInfo_pt->flags)), ATUR_CHAN_CRC_BLK_LEN_FLAG)){
2450                                 // ? no CMV to update this 
2451                                 CLR_FLAG((&(pts.adslAturChanInfo_pt->flags)), ATUR_CHAN_CRC_BLK_LEN_FLAG);
2452                         }
2453                         copy_to_user((char *)lon, (char *)pts.adslAturChanInfo_pt, sizeof(adslAturChanInfo));
2454                         kfree(pts.adslAturChanInfo_pt);
2455                         
2456                         up(&mei_sema);
2457                         break;
2458                 case GET_ADSL_ATUC_PERF_DATA:
2459                         pts.atucPerfDataEntry_pt = (atucPerfDataEntry *)kmalloc(sizeof(atucPerfDataEntry), GFP_KERNEL);
2460                         copy_from_user((char *)pts.atucPerfDataEntry_pt, (char *)lon, sizeof(atucPerfDataEntry));
2461                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_LOFS_FLAG)){
2462                                 pts.atucPerfDataEntry_pt->adslAtucPerfLofs=ATUC_PERF_LOFS;
2463                         }
2464                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_LOSS_FLAG)){
2465                                 pts.atucPerfDataEntry_pt->adslAtucPerfLoss=ATUC_PERF_LOSS;
2466                         }
2467                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_ESS_FLAG)){
2468                                 pts.atucPerfDataEntry_pt->adslAtucPerfESs=ATUC_PERF_ESS;
2469                         }
2470                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_INITS_FLAG)){
2471                                 pts.atucPerfDataEntry_pt->adslAtucPerfInits=ATUC_PERF_INITS;
2472                         }
2473                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_VALID_INTVLS_FLAG)){
2474                                 i=0;
2475                                 for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){
2476                                         i++;
2477                                         if(i==96)
2478                                                 break;
2479                                 }
2480                                 pts.atucPerfDataEntry_pt->adslAtucPerfValidIntervals=i;
2481                         }
2482                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_INVALID_INTVLS_FLAG)){
2483                                 pts.atucPerfDataEntry_pt->adslAtucPerfInvalidIntervals=0;
2484                         }
2485                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_15MIN_TIME_ELAPSED_FLAG)){
2486                                 do_gettimeofday(&time_now);
2487                                 pts.atucPerfDataEntry_pt->adslAtucPerfCurr15MinTimeElapsed=time_now.tv_sec - (current_intvl->start_time).tv_sec;
2488                         }
2489                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_15MIN_LOFS_FLAG)){
2490                                 pts.atucPerfDataEntry_pt->adslAtucPerfCurr15MinLofs=current_intvl->AtucPerfLof;
2491                         }
2492                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_15MIN_LOSS_FLAG)){
2493                                 pts.atucPerfDataEntry_pt->adslAtucPerfCurr15MinLoss=current_intvl->AtucPerfLos;
2494                         }
2495                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_15MIN_ESS_FLAG)){
2496                                 pts.atucPerfDataEntry_pt->adslAtucPerfCurr15MinESs=current_intvl->AtucPerfEs;
2497                         }
2498                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_15MIN_INIT_FLAG)){
2499                                 pts.atucPerfDataEntry_pt->adslAtucPerfCurr15MinInits=current_intvl->AtucPerfInit;
2500                         }
2501                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_1DAY_TIME_ELAPSED_FLAG)){
2502                                 i=0;            
2503                                 for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){
2504                                         i+=900; 
2505                                 }
2506                                 do_gettimeofday(&time_now);
2507                                 i+=time_now.tv_sec - (current_intvl->start_time).tv_sec;
2508                                 if(i>=86400)
2509                                         pts.atucPerfDataEntry_pt->adslAtucPerfCurr1DayTimeElapsed=i-86400;
2510                                 else
2511                                         pts.atucPerfDataEntry_pt->adslAtucPerfCurr1DayTimeElapsed=i;            
2512                         }
2513                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_1DAY_LOFS_FLAG)){           
2514                                 i=0;
2515                                 j=0;
2516                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2517                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2518                                         j+=mib_ptr->AtucPerfLof;
2519                                         i++;    
2520                                         if(i==96)
2521                                                 j=0;
2522                                 }
2523                                 j+=current_intvl->AtucPerfLof;
2524                                 pts.atucPerfDataEntry_pt->adslAtucPerfCurr1DayLofs=j;
2525                         }
2526                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_1DAY_LOSS_FLAG)){           
2527                                 i=0;
2528                                 j=0;
2529                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2530                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2531                                         j+=mib_ptr->AtucPerfLos;
2532                                         i++;    
2533                                         if(i==96)
2534                                                 j=0;
2535                                 }
2536                                 j+=current_intvl->AtucPerfLos;
2537                                 pts.atucPerfDataEntry_pt->adslAtucPerfCurr1DayLoss=j;
2538                         }
2539                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_1DAY_ESS_FLAG)){            
2540                                 i=0;
2541                                 j=0;
2542                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2543                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2544                                         j+=mib_ptr->AtucPerfEs;
2545                                         i++;    
2546                                         if(i==96)
2547                                                 j=0;
2548                                 }
2549                                 j+=current_intvl->AtucPerfEs;
2550                                 pts.atucPerfDataEntry_pt->adslAtucPerfCurr1DayESs=j;
2551                         }
2552                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_1DAY_INIT_FLAG)){           
2553                                 i=0;
2554                                 j=0;
2555                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2556                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2557                                         j+=mib_ptr->AtucPerfInit;
2558                                         i++;    
2559                                         if(i==96)
2560                                                 j=0;
2561                                 }
2562                                 j+=current_intvl->AtucPerfInit;
2563                                 pts.atucPerfDataEntry_pt->adslAtucPerfCurr1DayInits=j;
2564                         }
2565                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_PREV_1DAY_MON_SEC_FLAG)){                
2566                                 i=0;
2567                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2568                                         i++;            
2569                                 }
2570                                 if(i>=96)
2571                                         pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayMoniSecs=86400;
2572                                 else
2573                                         pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayMoniSecs=0;
2574                         }
2575                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_PREV_1DAY_LOFS_FLAG)){
2576                                 i=0;
2577                                 j=0;
2578                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2579                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2580                                         j+=mib_ptr->AtucPerfLof;
2581                                         i++;
2582                                         if(i==96)
2583                                                 break;
2584                                 }       
2585                                 if(i==96)
2586                                         pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayLofs=j;
2587                                 else
2588                                         pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayLofs=0;
2589                         }
2590                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_PREV_1DAY_LOSS_FLAG)){
2591                                 i=0;
2592                                 j=0;
2593                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2594                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2595                                         j+=mib_ptr->AtucPerfLos;
2596                                         i++;
2597                                         if(i==96)
2598                                                 break;
2599                                 }       
2600                                 if(i==96)
2601                                         pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayLoss=j;
2602                                 else
2603                                         pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayLoss=0;
2604                         }
2605                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_PREV_1DAY_ESS_FLAG)){
2606                                 i=0;
2607                                 j=0;
2608                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2609                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2610                                         j+=mib_ptr->AtucPerfEs;
2611                                         i++;
2612                                         if(i==96)
2613                                                 break;
2614                                 }       
2615                                 if(i==96)
2616                                         pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayESs=j;
2617                                 else
2618                                         pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayESs=0;
2619                         }
2620                         if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_PREV_1DAY_INITS_FLAG)){
2621                                 i=0;
2622                                 j=0;
2623                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2624                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2625                                         j+=mib_ptr->AtucPerfInit;
2626                                         i++;
2627                                         if(i==96)
2628                                                 break;
2629                                 }       
2630                                 if(i==96)
2631                                         pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayInits=j;
2632                                 else
2633                                         pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayInits=0;
2634                         }
2635                         
2636                         copy_to_user((char *)lon, (char *)pts.atucPerfDataEntry_pt, sizeof(atucPerfDataEntry));
2637                         kfree(pts.atucPerfDataEntry_pt);
2638                         break;
2639 #ifdef AMAZON_MEI_MIB_RFC3440
2640                 case GET_ADSL_ATUC_PERF_DATA_EXT:       //??? CMV mapping not available
2641                         pts.atucPerfDataExtEntry_pt = (atucPerfDataExtEntry *)kmalloc(sizeof(atucPerfDataExtEntry), GFP_KERNEL);
2642                         copy_from_user((char *)pts.atucPerfDataExtEntry_pt, (char *)lon, sizeof(atucPerfDataExtEntry));
2643                         if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_STAT_FASTR_FLAG)){
2644                                 pts.atucPerfDataExtEntry_pt->adslAtucPerfStatFastR=ATUC_PERF_STAT_FASTR;
2645                         }       
2646                         if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_STAT_FAILED_FASTR_FLAG)){
2647                                 pts.atucPerfDataExtEntry_pt->adslAtucPerfStatFailedFastR=ATUC_PERF_STAT_FAILED_FASTR;
2648                         }
2649                         if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_STAT_SESL_FLAG)){
2650                                 pts.atucPerfDataExtEntry_pt->adslAtucPerfStatSesL=ATUC_PERF_STAT_SESL;
2651                         }
2652                         if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_STAT_UASL_FLAG)){
2653                                 pts.atucPerfDataExtEntry_pt->adslAtucPerfStatUasL=ATUC_PERF_STAT_UASL;
2654                         }       
2655                         if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_CURR_15MIN_FASTR_FLAG)){
2656                                 pts.atucPerfDataExtEntry_pt->adslAtucPerfCurr15MinFastR=current_intvl->AtucPerfStatFastR;
2657                         }       
2658                         if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_CURR_15MIN_FAILED_FASTR_FLAG)){
2659                                 pts.atucPerfDataExtEntry_pt->adslAtucPerfCurr15MinFailedFastR=current_intvl->AtucPerfStatFailedFastR;
2660                         }
2661                         if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_CURR_15MIN_SESL_FLAG)){
2662                                 pts.atucPerfDataExtEntry_pt->adslAtucPerfCurr15MinSesL=current_intvl->AtucPerfStatSesL;
2663                         }
2664                         if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_CURR_15MIN_UASL_FLAG)){
2665                                 pts.atucPerfDataExtEntry_pt->adslAtucPerfCurr15MinUasL=current_intvl->AtucPerfStatUasL;
2666                         }
2667                         if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_CURR_1DAY_FASTR_FLAG)){
2668                                 i=0;
2669                                 j=0;
2670                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2671                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2672                                         j+=mib_ptr->AtucPerfStatFastR;
2673                                         i++;    
2674                                         if(i==96)
2675                                                 j=0;
2676                                 }
2677                                 j+=current_intvl->AtucPerfStatFastR;
2678                                 pts.atucPerfDataExtEntry_pt->adslAtucPerfCurr1DayFastR=j;
2679                         }       
2680                         if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_CURR_1DAY_FAILED_FASTR_FLAG)){
2681                                 i=0;
2682                                 j=0;
2683                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2684                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2685                                         j+=mib_ptr->AtucPerfStatFailedFastR;
2686                                         i++;    
2687                                         if(i==96)
2688                                                 j=0;
2689                                 }
2690                                 j+=current_intvl->AtucPerfStatFailedFastR;
2691                                 pts.atucPerfDataExtEntry_pt->adslAtucPerfCurr1DayFailedFastR=j;
2692                         }
2693                         if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_CURR_1DAY_SESL_FLAG)){
2694                                 i=0;
2695                                 j=0;
2696                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2697                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2698                                         j+=mib_ptr->AtucPerfStatSesL;
2699                                         i++;    
2700                                         if(i==96)
2701                                                 j=0;
2702                                 }
2703                                 j+=current_intvl->AtucPerfStatSesL;
2704                                 pts.atucPerfDataExtEntry_pt->adslAtucPerfCurr1DaySesL=j;
2705                         }
2706                         if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_CURR_1DAY_UASL_FLAG)){
2707                                 i=0;
2708                                 j=0;
2709                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2710                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2711                                         j+=mib_ptr->AtucPerfStatUasL;
2712                                         i++;    
2713                                         if(i==96)
2714                                                 j=0;
2715                                 }
2716                                 j+=current_intvl->AtucPerfStatUasL;
2717                                 pts.atucPerfDataExtEntry_pt->adslAtucPerfCurr1DayUasL=j;
2718                         }
2719                         if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_PREV_1DAY_FASTR_FLAG)){
2720                                 i=0;
2721                                 j=0;
2722                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2723                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2724                                         j+=mib_ptr->AtucPerfStatFastR;
2725                                         i++;
2726                                         if(i==96)
2727                                                 break;
2728                                 }       
2729                                 if(i==96)
2730                                         pts.atucPerfDataExtEntry_pt->adslAtucPerfPrev1DayFastR=j;
2731                                 else
2732                                         pts.atucPerfDataExtEntry_pt->adslAtucPerfPrev1DayFastR=0;
2733                         }       
2734                         if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_PREV_1DAY_FAILED_FASTR_FLAG)){
2735                                 i=0;
2736                                 j=0;
2737                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2738                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2739                                         j+=mib_ptr->AtucPerfStatFailedFastR;
2740                                         i++;
2741                                         if(i==96)
2742                                                 break;
2743                                 }       
2744                                 if(i==96)
2745                                         pts.atucPerfDataExtEntry_pt->adslAtucPerfPrev1DayFailedFastR=j;
2746                                 else
2747                                         pts.atucPerfDataExtEntry_pt->adslAtucPerfPrev1DayFailedFastR=0;
2748                         }
2749                         if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_PREV_1DAY_SESL_FLAG)){
2750                                 i=0;
2751                                 j=0;
2752                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2753                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2754                                         j+=mib_ptr->AtucPerfStatSesL;
2755                                         i++;
2756                                         if(i==96)
2757                                                 break;
2758                                 }       
2759                                 if(i==96)
2760                                         pts.atucPerfDataExtEntry_pt->adslAtucPerfPrev1DaySesL=j;
2761                                 else
2762                                         pts.atucPerfDataExtEntry_pt->adslAtucPerfPrev1DaySesL=0;
2763                         }
2764                         if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_PREV_1DAY_UASL_FLAG)){
2765                                 i=0;
2766                                 j=0;
2767                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2768                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2769                                         j+=mib_ptr->AtucPerfStatUasL;
2770                                         i++;
2771                                         if(i==96)
2772                                                 break;
2773                                 }       
2774                                 if(i==96)
2775                                         pts.atucPerfDataExtEntry_pt->adslAtucPerfPrev1DayUasL=j;
2776                                 else
2777                                         pts.atucPerfDataExtEntry_pt->adslAtucPerfPrev1DayUasL=0;
2778                         }
2779                         copy_to_user((char *)lon, (char *)pts.atucPerfDataExtEntry_pt, sizeof(atucPerfDataExtEntry));
2780                         kfree(pts.atucPerfDataExtEntry_pt);
2781                         break;
2782 #endif
2783                 case GET_ADSL_ATUR_PERF_DATA:
2784                         pts.aturPerfDataEntry_pt = (aturPerfDataEntry *)kmalloc(sizeof(aturPerfDataEntry), GFP_KERNEL);
2785                         copy_from_user((char *)pts.aturPerfDataEntry_pt, (char *)lon, sizeof(aturPerfDataEntry));
2786                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_LOFS_FLAG)){
2787                                 pts.aturPerfDataEntry_pt->adslAturPerfLofs=ATUR_PERF_LOFS;
2788                         }
2789                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_LOSS_FLAG)){
2790                                 pts.aturPerfDataEntry_pt->adslAturPerfLoss=ATUR_PERF_LOSS;
2791                         }
2792                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_LPR_FLAG)){
2793                                 pts.aturPerfDataEntry_pt->adslAturPerfLprs=ATUR_PERF_LPR;
2794                         }
2795                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_ESS_FLAG)){
2796                                 pts.aturPerfDataEntry_pt->adslAturPerfESs=ATUR_PERF_ESS;
2797                         }
2798                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_VALID_INTVLS_FLAG)){
2799                                 i=0;
2800                                 for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){
2801                                         i++;
2802                                         if(i==96)
2803                                                 break;
2804                                 }
2805                                 pts.aturPerfDataEntry_pt->adslAturPerfValidIntervals=i;
2806                         }
2807                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_INVALID_INTVLS_FLAG)){
2808                                 pts.aturPerfDataEntry_pt->adslAturPerfInvalidIntervals=0;
2809                         }
2810                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_15MIN_TIME_ELAPSED_FLAG)){
2811                                 do_gettimeofday(&time_now);
2812                                 pts.aturPerfDataEntry_pt->adslAturPerfCurr15MinTimeElapsed=time_now.tv_sec - (current_intvl->start_time).tv_sec;
2813                         }
2814                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_15MIN_LOFS_FLAG)){
2815                                 pts.aturPerfDataEntry_pt->adslAturPerfCurr15MinLofs=current_intvl->AturPerfLof;
2816                         }
2817                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_15MIN_LOSS_FLAG)){
2818                                 pts.aturPerfDataEntry_pt->adslAturPerfCurr15MinLoss=current_intvl->AturPerfLos;
2819                         }
2820                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_15MIN_LPR_FLAG)){
2821                                 pts.aturPerfDataEntry_pt->adslAturPerfCurr15MinLprs=current_intvl->AturPerfLpr;
2822                         }
2823                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_15MIN_ESS_FLAG)){
2824                                 pts.aturPerfDataEntry_pt->adslAturPerfCurr15MinESs=current_intvl->AturPerfEs;
2825                         }
2826                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_1DAY_TIME_ELAPSED_FLAG)){
2827                                 i=0;            
2828                                 for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){
2829                                         i+=900; 
2830                                 }
2831                                 do_gettimeofday(&time_now);
2832                                 i+=time_now.tv_sec - (current_intvl->start_time).tv_sec;
2833                                 if(i>=86400)
2834                                         pts.aturPerfDataEntry_pt->adslAturPerfCurr1DayTimeElapsed=i-86400;
2835                                 else
2836                                         pts.aturPerfDataEntry_pt->adslAturPerfCurr1DayTimeElapsed=i;            
2837                         }
2838                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_1DAY_LOFS_FLAG)){           
2839                                 i=0;
2840                                 j=0;
2841                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2842                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2843                                         j+=mib_ptr->AturPerfLof;
2844                                         i++;    
2845                                         if(i==96)
2846                                                 j=0;
2847                                 }
2848                                 j+=current_intvl->AturPerfLof;
2849                                 pts.aturPerfDataEntry_pt->adslAturPerfCurr1DayLofs=j;
2850                         }
2851                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_1DAY_LOSS_FLAG)){           
2852                                 i=0;
2853                                 j=0;
2854                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2855                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2856                                         j+=mib_ptr->AturPerfLos;
2857                                         i++;    
2858                                         if(i==96)
2859                                                 j=0;
2860                                 }
2861                                 j+=current_intvl->AturPerfLos;
2862                                 pts.aturPerfDataEntry_pt->adslAturPerfCurr1DayLoss=j;
2863                         }
2864                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_1DAY_LPR_FLAG)){            
2865                                 i=0;
2866                                 j=0;
2867                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2868                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2869                                         j+=mib_ptr->AturPerfLpr;
2870                                         i++;    
2871                                         if(i==96)
2872                                                 j=0;
2873                                 }
2874                                 j+=current_intvl->AturPerfLpr;
2875                                 pts.aturPerfDataEntry_pt->adslAturPerfCurr1DayLprs=j;
2876                         }
2877                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_1DAY_ESS_FLAG)){            
2878                                 i=0;
2879                                 j=0;
2880                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2881                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2882                                         j+=mib_ptr->AturPerfEs;
2883                                         i++;    
2884                                         if(i==96)
2885                                                 j=0;
2886                                 }
2887                                 j+=current_intvl->AturPerfEs;
2888                                 pts.aturPerfDataEntry_pt->adslAturPerfCurr1DayESs=j;
2889                         }
2890                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_PREV_1DAY_MON_SEC_FLAG)){                
2891                                 i=0;
2892                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2893                                         i++;            
2894                                 }
2895                                 if(i>=96)
2896                                         pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayMoniSecs=86400;
2897                                 else
2898                                         pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayMoniSecs=0;
2899                         }
2900                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_PREV_1DAY_LOFS_FLAG)){
2901                                 i=0;
2902                                 j=0;
2903                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2904                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2905                                         j+=mib_ptr->AturPerfLof;
2906                                         i++;
2907                                         if(i==96)
2908                                                 break;
2909                                 }       
2910                                 if(i==96)
2911                                         pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayLofs=j;
2912                                 else
2913                                         pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayLofs=0;
2914                         }
2915                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_PREV_1DAY_LOSS_FLAG)){
2916                                 i=0;
2917                                 j=0;
2918                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2919                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2920                                         j+=mib_ptr->AturPerfLos;
2921                                         i++;
2922                                         if(i==96)
2923                                                 break;
2924                                 }       
2925                                 if(i==96)
2926                                         pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayLoss=j;
2927                                 else
2928                                         pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayLoss=0;
2929                         }
2930                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_PREV_1DAY_LPR_FLAG)){
2931                                 i=0;
2932                                 j=0;
2933                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2934                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2935                                         j+=mib_ptr->AturPerfLpr;
2936                                         i++;
2937                                         if(i==96)
2938                                                 break;
2939                                 }       
2940                                 if(i==96)
2941                                         pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayLprs=j;
2942                                 else
2943                                         pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayLprs=0;
2944                         }
2945                         if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_PREV_1DAY_ESS_FLAG)){
2946                                 i=0;
2947                                 j=0;
2948                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2949                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2950                                         j+=mib_ptr->AturPerfEs;
2951                                         i++;
2952                                         if(i==96)
2953                                                 break;
2954                                 }       
2955                                 if(i==96)
2956                                         pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayESs=j;
2957                                 else
2958                                         pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayESs=0;
2959                         }               
2960                         
2961                         copy_to_user((char *)lon, (char *)pts.aturPerfDataEntry_pt, sizeof(aturPerfDataEntry));
2962                         kfree(pts.aturPerfDataEntry_pt);
2963                         break;
2964 #ifdef AMAZON_MEI_MIB_RFC3440
2965                 case GET_ADSL_ATUR_PERF_DATA_EXT:
2966                         pts.aturPerfDataExtEntry_pt = (aturPerfDataExtEntry *)kmalloc(sizeof(aturPerfDataExtEntry), GFP_KERNEL);
2967                         copy_from_user((char *)pts.aturPerfDataExtEntry_pt, (char *)lon, sizeof(aturPerfDataExtEntry));
2968                         if(IS_FLAG_SET((&(pts.aturPerfDataExtEntry_pt->flags)), ATUR_PERF_STAT_SESL_FLAG)){
2969                                 pts.aturPerfDataExtEntry_pt->adslAturPerfStatSesL=ATUR_PERF_STAT_SESL;
2970                         }       
2971                         if(IS_FLAG_SET((&(pts.aturPerfDataExtEntry_pt->flags)), ATUR_PERF_STAT_UASL_FLAG)){
2972                                 pts.aturPerfDataExtEntry_pt->adslAturPerfStatUasL=ATUR_PERF_STAT_UASL;
2973                         }
2974                         if(IS_FLAG_SET((&(pts.aturPerfDataExtEntry_pt->flags)), ATUR_PERF_CURR_15MIN_SESL_FLAG)){
2975                                 pts.aturPerfDataExtEntry_pt->adslAturPerfCurr15MinSesL=current_intvl->AturPerfStatSesL;
2976                         }       
2977                         if(IS_FLAG_SET((&(pts.aturPerfDataExtEntry_pt->flags)), ATUR_PERF_CURR_15MIN_UASL_FLAG)){
2978                                 pts.aturPerfDataExtEntry_pt->adslAturPerfCurr15MinUasL=current_intvl->AturPerfStatUasL;
2979                         }
2980                         if(IS_FLAG_SET((&(pts.aturPerfDataExtEntry_pt->flags)), ATUR_PERF_CURR_1DAY_SESL_FLAG)){
2981                                 i=0;
2982                                 j=0;
2983                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2984                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2985                                         j+=mib_ptr->AturPerfStatSesL;
2986                                         i++;    
2987                                         if(i==96)
2988                                                 j=0;
2989                                 }
2990                                 j+=current_intvl->AturPerfStatSesL;
2991                                 pts.aturPerfDataExtEntry_pt->adslAturPerfCurr1DaySesL=j;        
2992                         }       
2993                         if(IS_FLAG_SET((&(pts.aturPerfDataExtEntry_pt->flags)), ATUR_PERF_CURR_1DAY_UASL_FLAG)){
2994                                 i=0;
2995                                 j=0;
2996                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
2997                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
2998                                         j+=mib_ptr->AturPerfStatUasL;
2999                                         i++;    
3000                                         if(i==96)
3001                                                 j=0;
3002                                 }
3003                                 j+=current_intvl->AturPerfStatUasL;
3004                                 pts.aturPerfDataExtEntry_pt->adslAturPerfCurr1DayUasL=j;
3005                         }
3006                         if(IS_FLAG_SET((&(pts.aturPerfDataExtEntry_pt->flags)), ATUR_PERF_PREV_1DAY_SESL_FLAG)){
3007                                 i=0;
3008                                 j=0;
3009                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
3010                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
3011                                         j+=mib_ptr->AturPerfStatSesL;
3012                                         i++;
3013                                         if(i==96)
3014                                                 break;
3015                                 }       
3016                                 if(i==96)
3017                                         pts.aturPerfDataExtEntry_pt->adslAturPerfPrev1DaySesL=j;
3018                                 else
3019                                         pts.aturPerfDataExtEntry_pt->adslAturPerfPrev1DaySesL=0;        
3020                         }       
3021                         if(IS_FLAG_SET((&(pts.aturPerfDataExtEntry_pt->flags)), ATUR_PERF_PREV_1DAY_UASL_FLAG)){
3022                                 i=0;
3023                                 j=0;
3024                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
3025                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
3026                                         j+=mib_ptr->AturPerfStatUasL;
3027                                         i++;
3028                                         if(i==96)
3029                                                 break;
3030                                 }       
3031                                 if(i==96)
3032                                         pts.aturPerfDataExtEntry_pt->adslAturPerfPrev1DayUasL=j;
3033                                 else
3034                                         pts.aturPerfDataExtEntry_pt->adslAturPerfPrev1DayUasL=0;
3035                         }
3036                         copy_to_user((char *)lon, (char *)pts.aturPerfDataExtEntry_pt, sizeof(aturPerfDataExtEntry));
3037                         kfree(pts.aturPerfDataExtEntry_pt);
3038                         break;
3039 #endif
3040                 case GET_ADSL_ATUC_INTVL_INFO:
3041                         pts.adslAtucIntvlInfo_pt = (adslAtucIntvlInfo *)kmalloc(sizeof(adslAtucIntvlInfo), GFP_KERNEL);
3042                         copy_from_user((char *)pts.adslAtucIntvlInfo_pt, (char *)lon, sizeof(adslAtucIntvlInfo));
3043                         
3044                         if(pts.adslAtucIntvlInfo_pt->IntervalNumber <1){
3045                                 pts.adslAtucIntvlInfo_pt->intervalLOF = ATUC_PERF_LOFS;
3046                                 pts.adslAtucIntvlInfo_pt->intervalLOS = ATUC_PERF_LOSS;
3047                                 pts.adslAtucIntvlInfo_pt->intervalES = ATUC_PERF_ESS;
3048                                 pts.adslAtucIntvlInfo_pt->intervalInits = ATUC_PERF_INITS;
3049                                 pts.adslAtucIntvlInfo_pt->intervalValidData = 1;        
3050                         }
3051                         else{
3052                                 i=0;
3053                                 for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){
3054                                         i++;
3055                                         if(i==pts.adslAtucIntvlInfo_pt->IntervalNumber){
3056                                                 temp_intvl = list_entry(ptr, amazon_mei_mib, list);
3057                                                 pts.adslAtucIntvlInfo_pt->intervalLOF = temp_intvl->AtucPerfLof;
3058                                                 pts.adslAtucIntvlInfo_pt->intervalLOS = temp_intvl->AtucPerfLos;
3059                                                 pts.adslAtucIntvlInfo_pt->intervalES = temp_intvl->AtucPerfEs;
3060                                                 pts.adslAtucIntvlInfo_pt->intervalInits = temp_intvl->AtucPerfInit;
3061                                                 pts.adslAtucIntvlInfo_pt->intervalValidData = 1;
3062                                                 break;
3063                                         }               
3064                                 }
3065                                 if(ptr==&interval_list){
3066                                         pts.adslAtucIntvlInfo_pt->intervalValidData = 0;
3067                                         pts.adslAtucIntvlInfo_pt->flags = 0;
3068                                         pts.adslAtucIntvlInfo_pt->intervalLOF = 0;
3069                                         pts.adslAtucIntvlInfo_pt->intervalLOS = 0;
3070                                         pts.adslAtucIntvlInfo_pt->intervalES = 0;
3071                                         pts.adslAtucIntvlInfo_pt->intervalInits = 0;    
3072                                 }
3073                         }
3074                                                                         
3075                         copy_to_user((char *)lon, (char *)pts.adslAtucIntvlInfo_pt, sizeof(adslAtucIntvlInfo));
3076                         kfree(pts.adslAtucIntvlInfo_pt);
3077                         break;
3078 #ifdef AMAZON_MEI_MIB_RFC3440
3079                 case GET_ADSL_ATUC_INTVL_EXT_INFO:
3080                         pts.adslAtucInvtlExtInfo_pt = (adslAtucInvtlExtInfo *)kmalloc(sizeof(adslAtucInvtlExtInfo), GFP_KERNEL);
3081                         copy_from_user((char *)pts.adslAtucInvtlExtInfo_pt, (char *)lon, sizeof(adslAtucInvtlExtInfo));
3082                         if(pts.adslAtucInvtlExtInfo_pt->IntervalNumber <1){
3083                                 pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalFastR = ATUC_PERF_STAT_FASTR;
3084                                 pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalFailedFastR = ATUC_PERF_STAT_FAILED_FASTR;
3085                                 pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalSesL = ATUC_PERF_STAT_SESL;
3086                                 pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalUasL = ATUC_PERF_STAT_UASL;
3087 //                              pts.adslAtucInvtlExtInfo_pt->intervalValidData = 1;     
3088                         }
3089                         else{
3090                                 i=0;
3091                                 for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){
3092                                         i++;
3093                                         if(i==pts.adslAtucInvtlExtInfo_pt->IntervalNumber){
3094                                                 temp_intvl = list_entry(ptr, amazon_mei_mib, list);
3095                                                 pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalFastR = temp_intvl->AtucPerfStatFastR;
3096                                                 pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalFailedFastR = temp_intvl->AtucPerfStatFailedFastR;
3097                                                 pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalSesL = temp_intvl->AtucPerfStatSesL;
3098                                                 pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalUasL = temp_intvl->AtucPerfStatUasL;
3099 //                                              pts.adslAtucInvtlExtInfo_pt->intervalValidData = 1;
3100                                                 break;
3101                                         }               
3102                                 } 
3103                                 if(ptr==&interval_list){
3104 //                                      pts.adslAtucInvtlExtInfo_pt->intervalValidData = 0;
3105                                         pts.adslAtucInvtlExtInfo_pt->flags = 0; 
3106                                         pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalFastR = 0;
3107                                         pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalFailedFastR = 0;
3108                                         pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalSesL = 0;
3109                                         pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalUasL = 0;
3110                                 }
3111                         }
3112                         copy_to_user((char *)lon, (char *)pts.adslAtucInvtlExtInfo_pt, sizeof(adslAtucInvtlExtInfo));
3113                         kfree(pts.adslAtucInvtlExtInfo_pt);
3114                         break;
3115 #endif
3116                 case GET_ADSL_ATUR_INTVL_INFO:
3117                         pts.adslAturIntvlInfo_pt = (adslAturIntvlInfo *)kmalloc(sizeof(adslAturIntvlInfo), GFP_KERNEL);
3118                         copy_from_user((char *)pts.adslAturIntvlInfo_pt, (char *)lon, sizeof(adslAturIntvlInfo));
3119                         
3120                         if(pts.adslAturIntvlInfo_pt->IntervalNumber <1){
3121                                 pts.adslAturIntvlInfo_pt->intervalLOF = ATUR_PERF_LOFS;
3122                                 pts.adslAturIntvlInfo_pt->intervalLOS = ATUR_PERF_LOSS;
3123                                 pts.adslAturIntvlInfo_pt->intervalES = ATUR_PERF_ESS;
3124                                 pts.adslAturIntvlInfo_pt->intervalLPR = ATUR_PERF_LPR;
3125                                 pts.adslAturIntvlInfo_pt->intervalValidData = 1;        
3126                         }
3127                         else{
3128                                 i=0;
3129                                 for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){
3130                                         i++;
3131                                         if(i==pts.adslAturIntvlInfo_pt->IntervalNumber){
3132                                                 temp_intvl = list_entry(ptr, amazon_mei_mib, list);
3133                                                 pts.adslAturIntvlInfo_pt->intervalLOF = temp_intvl->AturPerfLof;
3134                                                 pts.adslAturIntvlInfo_pt->intervalLOS = temp_intvl->AturPerfLos;
3135                                                 pts.adslAturIntvlInfo_pt->intervalES = temp_intvl->AturPerfEs;
3136                                                 pts.adslAturIntvlInfo_pt->intervalLPR = temp_intvl->AturPerfLpr;
3137                                                 pts.adslAturIntvlInfo_pt->intervalValidData = 1;
3138                                                 break;
3139                                         }               
3140                                 }
3141                                 if(ptr==&interval_list){
3142                                         pts.adslAturIntvlInfo_pt->intervalValidData = 0;
3143                                         pts.adslAturIntvlInfo_pt->flags = 0;
3144                                         pts.adslAturIntvlInfo_pt->intervalLOF = 0;
3145                                         pts.adslAturIntvlInfo_pt->intervalLOS = 0;
3146                                         pts.adslAturIntvlInfo_pt->intervalES = 0;
3147                                         pts.adslAturIntvlInfo_pt->intervalLPR = 0;      
3148                                 }
3149                         }
3150                         
3151                         copy_to_user((char *)lon, (char *)pts.adslAturIntvlInfo_pt, sizeof(adslAturIntvlInfo));
3152                         kfree(pts.adslAturIntvlInfo_pt);
3153                         break;
3154 #ifdef AMAZON_MEI_MIB_RFC3440
3155                 case GET_ADSL_ATUR_INTVL_EXT_INFO:
3156                         pts.adslAturInvtlExtInfo_pt = (adslAturInvtlExtInfo *)kmalloc(sizeof(adslAturInvtlExtInfo), GFP_KERNEL);
3157                         copy_from_user((char *)pts.adslAturInvtlExtInfo_pt, (char *)lon, sizeof(adslAturInvtlExtInfo));
3158                         
3159                         if(pts.adslAturInvtlExtInfo_pt->IntervalNumber <1){
3160                                 pts.adslAturInvtlExtInfo_pt->adslAturIntervalSesL = ATUR_PERF_STAT_SESL;
3161                                 pts.adslAturInvtlExtInfo_pt->adslAturIntervalUasL = ATUR_PERF_STAT_UASL;
3162 //                              pts.adslAturInvtlExtInfo_pt->intervalValidData = 1;
3163                         }
3164                         else{
3165                                 i=0;
3166                                 for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){
3167                                         i++;
3168                                         if(i==pts.adslAturInvtlExtInfo_pt->IntervalNumber){
3169                                                 temp_intvl = list_entry(ptr, amazon_mei_mib, list);
3170                                                 pts.adslAturInvtlExtInfo_pt->adslAturIntervalSesL = temp_intvl->AturPerfStatSesL;
3171                                                 pts.adslAturInvtlExtInfo_pt->adslAturIntervalUasL = temp_intvl->AturPerfStatUasL;
3172 //                                              pts.adslAturInvtlExtInfo_pt->intervalValidData = 1;
3173                                                 break; 
3174                                         }               
3175                                 }
3176                                 if(ptr==&interval_list){
3177 //                                      pts.adslAturInvtlExtInfo_pt->intervalValidData = 0;
3178                                         pts.adslAturInvtlExtInfo_pt->flags = 0; 
3179                                         pts.adslAturInvtlExtInfo_pt->adslAturIntervalSesL = 0;
3180                                         pts.adslAturInvtlExtInfo_pt->adslAturIntervalUasL = 0; 
3181                                 }
3182                         }
3183                         
3184                         copy_to_user((char *)lon, (char *)pts.adslAturInvtlExtInfo_pt, sizeof(adslAturInvtlExtInfo));
3185                         kfree(pts.adslAturInvtlExtInfo_pt);
3186                         break;
3187 #endif
3188                 case GET_ADSL_ATUC_CHAN_PERF_DATA:
3189                         pts.atucChannelPerfDataEntry_pt = (atucChannelPerfDataEntry *)kmalloc(sizeof(atucChannelPerfDataEntry), GFP_KERNEL);
3190                         copy_from_user((char *)pts.atucChannelPerfDataEntry_pt, (char *)lon, sizeof(atucChannelPerfDataEntry));
3191         
3192                         pts.atucChannelPerfDataEntry_pt->flags = 0;
3193                         
3194                         copy_to_user((char *)lon, (char *)pts.atucChannelPerfDataEntry_pt, sizeof(atucChannelPerfDataEntry));
3195                         kfree(pts.atucChannelPerfDataEntry_pt);
3196                         break;
3197                 case GET_ADSL_ATUR_CHAN_PERF_DATA:
3198                         pts.aturChannelPerfDataEntry_pt = (aturChannelPerfDataEntry *)kmalloc(sizeof(aturChannelPerfDataEntry), GFP_KERNEL);
3199                         copy_from_user((char *)pts.aturChannelPerfDataEntry_pt, (char *)lon, sizeof(aturChannelPerfDataEntry));
3200                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_RECV_BLK_FLAG)){
3201                                 pts.aturChannelPerfDataEntry_pt->adslAturChanReceivedBlks=ATUR_CHAN_RECV_BLK;
3202                         }
3203                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_TX_BLK_FLAG)){
3204                                 pts.aturChannelPerfDataEntry_pt->adslAturChanTransmittedBlks=ATUR_CHAN_TX_BLK;
3205                         }
3206                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_CORR_BLK_FLAG)){
3207                                 pts.aturChannelPerfDataEntry_pt->adslAturChanCorrectedBlks=ATUR_CHAN_CORR_BLK;
3208                         }
3209                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_UNCORR_BLK_FLAG)){
3210                                 pts.aturChannelPerfDataEntry_pt->adslAturChanUncorrectBlks=ATUR_CHAN_UNCORR_BLK;
3211                         }
3212                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_VALID_INTVL_FLAG)){
3213                                 i=0;
3214                                 for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){
3215                                         i++;
3216                                         if(i==96)
3217                                                 break;
3218                                 }
3219                                 pts.aturChannelPerfDataEntry_pt->adslAturChanPerfValidIntervals=i;
3220                         }
3221                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_INVALID_INTVL_FLAG)){
3222                                 pts.aturChannelPerfDataEntry_pt->adslAturChanPerfInvalidIntervals=0;
3223                         }
3224                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_15MIN_TIME_ELAPSED_FLAG)){
3225                                 do_gettimeofday(&time_now);
3226                                 pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr15MinTimeElapsed=time_now.tv_sec - (current_intvl->start_time).tv_sec;
3227                         }
3228                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_15MIN_RECV_BLK_FLAG)){
3229                                 pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr15MinReceivedBlks=current_intvl->AturChanPerfRxBlk;
3230                         }
3231                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_15MIN_TX_BLK_FLAG)){
3232                                 pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr15MinTransmittedBlks=current_intvl->AturChanPerfTxBlk;
3233                         }
3234                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_15MIN_CORR_BLK_FLAG)){
3235                                 pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr15MinCorrectedBlks=current_intvl->AturChanPerfCorrBlk;
3236                         }
3237                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_15MIN_UNCORR_BLK_FLAG)){
3238                                 pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr15MinUncorrectBlks=current_intvl->AturChanPerfUncorrBlk;
3239                         }
3240                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_1DAY_TIME_ELAPSED_FLAG)){
3241                                 i=0;            
3242                                 for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){
3243                                         i+=900; 
3244                                 }
3245                                 do_gettimeofday(&time_now);
3246                                 i+=time_now.tv_sec - (current_intvl->start_time).tv_sec;
3247                                 if(i>=86400)
3248                                         pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr1DayTimeElapsed=i-86400;
3249                                 else
3250                                         pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr1DayTimeElapsed=i;         
3251                         }
3252                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_1DAY_RECV_BLK_FLAG)){           
3253                                 i=0;
3254                                 j=0;
3255                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
3256                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
3257                                         j+=mib_ptr->AturChanPerfRxBlk;
3258                                         i++;    
3259                                         if(i==96)
3260                                                 j=0;
3261                                 }
3262                                 j+=current_intvl->AturChanPerfRxBlk;
3263                                 pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr1DayReceivedBlks=j;
3264                         }
3265                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_1DAY_TX_BLK_FLAG)){             
3266                                 i=0;
3267                                 j=0;
3268                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
3269                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
3270                                         j+=mib_ptr->AturChanPerfTxBlk;
3271                                         i++;    
3272                                         if(i==96)
3273                                                 j=0;
3274                                 }
3275                                 j+=current_intvl->AturChanPerfTxBlk;
3276                                 pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr1DayTransmittedBlks=j;
3277                         }
3278                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_1DAY_CORR_BLK_FLAG)){           
3279                                 i=0;
3280                                 j=0;
3281                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
3282                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
3283                                         j+=mib_ptr->AturChanPerfCorrBlk;
3284                                         i++;    
3285                                         if(i==96)
3286                                                 j=0;
3287                                 }
3288                                 j+=current_intvl->AturChanPerfCorrBlk;
3289                                 pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr1DayCorrectedBlks=j;
3290                         }
3291                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_1DAY_UNCORR_BLK_FLAG)){         
3292                                 i=0;
3293                                 j=0;
3294                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
3295                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
3296                                         j+=mib_ptr->AturChanPerfUncorrBlk;
3297                                         i++;    
3298                                         if(i==96)
3299                                                 j=0;
3300                                 }
3301                                 j+=current_intvl->AturChanPerfUncorrBlk;
3302                                 pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr1DayUncorrectBlks=j;
3303                         }
3304                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_PREV_1DAY_MONI_SEC_FLAG)){           
3305                                 i=0;
3306                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
3307                                         i++;            
3308                                 }
3309                                 if(i>=96)
3310                                         pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayMoniSecs=86400;
3311                                 else
3312                                         pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayMoniSecs=0;
3313                         }
3314                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_PREV_1DAY_RECV_BLK_FLAG)){
3315                                 i=0;
3316                                 j=0;
3317                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
3318                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
3319                                         j+=mib_ptr->AturChanPerfRxBlk;
3320                                         i++;
3321                                         if(i==96)
3322                                                 break;
3323                                 }       
3324                                 if(i==96)
3325                                         pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayReceivedBlks=j;
3326                                 else
3327                                         pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayReceivedBlks=0;
3328                         }
3329                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_PREV_1DAY_TRANS_BLK_FLAG)){
3330                                 i=0;
3331                                 j=0;
3332                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
3333                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
3334                                         j+=mib_ptr->AturChanPerfTxBlk;
3335                                         i++;
3336                                         if(i==96)
3337                                                 break;
3338                                 }       
3339                                 if(i==96)
3340                                         pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayTransmittedBlks=j;
3341                                 else
3342                                         pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayTransmittedBlks=0;
3343                         }
3344                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_PREV_1DAY_CORR_BLK_FLAG)){
3345                                 i=0;
3346                                 j=0;
3347                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
3348                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
3349                                         j+=mib_ptr->AturChanPerfCorrBlk;
3350                                         i++;
3351                                         if(i==96)
3352                                                 break;
3353                                 }       
3354                                 if(i==96)
3355                                         pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayCorrectedBlks=j;
3356                                 else
3357                                         pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayCorrectedBlks=0;
3358                         }
3359                         if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_PREV_1DAY_UNCORR_BLK_FLAG)){
3360                                 i=0;
3361                                 j=0;
3362                                 for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){
3363                                         mib_ptr = list_entry(ptr, amazon_mei_mib, list);
3364                                         j+=mib_ptr->AturChanPerfUncorrBlk;
3365                                         i++;
3366                                         if(i==96)
3367                                                 break;
3368                                 }       
3369                                 if(i==96)
3370                                         pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayUncorrectBlks=j;
3371                                 else
3372                                         pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayUncorrectBlks=0;
3373                         }
3374                         
3375                         copy_to_user((char *)lon, (char *)pts.aturChannelPerfDataEntry_pt, sizeof(aturChannelPerfDataEntry));
3376                         kfree(pts.aturChannelPerfDataEntry_pt);
3377                         break;
3378                 case GET_ADSL_ATUC_CHAN_INTVL_INFO:
3379                         pts.adslAtucChanIntvlInfo_pt = (adslAtucChanIntvlInfo *)kmalloc(sizeof(adslAtucChanIntvlInfo), GFP_KERNEL);
3380                         copy_from_user((char *)pts.adslAtucChanIntvlInfo_pt, (char *)lon, sizeof(adslAtucChanIntvlInfo));
3381                                 
3382                                 pts.adslAtucChanIntvlInfo_pt->flags = 0;
3383                                 
3384                         copy_to_user((char *)lon, (char *)pts.adslAtucChanIntvlInfo_pt, sizeof(adslAtucChanIntvlInfo));
3385                         kfree(pts.adslAtucChanIntvlInfo_pt);
3386                         break;
3387                 case GET_ADSL_ATUR_CHAN_INTVL_INFO:
3388                         pts.adslAturChanIntvlInfo_pt = (adslAturChanIntvlInfo *)kmalloc(sizeof(adslAturChanIntvlInfo), GFP_KERNEL);
3389                         copy_from_user((char *)pts.adslAturChanIntvlInfo_pt, (char *)lon, sizeof(adslAturChanIntvlInfo));
3390                         
3391                         if(pts.adslAturChanIntvlInfo_pt->IntervalNumber <1){
3392                                 pts.adslAturChanIntvlInfo_pt->chanIntervalRecvdBlks = ATUR_CHAN_RECV_BLK;
3393                                 pts.adslAturChanIntvlInfo_pt->chanIntervalXmitBlks = ATUR_CHAN_TX_BLK;
3394                                 pts.adslAturChanIntvlInfo_pt->chanIntervalCorrectedBlks = ATUR_CHAN_CORR_BLK;
3395                                 pts.adslAturChanIntvlInfo_pt->chanIntervalUncorrectBlks = ATUR_CHAN_UNCORR_BLK;
3396                                 pts.adslAturChanIntvlInfo_pt->intervalValidData = 1;
3397                         }
3398                         else{
3399                                 i=0;
3400                                 for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){
3401                                         i++;
3402                                         if(i==pts.adslAturChanIntvlInfo_pt->IntervalNumber){
3403                                                 temp_intvl = list_entry(ptr, amazon_mei_mib, list);
3404                                                 pts.adslAturChanIntvlInfo_pt->chanIntervalRecvdBlks = temp_intvl->AturChanPerfRxBlk;
3405                                                 pts.adslAturChanIntvlInfo_pt->chanIntervalXmitBlks = temp_intvl->AturChanPerfTxBlk;
3406                                                 pts.adslAturChanIntvlInfo_pt->chanIntervalCorrectedBlks = temp_intvl->AturChanPerfCorrBlk;
3407                                                 pts.adslAturChanIntvlInfo_pt->chanIntervalUncorrectBlks = temp_intvl->AturChanPerfUncorrBlk;
3408                                                 pts.adslAturChanIntvlInfo_pt->intervalValidData = 1;
3409                                                 break;
3410                                         }               
3411                                 }
3412                                 if(ptr==&interval_list){
3413                                         pts.adslAturChanIntvlInfo_pt->intervalValidData = 0;
3414                                         pts.adslAturChanIntvlInfo_pt->flags = 0;        
3415                                 }
3416                         }
3417                         
3418                         copy_to_user((char *)lon, (char *)pts.adslAturChanIntvlInfo_pt, sizeof(adslAturChanIntvlInfo));
3419                         kfree(pts.adslAturChanIntvlInfo_pt);
3420                         break;
3421                 case GET_ADSL_ALRM_CONF_PROF:
3422                         pts.adslLineAlarmConfProfileEntry_pt = (adslLineAlarmConfProfileEntry *)kmalloc(sizeof(adslLineAlarmConfProfileEntry), GFP_KERNEL);
3423                         copy_from_user((char *)pts.adslLineAlarmConfProfileEntry_pt, (char *)lon, sizeof(adslLineAlarmConfProfileEntry));
3424                         
3425                         strncpy(pts.adslLineAlarmConfProfileEntry_pt->adslLineAlarmConfProfileName, AlarmConfProfile.adslLineAlarmConfProfileName, 32); 
3426                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_15MIN_LOFS_FLAG)){
3427                                 pts.adslLineAlarmConfProfileEntry_pt->adslAtucThresh15MinLofs=AlarmConfProfile.adslAtucThresh15MinLofs;
3428                         }
3429                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_15MIN_LOSS_FLAG)){
3430                                 pts.adslLineAlarmConfProfileEntry_pt->adslAtucThresh15MinLoss=AlarmConfProfile.adslAtucThresh15MinLoss;
3431                         }
3432                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_15MIN_ESS_FLAG)){
3433                                 pts.adslLineAlarmConfProfileEntry_pt->adslAtucThresh15MinESs=AlarmConfProfile.adslAtucThresh15MinESs;
3434                         }
3435                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_FAST_RATEUP_FLAG)){
3436                                 pts.adslLineAlarmConfProfileEntry_pt->adslAtucThreshFastRateUp=AlarmConfProfile.adslAtucThreshFastRateUp;
3437                         }
3438                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_INTERLEAVE_RATEUP_FLAG)){
3439                                 pts.adslLineAlarmConfProfileEntry_pt->adslAtucThreshInterleaveRateUp=AlarmConfProfile.adslAtucThreshInterleaveRateUp;
3440                         }
3441                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_FAST_RATEDOWN_FLAG)){
3442                                 pts.adslLineAlarmConfProfileEntry_pt->adslAtucThreshFastRateDown=AlarmConfProfile.adslAtucThreshFastRateDown;
3443                         }
3444                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_INTERLEAVE_RATEDOWN_FLAG)){
3445                                 pts.adslLineAlarmConfProfileEntry_pt->adslAtucThreshInterleaveRateDown=AlarmConfProfile.adslAtucThreshInterleaveRateDown;
3446                         }
3447                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_INIT_FAILURE_TRAP_ENABLE_FLAG)){
3448                                 pts.adslLineAlarmConfProfileEntry_pt->adslAtucInitFailureTrapEnable=AlarmConfProfile.adslAtucInitFailureTrapEnable;
3449                         }
3450                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_15MIN_LOFS_FLAG)){
3451                                 pts.adslLineAlarmConfProfileEntry_pt->adslAturThresh15MinLofs=AlarmConfProfile.adslAturThresh15MinLofs;
3452                         }
3453                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_15MIN_LOSS_FLAG)){
3454                                 pts.adslLineAlarmConfProfileEntry_pt->adslAturThresh15MinLoss=AlarmConfProfile.adslAturThresh15MinLoss;
3455                         }
3456                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_15MIN_LPRS_FLAG)){
3457                                 pts.adslLineAlarmConfProfileEntry_pt->adslAturThresh15MinLprs=AlarmConfProfile.adslAturThresh15MinLprs;
3458                         }
3459                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_15MIN_ESS_FLAG)){
3460                                 pts.adslLineAlarmConfProfileEntry_pt->adslAturThresh15MinESs=AlarmConfProfile.adslAturThresh15MinESs;
3461                         }
3462                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_FAST_RATEUP_FLAG)){
3463                                 pts.adslLineAlarmConfProfileEntry_pt->adslAturThreshFastRateUp=AlarmConfProfile.adslAturThreshFastRateUp;
3464                         }
3465                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_INTERLEAVE_RATEUP_FLAG)){
3466                                 pts.adslLineAlarmConfProfileEntry_pt->adslAturThreshInterleaveRateUp=AlarmConfProfile.adslAturThreshInterleaveRateUp;
3467                         }
3468                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_FAST_RATEDOWN_FLAG)){
3469                                 pts.adslLineAlarmConfProfileEntry_pt->adslAturThreshFastRateDown=AlarmConfProfile.adslAturThreshFastRateDown;
3470                         }
3471                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_INTERLEAVE_RATEDOWN_FLAG)){
3472                                 pts.adslLineAlarmConfProfileEntry_pt->adslAturThreshInterleaveRateDown=AlarmConfProfile.adslAturThreshInterleaveRateDown;
3473                         }
3474                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), LINE_ALARM_CONF_PROFILE_ROWSTATUS_FLAG)){
3475                                 pts.adslLineAlarmConfProfileEntry_pt->adslLineAlarmConfProfileRowStatus=AlarmConfProfile.adslLineAlarmConfProfileRowStatus;
3476                         }
3477                         copy_to_user((char *)lon, (char *)pts.adslLineAlarmConfProfileEntry_pt, sizeof(adslLineAlarmConfProfileEntry));
3478                         kfree(pts.adslLineAlarmConfProfileEntry_pt);
3479                         break;
3480 #ifdef AMAZON_MEI_MIB_RFC3440
3481                 case GET_ADSL_ALRM_CONF_PROF_EXT:
3482                         pts.adslLineAlarmConfProfileExtEntry_pt = (adslLineAlarmConfProfileExtEntry *)kmalloc(sizeof(adslLineAlarmConfProfileExtEntry), GFP_KERNEL);
3483                         copy_from_user((char *)pts.adslLineAlarmConfProfileExtEntry_pt, (char *)lon, sizeof(adslLineAlarmConfProfileExtEntry));
3484                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUC_THRESH_15MIN_FAILED_FASTR_FLAG)){
3485                                 pts.adslLineAlarmConfProfileExtEntry_pt->adslAtucThreshold15MinFailedFastR=AlarmConfProfileExt.adslAtucThreshold15MinFailedFastR;
3486                         }
3487                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUC_THRESH_15MIN_SESL_FLAG)){
3488                                 pts.adslLineAlarmConfProfileExtEntry_pt->adslAtucThreshold15MinSesL=AlarmConfProfileExt.adslAtucThreshold15MinSesL;
3489                         }
3490                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUC_THRESH_15MIN_UASL_FLAG)){
3491                                 pts.adslLineAlarmConfProfileExtEntry_pt->adslAtucThreshold15MinUasL=AlarmConfProfileExt.adslAtucThreshold15MinUasL;
3492                         }
3493                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUR_THRESH_15MIN_SESL_FLAG)){
3494                                 pts.adslLineAlarmConfProfileExtEntry_pt->adslAturThreshold15MinSesL=AlarmConfProfileExt.adslAturThreshold15MinSesL;
3495                         }
3496                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUR_THRESH_15MIN_UASL_FLAG)){
3497                                 pts.adslLineAlarmConfProfileExtEntry_pt->adslAturThreshold15MinUasL=AlarmConfProfileExt.adslAturThreshold15MinUasL;
3498                         }
3499                         copy_to_user((char *)lon, (char *)pts.adslLineAlarmConfProfileExtEntry_pt, sizeof(adslLineAlarmConfProfileExtEntry));
3500                         kfree(pts.adslLineAlarmConfProfileExtEntry_pt);
3501                         break;
3502 #endif
3503                 case SET_ADSL_ALRM_CONF_PROF:
3504                         pts.adslLineAlarmConfProfileEntry_pt = (adslLineAlarmConfProfileEntry *)kmalloc(sizeof(adslLineAlarmConfProfileEntry), GFP_KERNEL);
3505                         copy_from_user((char *)pts.adslLineAlarmConfProfileEntry_pt, (char *)lon, sizeof(adslLineAlarmConfProfileEntry));
3506
3507                         strncpy(AlarmConfProfile.adslLineAlarmConfProfileName, pts.adslLineAlarmConfProfileEntry_pt->adslLineAlarmConfProfileName, 32);
3508                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_15MIN_LOFS_FLAG)){
3509                                 AlarmConfProfile.adslAtucThresh15MinLofs=pts.adslLineAlarmConfProfileEntry_pt->adslAtucThresh15MinLofs;
3510                         }
3511                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_15MIN_LOSS_FLAG)){
3512                                 AlarmConfProfile.adslAtucThresh15MinLoss=pts.adslLineAlarmConfProfileEntry_pt->adslAtucThresh15MinLoss;
3513                         }
3514                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_15MIN_ESS_FLAG)){
3515                                 AlarmConfProfile.adslAtucThresh15MinESs=pts.adslLineAlarmConfProfileEntry_pt->adslAtucThresh15MinESs;
3516                         }
3517                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_FAST_RATEUP_FLAG)){
3518                                 AlarmConfProfile.adslAtucThreshFastRateUp=pts.adslLineAlarmConfProfileEntry_pt->adslAtucThreshFastRateUp;
3519                         }
3520                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_INTERLEAVE_RATEUP_FLAG)){
3521                                 AlarmConfProfile.adslAtucThreshInterleaveRateUp=pts.adslLineAlarmConfProfileEntry_pt->adslAtucThreshInterleaveRateUp;
3522                         }
3523                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_FAST_RATEDOWN_FLAG)){
3524                                 AlarmConfProfile.adslAtucThreshFastRateDown=pts.adslLineAlarmConfProfileEntry_pt->adslAtucThreshFastRateDown;
3525                         }
3526                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_INTERLEAVE_RATEDOWN_FLAG)){
3527                                 AlarmConfProfile.adslAtucThreshInterleaveRateDown=pts.adslLineAlarmConfProfileEntry_pt->adslAtucThreshInterleaveRateDown;
3528                         }
3529                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_INIT_FAILURE_TRAP_ENABLE_FLAG)){
3530                                 AlarmConfProfile.adslAtucInitFailureTrapEnable=pts.adslLineAlarmConfProfileEntry_pt->adslAtucInitFailureTrapEnable;
3531                         }
3532                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_15MIN_LOFS_FLAG)){
3533                                 AlarmConfProfile.adslAturThresh15MinLofs=pts.adslLineAlarmConfProfileEntry_pt->adslAturThresh15MinLofs;
3534                         }
3535                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_15MIN_LOSS_FLAG)){
3536                                 AlarmConfProfile.adslAturThresh15MinLoss=pts.adslLineAlarmConfProfileEntry_pt->adslAturThresh15MinLoss;
3537                         }
3538                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_15MIN_LPRS_FLAG)){
3539                                 AlarmConfProfile.adslAturThresh15MinLprs=pts.adslLineAlarmConfProfileEntry_pt->adslAturThresh15MinLprs;
3540                         }
3541                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_15MIN_ESS_FLAG)){
3542                                 AlarmConfProfile.adslAturThresh15MinESs=pts.adslLineAlarmConfProfileEntry_pt->adslAturThresh15MinESs;
3543                         }
3544                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_FAST_RATEUP_FLAG)){
3545                                 AlarmConfProfile.adslAturThreshFastRateUp=pts.adslLineAlarmConfProfileEntry_pt->adslAturThreshFastRateUp;
3546                         }
3547                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_INTERLEAVE_RATEUP_FLAG)){
3548                                 AlarmConfProfile.adslAturThreshInterleaveRateUp=pts.adslLineAlarmConfProfileEntry_pt->adslAturThreshInterleaveRateUp;
3549                         }
3550                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_FAST_RATEDOWN_FLAG)){
3551                                 AlarmConfProfile.adslAturThreshFastRateDown=pts.adslLineAlarmConfProfileEntry_pt->adslAturThreshFastRateDown;
3552                         }
3553                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_INTERLEAVE_RATEDOWN_FLAG)){
3554                                 AlarmConfProfile.adslAturThreshInterleaveRateDown=pts.adslLineAlarmConfProfileEntry_pt->adslAturThreshInterleaveRateDown;
3555                         }
3556                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), LINE_ALARM_CONF_PROFILE_ROWSTATUS_FLAG)){
3557                                 AlarmConfProfile.adslLineAlarmConfProfileRowStatus=pts.adslLineAlarmConfProfileEntry_pt->adslLineAlarmConfProfileRowStatus;
3558                         }
3559                         copy_to_user((char *)lon, (char *)pts.adslLineAlarmConfProfileEntry_pt, sizeof(adslLineAlarmConfProfileEntry));
3560                         kfree(pts.adslLineAlarmConfProfileEntry_pt);
3561                         break;
3562                         
3563 #ifdef AMAZON_MEI_MIB_RFC3440
3564                 case SET_ADSL_ALRM_CONF_PROF_EXT:
3565                         pts.adslLineAlarmConfProfileExtEntry_pt = (adslLineAlarmConfProfileExtEntry *)kmalloc(sizeof(adslLineAlarmConfProfileExtEntry), GFP_KERNEL);
3566                         copy_from_user((char *)pts.adslLineAlarmConfProfileExtEntry_pt, (char *)lon, sizeof(adslLineAlarmConfProfileExtEntry));
3567                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUC_THRESH_15MIN_FAILED_FASTR_FLAG)){
3568                                 AlarmConfProfileExt.adslAtucThreshold15MinFailedFastR=pts.adslLineAlarmConfProfileExtEntry_pt->adslAtucThreshold15MinFailedFastR;
3569                         }
3570                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUC_THRESH_15MIN_SESL_FLAG)){
3571                                 AlarmConfProfileExt.adslAtucThreshold15MinSesL=pts.adslLineAlarmConfProfileExtEntry_pt->adslAtucThreshold15MinSesL;
3572                         }
3573                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUC_THRESH_15MIN_UASL_FLAG)){
3574                                 AlarmConfProfileExt.adslAtucThreshold15MinUasL=pts.adslLineAlarmConfProfileExtEntry_pt->adslAtucThreshold15MinUasL;
3575                         }
3576                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUR_THRESH_15MIN_SESL_FLAG)){
3577                                 AlarmConfProfileExt.adslAturThreshold15MinSesL=pts.adslLineAlarmConfProfileExtEntry_pt->adslAturThreshold15MinSesL;
3578                         }
3579                         if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUR_THRESH_15MIN_UASL_FLAG)){
3580                                 AlarmConfProfileExt.adslAturThreshold15MinUasL=pts.adslLineAlarmConfProfileExtEntry_pt->adslAturThreshold15MinUasL;
3581                         }
3582                         copy_to_user((char *)lon, (char *)pts.adslLineAlarmConfProfileExtEntry_pt, sizeof(adslLineAlarmConfProfileExtEntry));
3583                         kfree(pts.adslLineAlarmConfProfileExtEntry_pt);
3584                         break;
3585 #endif
3586
3587                 case ADSL_ATUR_TRAPS:
3588                         if(down_interruptible(&mei_sema))
3589                                 return -ERESTARTSYS;
3590                         
3591                         trapsflag=0;
3592                         if(AlarmConfProfile.adslAtucThresh15MinLofs!=0 && current_intvl->AtucPerfLof>=AlarmConfProfile.adslAtucThresh15MinLofs)
3593                                 trapsflag|=ATUC_PERF_LOFS_THRESH_FLAG;
3594                         if(AlarmConfProfile.adslAtucThresh15MinLoss!=0 && current_intvl->AtucPerfLos>=AlarmConfProfile.adslAtucThresh15MinLoss)
3595                                 trapsflag|=ATUC_PERF_LOSS_THRESH_FLAG;
3596                         if(AlarmConfProfile.adslAtucThresh15MinESs!=0 && current_intvl->AtucPerfEs>=AlarmConfProfile.adslAtucThresh15MinESs)
3597                                 trapsflag|=ATUC_PERF_ESS_THRESH_FLAG;
3598                         if(chantype.fast==1){
3599                                 if(AlarmConfProfile.adslAtucThreshFastRateUp!=0 || AlarmConfProfile.adslAtucThreshFastRateDown!=0){
3600                                         ATUC_CHAN_CURR_TX_RATE_FLAG_MAKECMV;
3601                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3602 #ifdef AMAZON_MEI_DEBUG_ON
3603                                                 printk("\n\nCMV fail, Group 6 Address 1 Index 0");
3604 #endif                  
3605                                         }
3606                                         else{
3607                                                 temp = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16); 
3608                                                 if((AlarmConfProfile.adslAtucThreshFastRateUp!=0) && (temp>=PrevTxRate.adslAtucChanPrevTxRate+AlarmConfProfile.adslAtucThreshFastRateUp)){
3609                                                         trapsflag|=ATUC_RATE_CHANGE_FLAG;
3610                                                         PrevTxRate.adslAtucChanPrevTxRate = temp;                                               
3611                                                 }
3612                                                 if((AlarmConfProfile.adslAtucThreshFastRateDown!=0) && (temp<=PrevTxRate.adslAtucChanPrevTxRate-AlarmConfProfile.adslAtucThreshFastRateDown)){
3613                                                         trapsflag|=ATUC_RATE_CHANGE_FLAG;
3614                                                         PrevTxRate.adslAtucChanPrevTxRate = temp;                                               
3615                                                 }
3616                                         }
3617                                 }
3618                         }       
3619                         if(chantype.interleave==1){
3620                                 if(AlarmConfProfile.adslAtucThreshInterleaveRateUp!=0 || AlarmConfProfile.adslAtucThreshInterleaveRateDown!=0){
3621                                         ATUC_CHAN_CURR_TX_RATE_FLAG_MAKECMV;
3622                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3623 #ifdef AMAZON_MEI_DEBUG_ON
3624                                                 printk("\n\nCMV fail, Group 6 Address 1 Index 0");
3625 #endif                  
3626                                         }
3627                                         else{
3628                                                 temp = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16); 
3629                                                 if((AlarmConfProfile.adslAtucThreshInterleaveRateUp!=0) && (temp>=PrevTxRate.adslAtucChanPrevTxRate+AlarmConfProfile.adslAtucThreshInterleaveRateUp)){
3630                                                         trapsflag|=ATUC_RATE_CHANGE_FLAG;
3631                                                         PrevTxRate.adslAtucChanPrevTxRate = temp;                                               
3632                                                 }
3633                                                 if((AlarmConfProfile.adslAtucThreshInterleaveRateDown!=0) && (temp<=PrevTxRate.adslAtucChanPrevTxRate-AlarmConfProfile.adslAtucThreshInterleaveRateDown)){
3634                                                         trapsflag|=ATUC_RATE_CHANGE_FLAG;
3635                                                         PrevTxRate.adslAtucChanPrevTxRate = temp;                                               
3636                                                 }
3637                                         }
3638                                 }
3639                         }       
3640                         if(AlarmConfProfile.adslAturThresh15MinLofs!=0 && current_intvl->AturPerfLof>=AlarmConfProfile.adslAturThresh15MinLofs)
3641                                 trapsflag|=ATUR_PERF_LOFS_THRESH_FLAG;
3642                         if(AlarmConfProfile.adslAturThresh15MinLoss!=0 && current_intvl->AturPerfLos>=AlarmConfProfile.adslAturThresh15MinLoss)
3643                                 trapsflag|=ATUR_PERF_LOSS_THRESH_FLAG;
3644                         if(AlarmConfProfile.adslAturThresh15MinLprs!=0 && current_intvl->AturPerfLpr>=AlarmConfProfile.adslAturThresh15MinLprs)
3645                                 trapsflag|=ATUR_PERF_LPRS_THRESH_FLAG;
3646                         if(AlarmConfProfile.adslAturThresh15MinESs!=0 && current_intvl->AturPerfEs>=AlarmConfProfile.adslAturThresh15MinESs)
3647                                 trapsflag|=ATUR_PERF_ESS_THRESH_FLAG;   
3648                         if(chantype.fast==1){
3649                                 if(AlarmConfProfile.adslAturThreshFastRateUp!=0 || AlarmConfProfile.adslAturThreshFastRateDown!=0){
3650                                         ATUR_CHAN_CURR_TX_RATE_FLAG_MAKECMV;
3651                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3652 #ifdef AMAZON_MEI_DEBUG_ON
3653                                                 printk("\n\nCMV fail, Group 6 Address 0 Index 0");
3654 #endif                  
3655                                         }
3656                                         else{
3657                                                 temp = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16); 
3658                                                 if((AlarmConfProfile.adslAturThreshFastRateUp!=0) && (temp>=PrevTxRate.adslAturChanPrevTxRate+AlarmConfProfile.adslAturThreshFastRateUp)){
3659                                                         trapsflag|=ATUR_RATE_CHANGE_FLAG;
3660                                                         PrevTxRate.adslAturChanPrevTxRate = temp;                                               
3661                                                 }
3662                                                 if((AlarmConfProfile.adslAturThreshFastRateDown!=0) && (temp<=PrevTxRate.adslAturChanPrevTxRate-AlarmConfProfile.adslAturThreshFastRateDown)){
3663                                                         trapsflag|=ATUR_RATE_CHANGE_FLAG;
3664                                                         PrevTxRate.adslAturChanPrevTxRate = temp;                                               
3665                                                 }
3666                                         }
3667                                 }
3668                         }       
3669                         if(chantype.interleave==1){
3670                                 if(AlarmConfProfile.adslAturThreshInterleaveRateUp!=0 || AlarmConfProfile.adslAturThreshInterleaveRateDown!=0){
3671                                         ATUR_CHAN_CURR_TX_RATE_FLAG_MAKECMV;
3672                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3673 #ifdef AMAZON_MEI_DEBUG_ON
3674                                                 printk("\n\nCMV fail, Group 6 Address 0 Index 0");
3675 #endif                  
3676                                         }
3677                                         else{
3678                                                 temp = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16);
3679                                                 if((AlarmConfProfile.adslAturThreshInterleaveRateUp!=0) && (temp>=PrevTxRate.adslAturChanPrevTxRate+AlarmConfProfile.adslAturThreshInterleaveRateUp)){
3680                                                         trapsflag|=ATUR_RATE_CHANGE_FLAG;
3681                                                         PrevTxRate.adslAturChanPrevTxRate = temp;                                               
3682                                                 }
3683                                                 if((AlarmConfProfile.adslAturThreshInterleaveRateDown!=0) && (temp<=PrevTxRate.adslAturChanPrevTxRate-AlarmConfProfile.adslAturThreshInterleaveRateDown)){
3684                                                         trapsflag|=ATUR_RATE_CHANGE_FLAG;
3685                                                         PrevTxRate.adslAturChanPrevTxRate = temp;                                               
3686                                                 }
3687                                         }
3688                                 }
3689                         }       
3690                         copy_to_user((char *)lon, (char *)(&trapsflag), 2);
3691                         
3692                         up(&mei_sema);  
3693                         break;
3694                         
3695 #ifdef AMAZON_MEI_MIB_RFC3440
3696                 case ADSL_ATUR_EXT_TRAPS:
3697                         trapsflag=0;
3698                         if(AlarmConfProfileExt.adslAtucThreshold15MinFailedFastR!=0 && current_intvl->AtucPerfStatFailedFastR>=AlarmConfProfileExt.adslAtucThreshold15MinFailedFastR)
3699                                 trapsflag|=ATUC_15MIN_FAILED_FASTR_TRAP_FLAG;
3700                         if(AlarmConfProfileExt.adslAtucThreshold15MinSesL!=0 && current_intvl->AtucPerfStatSesL>=AlarmConfProfileExt.adslAtucThreshold15MinSesL)
3701                                 trapsflag|=ATUC_15MIN_SESL_TRAP_FLAG;
3702                         if(AlarmConfProfileExt.adslAtucThreshold15MinUasL!=0 && current_intvl->AtucPerfStatUasL>=AlarmConfProfileExt.adslAtucThreshold15MinUasL)
3703                                 trapsflag|=ATUC_15MIN_UASL_TRAP_FLAG;
3704                         if(AlarmConfProfileExt.adslAturThreshold15MinSesL!=0 && current_intvl->AturPerfStatSesL>=AlarmConfProfileExt.adslAturThreshold15MinSesL)
3705                                 trapsflag|=ATUR_15MIN_SESL_TRAP_FLAG;
3706                         if(AlarmConfProfileExt.adslAturThreshold15MinUasL!=0 && current_intvl->AturPerfStatUasL>=AlarmConfProfileExt.adslAturThreshold15MinUasL)
3707                                 trapsflag|=ATUR_15MIN_UASL_TRAP_FLAG;
3708                         copy_to_user((char *)lon, (char *)(&trapsflag), 2);
3709                         break;
3710 #endif
3711
3712 // 603221:tc.chen start
3713                 case GET_ADSL_LINE_STATUS:
3714                         if(down_interruptible(&mei_sema))
3715                                 return -ERESTARTSYS;
3716                         
3717                         pts.adslLineStatusInfo_pt = (adslLineStatusInfo *)kmalloc(sizeof(adslLineStatusInfo), GFP_KERNEL);
3718                         copy_from_user((char *)pts.adslLineStatusInfo_pt, (char *)lon, sizeof(adslLineStatusInfo));
3719                         
3720                         if(IS_FLAG_SET((&(pts.adslLineStatusInfo_pt->flags)), LINE_STAT_MODEM_STATUS_FLAG)){
3721                                 LINE_STAT_MODEM_STATUS_FLAG_MAKECMV;
3722                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3723 #ifdef AMAZON_MEI_DEBUG_ON
3724                                         printk("\n\nCMV fail, Group STAT Address 0 Index 0");
3725 #endif
3726                                         pts.adslLineStatusInfo_pt->adslModemStatus = 0; 
3727                                 }
3728                                 else{
3729                                         pts.adslLineStatusInfo_pt->adslModemStatus = RxMessage[4];
3730                                 }
3731                         }
3732                         
3733                         if(IS_FLAG_SET((&(pts.adslLineStatusInfo_pt->flags)), LINE_STAT_MODE_SEL_FLAG)){
3734                                 LINE_STAT_MODE_SEL_FLAG_MAKECMV;
3735                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3736 #ifdef AMAZON_MEI_DEBUG_ON
3737                                         printk("\n\nCMV fail, Group STAT Address 1 Index 0");
3738 #endif
3739                                         pts.adslLineStatusInfo_pt->adslModeSelected = 0;        
3740                                 }
3741                                 else{
3742                                         pts.adslLineStatusInfo_pt->adslModeSelected = RxMessage[4];
3743                                 }
3744                         }
3745                         
3746                         if(IS_FLAG_SET((&(pts.adslLineStatusInfo_pt->flags)), LINE_STAT_TRELLCOD_ENABLE_FLAG)){
3747                                 LINE_STAT_TRELLCOD_ENABLE_FLAG_MAKECMV;
3748                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3749 #ifdef AMAZON_MEI_DEBUG_ON
3750                                         printk("\n\nCMV fail, Group OPTN Address 2 Index 0");
3751 #endif
3752                                         pts.adslLineStatusInfo_pt->adslTrellisCodeEnable = 0;   
3753                                 }
3754                                 else{
3755                                         
3756                                         pts.adslLineStatusInfo_pt->adslTrellisCodeEnable = (RxMessage[4]>>13)&0x1==0x1?0:1;
3757                                 }
3758                         }
3759                         
3760                         if(IS_FLAG_SET((&(pts.adslLineStatusInfo_pt->flags)), LINE_STAT_LATENCY_FLAG)){
3761                                 LINE_STAT_LATENCY_FLAG_MAKECMV;
3762                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3763 #ifdef AMAZON_MEI_DEBUG_ON
3764                                         printk("\n\nCMV fail, Group STAT Address 12 Index 0");
3765 #endif
3766                                         pts.adslLineStatusInfo_pt->adslLatency = 0;     
3767                                 }
3768                                 else{
3769                                         pts.adslLineStatusInfo_pt->adslLatency = RxMessage[4];
3770                                 }
3771                         }
3772                         
3773                         copy_to_user((char *)lon, (char *)pts.adslLineStatusInfo_pt, sizeof(adslLineStatusInfo));
3774                         kfree(pts.adslLineStatusInfo_pt);
3775                         
3776                         up(&mei_sema);
3777                         break;
3778
3779
3780                 case GET_ADSL_LINE_RATE:
3781                         if (showtime!=1)
3782                                 return -ERESTARTSYS;
3783                         if(down_interruptible(&mei_sema))
3784                                 return -ERESTARTSYS;
3785                         
3786                         pts.adslLineRateInfo_pt = (adslLineRateInfo *)kmalloc(sizeof(adslLineRateInfo), GFP_KERNEL);
3787                         copy_from_user((char *)pts.adslLineRateInfo_pt, (char *)lon, sizeof(adslLineRateInfo));
3788                         
3789                         if(IS_FLAG_SET((&(pts.adslLineRateInfo_pt->flags)), LINE_RATE_DATA_RATEDS_FLAG)){
3790                                 if (adsl_mode <=8 && adsl_mode_extend==0) // adsl mode
3791                                 {
3792                                         if (chantype.interleave)
3793                                                 LINE_RATE_DATA_RATEDS_FLAG_ADSL1_LP0_MAKECMV;
3794                                         else
3795                                                 LINE_RATE_DATA_RATEDS_FLAG_ADSL1_LP1_MAKECMV;
3796                                                 
3797                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3798 #ifdef AMAZON_MEI_DEBUG_ON
3799                                                 printk("\n\nCMV fail, Group RATE Address 1 Index 0");
3800 #endif
3801                                                 pts.adslLineRateInfo_pt->adslDataRateds = 0;    
3802                                         }
3803                                         else{
3804                                                 pts.adslLineRateInfo_pt->adslDataRateds = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16);
3805                                         }               
3806                                 }else  // adsl 2/2+
3807                                 {
3808                                         unsigned long Mp,Lp,Tp,Rp,Kp,Bpn,DataRate,DataRate_remain;
3809                                         Mp=Lp=Tp=Rp=Kp=Bpn=DataRate=DataRate_remain=0;
3810                                         //// up stream data rate
3811                                           
3812                                             if (chantype.interleave)
3813                                             {
3814                                                     LINE_RATE_DATA_RATEUS_FLAG_ADSL2_LP_LP0_MAKECMV;
3815                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3816 #ifdef AMAZON_MEI_DEBUG_ON
3817                                                         printk("\n\nCMV fail, Group CNFG Address 25 Index 0");
3818 #endif
3819                                                         Lp = 0; 
3820                                                     }else
3821                                                         Lp=RxMessage[4];
3822                                    
3823                                                     LINE_RATE_DATA_RATEUS_FLAG_ADSL2_RP_LP0_MAKECMV;
3824                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3825 #ifdef AMAZON_MEI_DEBUG_ON
3826                                                         printk("\n\nCMV fail, Group CNFG Address 23 Index 0");
3827 #endif
3828                                                         Rp = 0; 
3829                                                     }else
3830                                                         Rp=RxMessage[4];
3831                                 
3832                                                     LINE_RATE_DATA_RATEUS_FLAG_ADSL2_MP_LP0_MAKECMV;
3833                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3834 #ifdef AMAZON_MEI_DEBUG_ON
3835                                                         printk("\n\nCMV fail, Group CNFG Address 24 Index 0");
3836 #endif
3837                                                         Mp = 0; 
3838                                                     }else
3839                                                         Mp=RxMessage[4];
3840                                 
3841                                                     LINE_RATE_DATA_RATEUS_FLAG_ADSL2_TP_LP0_MAKECMV;
3842                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3843 #ifdef AMAZON_MEI_DEBUG_ON
3844                                                         printk("\n\nCMV fail, Group CNFG Address 26 Index 0");
3845 #endif
3846                                                         Tp = 0; 
3847                                                     }else
3848                                                         Tp=RxMessage[4];
3849                                 
3850                                                     LINE_RATE_DATA_RATEUS_FLAG_ADSL2_KP_LP0_MAKECMV;
3851                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3852 #ifdef AMAZON_MEI_DEBUG_ON
3853                                                         printk("\n\nCMV fail, Group CNFG Address 28 Index 0");
3854 #endif
3855                                                         Kp = 0; 
3856                                                     }else
3857                                                     {
3858                                                         Kp=RxMessage[4]+ RxMessage[5]+1;
3859                                                         Bpn=RxMessage[4]+ RxMessage[5];
3860                                                     }
3861                                             }else
3862                                             {
3863                                                     LINE_RATE_DATA_RATEUS_FLAG_ADSL2_LP_LP1_MAKECMV;
3864                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3865 #ifdef AMAZON_MEI_DEBUG_ON
3866                                                         printk("\n\nCMV fail, Group CNFG Address 25 Index 1");
3867 #endif
3868                                                         Lp = 0; 
3869                                                     }else
3870                                                         Lp=RxMessage[4];
3871                                    
3872                                                     LINE_RATE_DATA_RATEUS_FLAG_ADSL2_RP_LP1_MAKECMV;
3873                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3874 #ifdef AMAZON_MEI_DEBUG_ON
3875                                                         printk("\n\nCMV fail, Group CNFG Address 23 Index 1");
3876 #endif
3877                                                         Rp = 0; 
3878                                                     }else
3879                                                         Rp=RxMessage[4];
3880                                 
3881                                                     LINE_RATE_DATA_RATEUS_FLAG_ADSL2_MP_LP1_MAKECMV;
3882                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3883 #ifdef AMAZON_MEI_DEBUG_ON
3884                                                         printk("\n\nCMV fail, Group CNFG Address 24 Index 1");
3885 #endif
3886                                                         Mp = 0; 
3887                                                     }else
3888                                                         Mp=RxMessage[4];
3889                                 
3890                                                     LINE_RATE_DATA_RATEUS_FLAG_ADSL2_TP_LP1_MAKECMV;
3891                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3892 #ifdef AMAZON_MEI_DEBUG_ON
3893                                                         printk("\n\nCMV fail, Group CNFG Address 26 Index 1");
3894 #endif
3895                                                         Tp = 0; 
3896                                                     }else
3897                                                         Tp=RxMessage[4];
3898                                 
3899                                                     LINE_RATE_DATA_RATEUS_FLAG_ADSL2_KP_LP1_MAKECMV;
3900                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3901 #ifdef AMAZON_MEI_DEBUG_ON
3902                                                         printk("\n\nCMV fail, Group CNFG Address 28 Index 2");
3903 #endif
3904                                                         Kp = 0; 
3905                                                     }else
3906                                                     {
3907                                                         Kp=RxMessage[4]+ RxMessage[5]+1;
3908                                                         Bpn=RxMessage[4]+ RxMessage[5];
3909                                                     }
3910                                             }
3911                                             DataRate=((Tp*(Bpn+1)-1)*Mp*Lp*4)/(Tp*(Kp*Mp+Rp));
3912                                             //DataRate_remain=((((Tp*(Bpn+1)-1)*Mp*Lp*4)%(Tp*(Kp*Mp+Rp)))*1000)/(Tp*(Kp*Mp+Rp));
3913                                             //pts.adslLineRateInfo_pt->adslDataRateds = DataRate * 1000 + DataRate_remain;
3914                                             pts.adslLineRateInfo_pt->adslDataRateds = DataRate;
3915                                 }               
3916                         }
3917                         
3918                         if(IS_FLAG_SET((&(pts.adslLineRateInfo_pt->flags)), LINE_RATE_DATA_RATEUS_FLAG)){
3919                                 if (adsl_mode <=8 && adsl_mode_extend==0) // adsl mode
3920                                 {
3921                                         if (chantype.interleave)
3922                                                 LINE_RATE_DATA_RATEUS_FLAG_ADSL1_LP0_MAKECMV;
3923                                         else
3924                                                 LINE_RATE_DATA_RATEUS_FLAG_ADSL1_LP1_MAKECMV;
3925                                                 
3926                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3927         #ifdef AMAZON_MEI_DEBUG_ON
3928                                                 printk("\n\nCMV fail, Group RATE Address 0 Index 0");
3929         #endif
3930                                                 pts.adslLineRateInfo_pt->adslDataRateus = 0;    
3931                                         }
3932                                         else{
3933                                                 pts.adslLineRateInfo_pt->adslDataRateus = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16);
3934                                         }               
3935                                 }else  // adsl 2/2+
3936                                 {
3937                                         unsigned long Mp,Lp,Tp,Rp,Kp,Bpn,DataRate,DataRate_remain;
3938                                         Mp=Lp=Tp=Rp=Kp=Bpn=DataRate=DataRate_remain=0;
3939                                         //// down stream data rate
3940                                            
3941                                             if (chantype.interleave)
3942                                             {
3943                                                     LINE_RATE_DATA_RATEDS_FLAG_ADSL2_LP_LP0_MAKECMV;
3944                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3945 #ifdef AMAZON_MEI_DEBUG_ON
3946                                                         printk("\n\nCMV fail, Group CNFG Address 14 Index 0");
3947 #endif
3948                                                         Lp = 0; 
3949                                                     }else
3950                                                         Lp=RxMessage[4];
3951                                    
3952                                                     LINE_RATE_DATA_RATEDS_FLAG_ADSL2_RP_LP0_MAKECMV;
3953                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3954 #ifdef AMAZON_MEI_DEBUG_ON
3955                                                         printk("\n\nCMV fail, Group CNFG Address 12 Index 0");
3956 #endif
3957                                                         Rp = 0; 
3958                                                     }else
3959                                                         Rp=RxMessage[4];
3960                                 
3961                                                     LINE_RATE_DATA_RATEDS_FLAG_ADSL2_MP_LP0_MAKECMV;
3962                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3963 #ifdef AMAZON_MEI_DEBUG_ON
3964                                                         printk("\n\nCMV fail, Group CNFG Address 13 Index 0");
3965 #endif
3966                                                         Mp = 0; 
3967                                                     }else
3968                                                         Mp=RxMessage[4];
3969                                 
3970                                                     LINE_RATE_DATA_RATEDS_FLAG_ADSL2_TP_LP0_MAKECMV;
3971                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3972 #ifdef AMAZON_MEI_DEBUG_ON
3973                                                         printk("\n\nCMV fail, Group CNFG Address 15 Index 0");
3974 #endif
3975                                                         Tp = 0; 
3976                                                     }else
3977                                                         Tp=RxMessage[4];
3978                                 
3979                                                     LINE_RATE_DATA_RATEDS_FLAG_ADSL2_KP_LP0_MAKECMV;
3980                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3981 #ifdef AMAZON_MEI_DEBUG_ON
3982                                                         printk("\n\nCMV fail, Group CNFG Address 17 Index 0");
3983 #endif
3984                                                         Kp = 0; 
3985                                                     }else
3986                                                     {
3987                                                         Kp=RxMessage[4]+ RxMessage[5]+1;
3988                                                         Bpn=RxMessage[4]+ RxMessage[5];
3989                                                     }
3990                                             }else
3991                                             {
3992                                                     LINE_RATE_DATA_RATEDS_FLAG_ADSL2_LP_LP1_MAKECMV;
3993                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
3994 #ifdef AMAZON_MEI_DEBUG_ON
3995                                                         printk("\n\nCMV fail, Group CNFG Address 14 Index 1");
3996 #endif
3997                                                         Lp = 0; 
3998                                                     }else
3999                                                         Lp=RxMessage[4];
4000                                    
4001                                                     LINE_RATE_DATA_RATEDS_FLAG_ADSL2_RP_LP1_MAKECMV;
4002                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4003 #ifdef AMAZON_MEI_DEBUG_ON
4004                                                         printk("\n\nCMV fail, Group CNFG Address 12 Index 1");
4005 #endif
4006                                                         Rp = 0; 
4007                                                     }else
4008                                                         Rp=RxMessage[4];
4009                                 
4010                                                     LINE_RATE_DATA_RATEDS_FLAG_ADSL2_MP_LP1_MAKECMV;
4011                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4012 #ifdef AMAZON_MEI_DEBUG_ON
4013                                                         printk("\n\nCMV fail, Group CNFG Address 13 Index 1");
4014 #endif
4015                                                         Mp = 0; 
4016                                                     }else
4017                                                         Mp=RxMessage[4];
4018                                 
4019                                                     LINE_RATE_DATA_RATEDS_FLAG_ADSL2_TP_LP1_MAKECMV;
4020                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4021 #ifdef AMAZON_MEI_DEBUG_ON
4022                                                         printk("\n\nCMV fail, Group CNFG Address 15 Index 1");
4023 #endif
4024                                                         Tp = 0; 
4025                                                     }else
4026                                                         Tp=RxMessage[4];
4027                                 
4028                                                     LINE_RATE_DATA_RATEDS_FLAG_ADSL2_KP_LP1_MAKECMV;
4029                                                     if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4030 #ifdef AMAZON_MEI_DEBUG_ON
4031                                                         printk("\n\nCMV fail, Group CNFG Address 17 Index 2");
4032 #endif
4033                                                         Kp = 0; 
4034                                                     }else
4035                                                     {
4036                                                         Kp=RxMessage[4]+ RxMessage[5]+1;
4037                                                         Bpn=RxMessage[4]+ RxMessage[5];
4038                                                     }
4039                                             }
4040                                             DataRate=((Tp*(Bpn+1)-1)*Mp*Lp*4)/(Tp*(Kp*Mp+Rp));
4041                                             //DataRate_remain=((((Tp*(Bpn+1)-1)*Mp*Lp*4)%(Tp*(Kp*Mp+Rp)))*1000)/(Tp*(Kp*Mp+Rp));
4042                                             //pts.adslLineRateInfo_pt->adslDataRateus = DataRate * 1000 + DataRate_remain;
4043                                             pts.adslLineRateInfo_pt->adslDataRateus = DataRate;
4044                                 }               
4045                         }
4046                         
4047                         if(IS_FLAG_SET((&(pts.adslLineRateInfo_pt->flags)), LINE_RATE_ATTNDRDS_FLAG)){
4048                                 LINE_RATE_ATTNDRDS_FLAG_MAKECMV;
4049                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4050 #ifdef AMAZON_MEI_DEBUG_ON
4051                                         printk("\n\nCMV fail, Group INFO Address 68 Index 4");
4052 #endif
4053                                         pts.adslLineRateInfo_pt->adslATTNDRds = 0;      
4054                                 }
4055                                 else{
4056                                         pts.adslLineRateInfo_pt->adslATTNDRds = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16);
4057                                 }
4058                         }
4059                         
4060                         if(IS_FLAG_SET((&(pts.adslLineRateInfo_pt->flags)), LINE_RATE_ATTNDRUS_FLAG)){
4061                                 if (adsl_mode <=8 && adsl_mode_extend==0) // adsl mode
4062                                 {
4063                                         LINE_RATE_ATTNDRUS_FLAG_MAKECMV;
4064                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4065         #ifdef AMAZON_MEI_DEBUG_ON
4066                                                 printk("\n\nCMV fail, Group INFO Address 69 Index 4");
4067         #endif
4068                                                 pts.adslLineRateInfo_pt->adslATTNDRus = 0;      
4069                                         }
4070                                         else{
4071                                                 pts.adslLineRateInfo_pt->adslATTNDRus = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16);
4072                                         }
4073                                 }else
4074                                 {
4075                                         hdlc_cmd[0]=0x0181;
4076                                         hdlc_cmd[1]=0x24;
4077                                         up(&mei_sema);
4078                                         if (ifx_me_hdlc_send((unsigned char *)&hdlc_cmd[0],4)!= -EBUSY)
4079                                         {
4080                                                 set_current_state(TASK_INTERRUPTIBLE);
4081                                                 schedule_timeout(1);            
4082                                                 hdlc_rx_len=0;                  
4083                                                 hdlc_rx_len = ifx_mei_hdlc_read(&hdlc_rx_buffer,32*2);
4084                                                 if (hdlc_rx_len <=0)
4085                                                 {
4086                                                         meierr = -ERESTARTSYS;
4087                                                         goto GET_ADSL_LINE_RATE_END;
4088                                                 }
4089                                                 pts.adslLineRateInfo_pt->adslATTNDRus = (u32)le16_to_cpu(hdlc_rx_buffer[1])<<16 | (u32)le16_to_cpu(hdlc_rx_buffer[2]);
4090                                         }
4091                                         if(down_interruptible(&mei_sema))
4092                                         {
4093                                                 meierr = -ERESTARTSYS;
4094                                                 goto GET_ADSL_LINE_RATE_END;
4095                                         }
4096                                 }
4097                         }       
4098                         copy_to_user((char *)lon, (char *)pts.adslLineRateInfo_pt, sizeof(adslLineRateInfo));
4099                         up(&mei_sema);
4100                         
4101 GET_ADSL_LINE_RATE_END:                                         
4102                         kfree(pts.adslLineRateInfo_pt);
4103                         break;
4104
4105                 case GET_ADSL_LINE_INFO:
4106                         if (showtime!=1)
4107                                 return -ERESTARTSYS;
4108                         if(down_interruptible(&mei_sema))
4109                                 return -ERESTARTSYS;
4110                         
4111                         pts.adslLineInfo_pt = (adslLineInfo *)kmalloc(sizeof(adslLineInfo), GFP_KERNEL);
4112                         copy_from_user((char *)pts.adslLineInfo_pt, (char *)lon, sizeof(adslLineInfo));
4113                         
4114                         if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_INTLV_DEPTHDS_FLAG)){
4115                                 if (chantype.interleave)
4116                                         LINE_INFO_INTLV_DEPTHDS_FLAG_LP0_MAKECMV;
4117                                 else
4118                                         LINE_INFO_INTLV_DEPTHDS_FLAG_LP1_MAKECMV;
4119                                         
4120                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4121 #ifdef AMAZON_MEI_DEBUG_ON
4122                                         printk("\n\nCMV fail, Group CNFG Address 27 Index 0");
4123 #endif
4124                                         pts.adslLineInfo_pt->adslInterleaveDepthds = 0; 
4125                                 }
4126                                 else{
4127                                         pts.adslLineInfo_pt->adslInterleaveDepthds = RxMessage[4];
4128                                 }                               
4129                         }
4130                         
4131                         if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_INTLV_DEPTHUS_FLAG)){
4132                                 if (chantype.interleave)
4133                                         LINE_INFO_INTLV_DEPTHUS_FLAG_LP0_MAKECMV;
4134                                 else
4135                                         LINE_INFO_INTLV_DEPTHUS_FLAG_LP1_MAKECMV;
4136                                         
4137                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4138 #ifdef AMAZON_MEI_DEBUG_ON
4139                                         printk("\n\nCMV fail, Group CNFG Address 16 Index 0");
4140 #endif
4141                                         pts.adslLineInfo_pt->adslInterleaveDepthus = 0; 
4142                                 }
4143                                 else{
4144                                         pts.adslLineInfo_pt->adslInterleaveDepthus = RxMessage[4];
4145                                 }                               
4146                         }
4147                         
4148                         if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_LATNDS_FLAG)){
4149                                 LINE_INFO_LATNDS_FLAG_MAKECMV;
4150                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4151 #ifdef AMAZON_MEI_DEBUG_ON
4152                                         printk("\n\nCMV fail, Group INFO Address 68 Index 1");
4153 #endif
4154                                         pts.adslLineInfo_pt->adslLATNds = 0;    
4155                                 }
4156                                 else{
4157                                         pts.adslLineInfo_pt->adslLATNds = RxMessage[4];
4158                                 }
4159                         }
4160                         
4161                         if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_LATNUS_FLAG)){
4162                                 if (adsl_mode <=8 && adsl_mode_extend==0) // adsl mode
4163                                 {
4164                                         LINE_INFO_LATNUS_FLAG_MAKECMV;
4165                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4166 #ifdef AMAZON_MEI_DEBUG_ON
4167                                                 printk("\n\nCMV fail, Group INFO Address 69 Index 1");
4168 #endif
4169                                                 pts.adslLineInfo_pt->adslLATNus = 0;    
4170                                         }
4171                                         else{
4172                                                 pts.adslLineInfo_pt->adslLATNus = RxMessage[4];
4173                                         }
4174                                 }else
4175                                 {
4176                                         hdlc_cmd[0]=0x0181;
4177                                         hdlc_cmd[1]=0x21;
4178                                         up(&mei_sema);
4179                                         if (ifx_me_hdlc_send((unsigned char *)&hdlc_cmd[0],4)!= -EBUSY)
4180                                         {
4181                                                 set_current_state(TASK_INTERRUPTIBLE);
4182                                                 schedule_timeout(1);            
4183                                                 hdlc_rx_len=0;                  
4184                                                 hdlc_rx_len = ifx_mei_hdlc_read(&hdlc_rx_buffer,32*2);
4185                                                 if (hdlc_rx_len <=0)
4186                                                 {
4187                                                         meierr = -ERESTARTSYS;
4188                                                         goto GET_ADSL_LINE_INFO_END;
4189                                                 }
4190                                                 pts.adslLineInfo_pt->adslLATNus = le16_to_cpu(hdlc_rx_buffer[1]);
4191                                         }
4192                                         if(down_interruptible(&mei_sema))
4193                                         {
4194                                                 meierr = -ERESTARTSYS;
4195                                                 goto GET_ADSL_LINE_INFO_END;
4196                                         }
4197                                 }
4198                         }
4199                         
4200                         if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_SATNDS_FLAG)){
4201                                 LINE_INFO_SATNDS_FLAG_MAKECMV;
4202                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4203 #ifdef AMAZON_MEI_DEBUG_ON
4204                                         printk("\n\nCMV fail, Group INFO Address 68 Index 2");
4205 #endif
4206                                         pts.adslLineInfo_pt->adslSATNds = 0;    
4207                                 }
4208                                 else{
4209                                         pts.adslLineInfo_pt->adslSATNds = RxMessage[4];
4210                                 }
4211                         }
4212                         
4213                         if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_SATNUS_FLAG)){
4214                                 if (adsl_mode <=8 && adsl_mode_extend==0) // adsl mode
4215                                 {
4216                                         LINE_INFO_SATNUS_FLAG_MAKECMV;
4217                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4218 #ifdef AMAZON_MEI_DEBUG_ON
4219                                                 printk("\n\nCMV fail, Group INFO Address 69 Index 2");
4220 #endif
4221                                                 pts.adslLineInfo_pt->adslSATNus = 0;    
4222                                         }
4223                                         else{
4224                                                 pts.adslLineInfo_pt->adslSATNus = RxMessage[4];
4225                                         }
4226                                 }else
4227                                 {
4228                                         hdlc_cmd[0]=0x0181;
4229                                         hdlc_cmd[1]=0x22;
4230                                         up(&mei_sema);
4231                                         if (ifx_me_hdlc_send((unsigned char *)&hdlc_cmd[0],4)!= -EBUSY)
4232                                         {
4233                                                 set_current_state(TASK_INTERRUPTIBLE);
4234                                                 schedule_timeout(1);            
4235                                                 hdlc_rx_len=0;                  
4236                                                 hdlc_rx_len = ifx_mei_hdlc_read(&hdlc_rx_buffer,32*2);
4237                                                 if (hdlc_rx_len <=0)
4238                                                 {
4239                                                         meierr = -ERESTARTSYS;
4240                                                         goto GET_ADSL_LINE_INFO_END;
4241                                                 }
4242                                                 pts.adslLineInfo_pt->adslSATNus = le16_to_cpu(hdlc_rx_buffer[1]);
4243                                         }
4244                                         if(down_interruptible(&mei_sema))
4245                                         {
4246                                                 meierr = -ERESTARTSYS;
4247                                                 goto GET_ADSL_LINE_INFO_END;
4248                                         }
4249                                 }
4250                         }
4251                         
4252                         if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_SNRMNDS_FLAG)){
4253                                 if (adsl_mode <=8 && adsl_mode_extend==0) // adsl mode
4254                                 {
4255                                         LINE_INFO_SNRMNDS_FLAG_ADSL1_MAKECMV;
4256                                 }
4257                                 else if ((adsl_mode == 0x4000) || (adsl_mode == 0x8000) || adsl_mode_extend > 0)
4258                                 {
4259                                         LINE_INFO_SNRMNDS_FLAG_ADSL2PLUS_MAKECMV;
4260                                 }
4261                                 else
4262                                 {
4263                                         LINE_INFO_SNRMNDS_FLAG_ADSL2_MAKECMV;
4264                                 }
4265                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4266 #ifdef AMAZON_MEI_DEBUG_ON
4267                                         printk("\n\nCMV fail, Group INFO Address 68 Index 3");
4268 #endif
4269                                         pts.adslLineInfo_pt->adslSNRMds = 0;    
4270                                 }
4271                                 else{
4272                                         if (adsl_mode>8 || adsl_mode_extend>0)
4273                                         {
4274                                                 int SNRMds,SNRMds_remain;
4275                                                 SNRMds=RxMessage[4];    
4276                                                 SNRMds_remain=((SNRMds&0xff)*1000)/256;
4277                                                 SNRMds=(SNRMds>>8)&0xff;
4278                                                 if ((SNRMds_remain%100)>=50) SNRMds_remain=(SNRMds_remain/100)+1;
4279                                                 else  SNRMds_remain=(SNRMds_remain/100);
4280                                                 pts.adslLineInfo_pt->adslSNRMds = SNRMds*10 + SNRMds_remain;
4281                                         }else
4282                                         {
4283                                                 pts.adslLineInfo_pt->adslSNRMds = RxMessage[4];
4284                                         }
4285                                 }
4286                         }
4287                         
4288                         if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_SNRMNUS_FLAG)){
4289                                 if (adsl_mode <=8 && adsl_mode_extend == 0)
4290                                 {
4291                                         LINE_INFO_SNRMNUS_FLAG_MAKECMV;
4292                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4293 #ifdef AMAZON_MEI_DEBUG_ON
4294                                                 printk("\n\nCMV fail, Group INFO Address 69 Index 3");
4295 #endif
4296                                                 pts.adslLineInfo_pt->adslSNRMus = 0;    
4297                                         }
4298                                         else{
4299                                                 pts.adslLineInfo_pt->adslSNRMus = RxMessage[4];
4300                                         }
4301                                 }else
4302                                 {
4303                                         hdlc_cmd[0]=0x0181;
4304                                         hdlc_cmd[1]=0x23;
4305                                         up(&mei_sema);
4306                                         if (ifx_me_hdlc_send((unsigned char *)&hdlc_cmd[0],4)!= -EBUSY)
4307                                         {
4308                                                 set_current_state(TASK_INTERRUPTIBLE);
4309                                                 schedule_timeout(1);            
4310                                                 hdlc_rx_len=0;                  
4311                                                 hdlc_rx_len = ifx_mei_hdlc_read(&hdlc_rx_buffer,32*2);
4312                                                 if (hdlc_rx_len <=0)
4313                                                 {
4314                                                         meierr = -ERESTARTSYS;
4315                                                         goto GET_ADSL_LINE_INFO_END;
4316                                                 }
4317                                                 pts.adslLineInfo_pt->adslSNRMus = le16_to_cpu(hdlc_rx_buffer[1]);
4318                                         }
4319                                         if(down_interruptible(&mei_sema))
4320                                         {
4321                                                 meierr = -ERESTARTSYS;
4322                                                 goto GET_ADSL_LINE_INFO_END;
4323                                         }
4324                                 }
4325                         }
4326                         
4327                         if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_ACATPDS_FLAG)){
4328                                 if (adsl_mode <=8 && adsl_mode_extend == 0)
4329                                 {
4330                                         LINE_INFO_ACATPDS_FLAG_MAKECMV;
4331                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4332         #ifdef AMAZON_MEI_DEBUG_ON
4333                                                 printk("\n\nCMV fail, Group INFO Address 68 Index 6");
4334         #endif
4335                                                 pts.adslLineInfo_pt->adslACATPds = 0;   
4336                                         }
4337                                         else{
4338                                                 pts.adslLineInfo_pt->adslACATPds = RxMessage[4];
4339                                         }
4340                                 }else
4341                                 {
4342                                         hdlc_cmd[0]=0x0181;
4343                                         hdlc_cmd[1]=0x25;
4344                                         up(&mei_sema);
4345                                         if (ifx_me_hdlc_send((unsigned char *)&hdlc_cmd[0],4)!= -EBUSY)
4346                                         {
4347                                                 set_current_state(TASK_INTERRUPTIBLE);
4348                                                 schedule_timeout(1);            
4349                                                 hdlc_rx_len=0;                  
4350                                                 hdlc_rx_len = ifx_mei_hdlc_read(&hdlc_rx_buffer,32*2);
4351                                                 if (hdlc_rx_len <=0)
4352                                                 {
4353                                                         meierr = -ERESTARTSYS;
4354                                                         goto GET_ADSL_LINE_INFO_END;
4355                                                 }
4356                                                 pts.adslLineInfo_pt->adslACATPds = le16_to_cpu(hdlc_rx_buffer[1]);
4357                                         }
4358                                         if(down_interruptible(&mei_sema))
4359                                         {
4360                                                 meierr = -ERESTARTSYS;
4361                                                 goto GET_ADSL_LINE_INFO_END;
4362                                         }
4363                                 }
4364                         }
4365                         
4366                         if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_ACATPUS_FLAG)){
4367                                 if (adsl_mode <=8 && adsl_mode_extend == 0)
4368                                 {
4369                                         LINE_INFO_ACATPUS_FLAG_MAKECMV;
4370                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4371 #ifdef AMAZON_MEI_DEBUG_ON
4372                                                 printk("\n\nCMV fail, Group INFO Address 69 Index 6");
4373 #endif
4374                                                 pts.adslLineInfo_pt->adslACATPus = 0;   
4375                                         }
4376                                         else{
4377                                                 pts.adslLineInfo_pt->adslACATPus = RxMessage[4];
4378                                         }
4379                                 }else
4380                                 {
4381                                         hdlc_cmd[0]=0x0181;
4382                                         hdlc_cmd[1]=0x26;
4383                                         up(&mei_sema);
4384                                         if (ifx_me_hdlc_send((unsigned char *)&hdlc_cmd[0],4)!= -EBUSY)
4385                                         {
4386                                                 set_current_state(TASK_INTERRUPTIBLE);
4387                                                 schedule_timeout(1);            
4388                                                 hdlc_rx_len=0;                  
4389                                                 hdlc_rx_len = ifx_mei_hdlc_read(&hdlc_rx_buffer,32*2);
4390                                                 if (hdlc_rx_len <=0)
4391                                                 {
4392                                                         meierr = -ERESTARTSYS;
4393                                                         goto GET_ADSL_LINE_INFO_END;
4394                                                 }
4395                                                 pts.adslLineInfo_pt->adslACATPus = le16_to_cpu(hdlc_rx_buffer[1]);
4396                                         }
4397                                         if(down_interruptible(&mei_sema))
4398                                         {
4399                                                 meierr = -ERESTARTSYS;
4400                                                 goto GET_ADSL_LINE_INFO_END;
4401                                         }
4402                                 }
4403                         }
4404                         
4405                         copy_to_user((char *)lon, (char *)pts.adslLineInfo_pt, sizeof(adslLineInfo));
4406                         up(&mei_sema);
4407
4408 GET_ADSL_LINE_INFO_END:                 
4409                         kfree(pts.adslLineInfo_pt);
4410                         break;
4411
4412                 case GET_ADSL_NEAREND_STATS:
4413                         if (showtime!=1)
4414                                 return -ERESTARTSYS;
4415                         if(down_interruptible(&mei_sema))
4416                                 return -ERESTARTSYS;
4417                         
4418                         pts.adslNearEndPerfStats_pt = (adslNearEndPerfStats *)kmalloc(sizeof(adslNearEndPerfStats), GFP_KERNEL);
4419                         copy_from_user((char *)pts.adslNearEndPerfStats_pt, (char *)lon, sizeof(adslNearEndPerfStats));
4420                         
4421                         if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_SUPERFRAME_FLAG)){
4422                                 NEAREND_PERF_SUPERFRAME_FLAG_LSW_MAKECMV;
4423                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4424 #ifdef AMAZON_MEI_DEBUG_ON
4425                                         printk("\n\nCMV fail, Group PLAM Address 20 Index 0");
4426 #endif
4427                                         pts.adslNearEndPerfStats_pt->adslSuperFrames = 0;       
4428                                 }
4429                                 else{
4430                                         pts.adslNearEndPerfStats_pt->adslSuperFrames = (u32)(RxMessage[4]);
4431                                 }
4432                                 NEAREND_PERF_SUPERFRAME_FLAG_MSW_MAKECMV;
4433                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4434 #ifdef AMAZON_MEI_DEBUG_ON
4435                                         printk("\n\nCMV fail, Group PLAM Address 21 Index 0");
4436 #endif
4437                                         pts.adslNearEndPerfStats_pt->adslSuperFrames = 0;       
4438                                 }
4439                                 else{
4440                                         pts.adslNearEndPerfStats_pt->adslSuperFrames += (((u32)(RxMessage[4]))<<16);
4441                                 }
4442                         }
4443                         
4444                         if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LOS_FLAG) || 
4445                            IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LOF_FLAG) ||
4446                            IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LPR_FLAG) ||
4447                            IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_NCD_FLAG) ||
4448                            IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LCD_FLAG) ){
4449                                 NEAREND_PERF_LOS_FLAG_MAKECMV;
4450                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4451 #ifdef AMAZON_MEI_DEBUG_ON
4452                                         printk("\n\nCMV fail, Group PLAM Address 0 Index 0");
4453 #endif                                  
4454                                         RxMessage[4] = 0;
4455                                 }
4456                                 if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LOS_FLAG)){
4457                                         if( (RxMessage[4]&0x1) == 0x1)
4458                                                 pts.adslNearEndPerfStats_pt->adslneLOS = 1;
4459                                         else
4460                                                 pts.adslNearEndPerfStats_pt->adslneLOS = 0;
4461                                 }
4462                                 
4463                                 if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LOF_FLAG)){
4464                                         if( (RxMessage[4]&0x2) == 0x2)
4465                                                 pts.adslNearEndPerfStats_pt->adslneLOF = 1;
4466                                         else
4467                                                 pts.adslNearEndPerfStats_pt->adslneLOF = 0;
4468                                 }
4469                                 
4470                                 if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LPR_FLAG)){
4471                                         if( (RxMessage[4]&0x4) == 0x4)
4472                                                 pts.adslNearEndPerfStats_pt->adslneLPR = 1;
4473                                         else
4474                                                 pts.adslNearEndPerfStats_pt->adslneLPR = 0;
4475                                 }
4476                                 
4477                                 if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_NCD_FLAG)){
4478                                         pts.adslNearEndPerfStats_pt->adslneNCD = (RxMessage[4]>>4)&0x3;
4479                                 }
4480                                 
4481                                 if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LCD_FLAG)){
4482                                         pts.adslNearEndPerfStats_pt->adslneLCD = (RxMessage[4]>>6)&0x3;
4483                                 }
4484                         }
4485                                                 
4486                         if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_CRC_FLAG)){
4487                                 if (chantype.interleave)
4488                                         NEAREND_PERF_CRC_FLAG_LP0_MAKECMV;
4489                                 else
4490                                         NEAREND_PERF_CRC_FLAG_LP1_MAKECMV;
4491                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4492 #ifdef AMAZON_MEI_DEBUG_ON
4493                                         printk("\n\nCMV fail, Group PLAM Address 2 Index 0");
4494 #endif
4495                                         pts.adslNearEndPerfStats_pt->adslneCRC = 0;     
4496                                 }
4497                                 else{
4498                                         pts.adslNearEndPerfStats_pt->adslneCRC = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16);
4499                                 }
4500                         }
4501                         
4502                         if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_RSCORR_FLAG)){
4503                                 if (chantype.interleave)
4504                                         NEAREND_PERF_RSCORR_FLAG_LP0_MAKECMV;
4505                                 else
4506                                         NEAREND_PERF_RSCORR_FLAG_LP1_MAKECMV;
4507                                         
4508                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4509 #ifdef AMAZON_MEI_DEBUG_ON
4510                                         printk("\n\nCMV fail, Group PLAM Address 3 Index 0");
4511 #endif
4512                                         pts.adslNearEndPerfStats_pt->adslneRSCorr = 0;  
4513                                 }
4514                                 else{
4515                                         pts.adslNearEndPerfStats_pt->adslneRSCorr = RxMessage[4];
4516                                 }
4517                         }
4518                         
4519                         if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_FECS_FLAG)){
4520                                 NEAREND_PERF_FECS_FLAG_MAKECMV;
4521                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4522 #ifdef AMAZON_MEI_DEBUG_ON
4523                                         printk("\n\nCMV fail, Group PLAM Address 6 Index 0");
4524 #endif
4525                                         pts.adslNearEndPerfStats_pt->adslneFECS = 0;    
4526                                 }
4527                                 else{
4528                                         pts.adslNearEndPerfStats_pt->adslneFECS = RxMessage[4];
4529                                 }
4530                         }
4531                         
4532                         if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_ES_FLAG)){
4533                                 NEAREND_PERF_ES_FLAG_MAKECMV;
4534                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4535 #ifdef AMAZON_MEI_DEBUG_ON
4536                                         printk("\n\nCMV fail, Group PLAM Address 7 Index 0");
4537 #endif
4538                                         pts.adslNearEndPerfStats_pt->adslneES = 0;      
4539                                 }
4540                                 else{
4541                                         pts.adslNearEndPerfStats_pt->adslneES = RxMessage[4];
4542                                 }
4543                         }
4544                         
4545                         if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_SES_FLAG)){
4546                                 NEAREND_PERF_SES_FLAG_MAKECMV;
4547                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4548 #ifdef AMAZON_MEI_DEBUG_ON
4549                                         printk("\n\nCMV fail, Group PLAM Address 8 Index 0");
4550 #endif
4551                                         pts.adslNearEndPerfStats_pt->adslneSES = 0;     
4552                                 }
4553                                 else{
4554                                         pts.adslNearEndPerfStats_pt->adslneSES = RxMessage[4];
4555                                 }
4556                         }
4557                         
4558                         if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LOSS_FLAG)){
4559                                 NEAREND_PERF_LOSS_FLAG_MAKECMV;
4560                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4561 #ifdef AMAZON_MEI_DEBUG_ON
4562                                         printk("\n\nCMV fail, Group PLAM Address 9 Index 0");
4563 #endif
4564                                         pts.adslNearEndPerfStats_pt->adslneLOSS = 0;    
4565                                 }
4566                                 else{
4567                                         pts.adslNearEndPerfStats_pt->adslneLOSS = RxMessage[4];
4568                                 }
4569                         }
4570                         
4571                         if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_UAS_FLAG)){
4572                                 NEAREND_PERF_UAS_FLAG_MAKECMV;
4573                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4574 #ifdef AMAZON_MEI_DEBUG_ON
4575                                         printk("\n\nCMV fail, Group PLAM Address 10 Index 0");
4576 #endif
4577                                         pts.adslNearEndPerfStats_pt->adslneUAS = 0;     
4578                                 }
4579                                 else{
4580                                         pts.adslNearEndPerfStats_pt->adslneUAS = RxMessage[4];
4581                                 }
4582                         }
4583                         
4584                         if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_HECERR_FLAG)){
4585                                 if (chantype.bearchannel0)
4586                                 {
4587                                         NEAREND_PERF_HECERR_FLAG_BC0_MAKECMV;
4588                                 }else if (chantype.bearchannel1)
4589                                 {
4590                                         NEAREND_PERF_HECERR_FLAG_BC1_MAKECMV;
4591                                 }
4592                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4593 #ifdef AMAZON_MEI_DEBUG_ON
4594                                         printk("\n\nCMV fail, Group PLAM Address 11 Index 0");
4595 #endif
4596                                         pts.adslNearEndPerfStats_pt->adslneHECErrors = 0;       
4597                                 }
4598                                 else{
4599                                         pts.adslNearEndPerfStats_pt->adslneHECErrors = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16);
4600                                 }
4601                         }
4602                         
4603                         copy_to_user((char *)lon, (char *)pts.adslNearEndPerfStats_pt, sizeof(adslNearEndPerfStats));
4604                         kfree(pts.adslNearEndPerfStats_pt);
4605                         
4606                         up(&mei_sema);
4607                         break;
4608
4609                 case GET_ADSL_FAREND_STATS:
4610
4611                         if (showtime!=1)
4612                                 return -ERESTARTSYS;
4613                         
4614                         if (adsl_mode>8 || adsl_mode_extend > 0)
4615                         {
4616                                 do_gettimeofday(&time_now);
4617                                 if( FarendData_acquire_time.tv_sec==0 || time_now.tv_sec - FarendData_acquire_time.tv_sec>=1)
4618                                 {                                                               
4619                                         hdlc_cmd[0]=0x105;
4620                                         
4621                                         if (ifx_me_hdlc_send((unsigned char *)&hdlc_cmd[0],2)!= -EBUSY)
4622                                         {
4623                                                 set_current_state(TASK_INTERRUPTIBLE);
4624                                                 schedule_timeout(1);            
4625                                                 hdlc_rx_len=0;                  
4626                                                 hdlc_rx_len = ifx_mei_hdlc_read(&hdlc_rx_buffer,32*2);
4627                                                 if (hdlc_rx_len <=0)
4628                                                 {
4629                                                         return -ERESTARTSYS;
4630                                                 }
4631                                                 FarendStatsData.adslfeRSCorr = ((u32)le16_to_cpu(hdlc_rx_buffer[1]) << 16) + (u32)le16_to_cpu(hdlc_rx_buffer[2]);
4632                                                 FarendStatsData.adslfeCRC = ((u32)le16_to_cpu(hdlc_rx_buffer[3]) << 16) + (u32)le16_to_cpu(hdlc_rx_buffer[4]);
4633                                                 FarendStatsData.adslfeFECS = ((u32)le16_to_cpu(hdlc_rx_buffer[5]) << 16) + (u32)le16_to_cpu(hdlc_rx_buffer[6]);
4634                                                 FarendStatsData.adslfeES = ((u32)le16_to_cpu(hdlc_rx_buffer[7]) << 16) + (u32)le16_to_cpu(hdlc_rx_buffer[8]);
4635                                                 FarendStatsData.adslfeSES = ((u32)le16_to_cpu(hdlc_rx_buffer[9]) << 16) + (u32)le16_to_cpu(hdlc_rx_buffer[10]);
4636                                                 FarendStatsData.adslfeLOSS = ((u32)le16_to_cpu(hdlc_rx_buffer[11]) << 16) + (u32)le16_to_cpu(hdlc_rx_buffer[12]);
4637                                                 FarendStatsData.adslfeUAS = ((u32)le16_to_cpu(hdlc_rx_buffer[13]) << 16) + (u32)le16_to_cpu(hdlc_rx_buffer[14]);
4638                                                 do_gettimeofday(&FarendData_acquire_time);
4639                                         }
4640                                         
4641                                 }
4642                         }
4643                         
4644                         if(down_interruptible(&mei_sema))
4645                                 return -ERESTARTSYS;
4646                         pts.adslFarEndPerfStats_pt = (adslFarEndPerfStats *)kmalloc(sizeof(adslFarEndPerfStats), GFP_KERNEL);
4647                         copy_from_user((char *)pts.adslFarEndPerfStats_pt, (char *)lon, sizeof(adslFarEndPerfStats));
4648                         if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LOS_FLAG) || 
4649                            IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LOF_FLAG) ||
4650                            IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LPR_FLAG) ||
4651                            IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_NCD_FLAG) ||
4652                            IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LCD_FLAG) ){
4653                                 FAREND_PERF_LOS_FLAG_MAKECMV;
4654                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4655 #ifdef AMAZON_MEI_DEBUG_ON
4656                                         printk("\n\nCMV fail, Group PLAM Address 1 Index 0");
4657 #endif                                  
4658                                         RxMessage[4] = 0;
4659                                 }
4660                                 if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LOS_FLAG)){
4661                                         if((RxMessage[4]&0x1) == 0x1)
4662                                                 pts.adslFarEndPerfStats_pt->adslfeLOS = 1;
4663                                         else
4664                                                 pts.adslFarEndPerfStats_pt->adslfeLOS = 0;
4665                                 }
4666                                 
4667                                 if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LOF_FLAG)){
4668                                         if((RxMessage[4]&0x2) == 0x2)
4669                                                 pts.adslFarEndPerfStats_pt->adslfeLOF = 1;
4670                                         else
4671                                                 pts.adslFarEndPerfStats_pt->adslfeLOF = 0;
4672                                 }
4673                                 
4674                                 if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LPR_FLAG)){
4675                                         if((RxMessage[4]&0x4) == 0x4)
4676                                                 pts.adslFarEndPerfStats_pt->adslfeLPR = 1;
4677                                         else
4678                                                 pts.adslFarEndPerfStats_pt->adslfeLPR = 0;
4679                                 }
4680                                 
4681                                 if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_NCD_FLAG)){
4682                                         pts.adslFarEndPerfStats_pt->adslfeNCD = (RxMessage[4]>>4)&0x3;
4683                                 }
4684                                 
4685                                 if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LCD_FLAG)){
4686                                         pts.adslFarEndPerfStats_pt->adslfeLCD = (RxMessage[4]>>6)&0x3;
4687                                 }
4688                         }
4689                                                 
4690                         if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_CRC_FLAG)){
4691                                 if (adsl_mode<=8 && adsl_mode_extend == 0)
4692                                 {
4693                                         if (chantype.interleave)
4694                                         {
4695                                                 FAREND_PERF_CRC_FLAG_LP0_MAKECMV;
4696                                         }
4697                                         else
4698                                         {
4699                                                 FAREND_PERF_CRC_FLAG_LP1_MAKECMV;
4700                                         }
4701                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4702 #ifdef AMAZON_MEI_DEBUG_ON
4703                                                 printk("\n\nCMV fail, Group PLAM Address 24 Index 0");
4704 #endif
4705                                                 pts.adslFarEndPerfStats_pt->adslfeCRC = 0;      
4706                                         }
4707                                         else{
4708                                                 pts.adslFarEndPerfStats_pt->adslfeCRC = RxMessage[4];                                   
4709                                         }
4710                                 }else
4711                                 {
4712                                         pts.adslFarEndPerfStats_pt->adslfeCRC = FarendStatsData.adslfeCRC;
4713                                 }
4714                         }
4715                         
4716                         if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_RSCORR_FLAG)){
4717                                 if (adsl_mode<=8 && adsl_mode_extend == 0)
4718                                 {
4719                                         if (chantype.interleave)
4720                                                 FAREND_PERF_RSCORR_FLAG_LP0_MAKECMV;
4721                                         else
4722                                                 FAREND_PERF_RSCORR_FLAG_LP1_MAKECMV;
4723                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4724 #ifdef AMAZON_MEI_DEBUG_ON
4725                                                 printk("\n\nCMV fail, Group PLAM Address 28 Index 0");
4726 #endif
4727                                                 pts.adslFarEndPerfStats_pt->adslfeRSCorr = 0;   
4728                                         }
4729                                         else{
4730                                                 pts.adslFarEndPerfStats_pt->adslfeRSCorr = RxMessage[4];
4731                                                 
4732                                         }
4733                                 }
4734                                 else
4735                                 {
4736                                         pts.adslFarEndPerfStats_pt->adslfeRSCorr = FarendStatsData.adslfeRSCorr;
4737                                 }
4738                         }
4739                         
4740                         if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_FECS_FLAG)){
4741                                 if (adsl_mode<=8 && adsl_mode_extend == 0)
4742                                 {
4743                                         FAREND_PERF_FECS_FLAG_MAKECMV;
4744                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4745 #ifdef AMAZON_MEI_DEBUG_ON
4746                                                 printk("\n\nCMV fail, Group PLAM Address 32 Index 0");
4747 #endif
4748                                                 pts.adslFarEndPerfStats_pt->adslfeFECS = 0;     
4749                                         }
4750                                         else{
4751                                                 pts.adslFarEndPerfStats_pt->adslfeFECS = RxMessage[4];                                          
4752                                         }
4753                                 }else {
4754                                         pts.adslFarEndPerfStats_pt->adslfeFECS = FarendStatsData.adslfeFECS;
4755                                 }
4756                         }
4757                         
4758                         if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_ES_FLAG)){
4759                                 if (adsl_mode<=8 && adsl_mode_extend == 0)
4760                                 {
4761                                         FAREND_PERF_ES_FLAG_MAKECMV;
4762                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4763 #ifdef AMAZON_MEI_DEBUG_ON
4764                                                 printk("\n\nCMV fail, Group PLAM Address 33 Index 0");
4765 #endif
4766                                                 pts.adslFarEndPerfStats_pt->adslfeES = 0;       
4767                                         }
4768                                         else{
4769                                                 pts.adslFarEndPerfStats_pt->adslfeES = RxMessage[4];                                            
4770                                         }
4771                                 }else
4772                                 {
4773                                         pts.adslFarEndPerfStats_pt->adslfeES = FarendStatsData.adslfeES;
4774                                 }
4775                         }
4776                         
4777                         if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_SES_FLAG)){
4778                                 if (adsl_mode<=8 && adsl_mode_extend == 0)
4779                                 {
4780                                         FAREND_PERF_SES_FLAG_MAKECMV;
4781                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4782 #ifdef AMAZON_MEI_DEBUG_ON
4783                                                 printk("\n\nCMV fail, Group PLAM Address 34 Index 0");
4784 #endif
4785                                                 pts.adslFarEndPerfStats_pt->adslfeSES = 0;      
4786                                         }
4787                                         else{
4788                                                 pts.adslFarEndPerfStats_pt->adslfeSES = RxMessage[4];
4789                                                 
4790                                         }
4791                                 }else
4792                                 {
4793                                         pts.adslFarEndPerfStats_pt->adslfeSES = FarendStatsData.adslfeSES;
4794                                 }
4795                         }
4796                         
4797                         if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LOSS_FLAG)){
4798                                 if (adsl_mode<=8 && adsl_mode_extend == 0)
4799                                 {
4800                                         FAREND_PERF_LOSS_FLAG_MAKECMV;
4801                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4802 #ifdef AMAZON_MEI_DEBUG_ON
4803                                                 printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
4804 #endif
4805                                                 pts.adslFarEndPerfStats_pt->adslfeLOSS = 0;     
4806                                         }
4807                                         else{
4808                                                 pts.adslFarEndPerfStats_pt->adslfeLOSS = RxMessage[4];
4809                                                 
4810                                         }
4811                                 }else
4812                                 {
4813                                         pts.adslFarEndPerfStats_pt->adslfeLOSS = FarendStatsData.adslfeLOSS;
4814                                 }
4815                         }
4816                         
4817                         if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_UAS_FLAG)){
4818                                 if (adsl_mode<=8 && adsl_mode_extend == 0)
4819                                 {
4820                                         FAREND_PERF_UAS_FLAG_MAKECMV;
4821                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4822 #ifdef AMAZON_MEI_DEBUG_ON
4823                                                 printk("\n\nCMV fail, Group PLAM Address 36 Index 0");
4824 #endif
4825                                                 pts.adslFarEndPerfStats_pt->adslfeUAS = 0;      
4826                                         }
4827                                         else{
4828                                                 pts.adslFarEndPerfStats_pt->adslfeUAS = RxMessage[4];
4829                                                 
4830                                         }
4831                                 }else
4832                                 {
4833                                         pts.adslFarEndPerfStats_pt->adslfeUAS = FarendStatsData.adslfeUAS;
4834                                 }
4835                         }
4836                         
4837                         if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_HECERR_FLAG)){
4838                                 if (chantype.bearchannel0)
4839                                 {
4840                                         FAREND_PERF_HECERR_FLAG_BC0_MAKECMV;
4841                                 }else if (chantype.bearchannel1)
4842                                 {
4843                                         FAREND_PERF_HECERR_FLAG_BC1_MAKECMV;
4844                                 }
4845                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4846 #ifdef AMAZON_MEI_DEBUG_ON
4847                                         printk("\n\nCMV fail, Group PLAM Address 37 Index 0");
4848 #endif
4849                                         pts.adslFarEndPerfStats_pt->adslfeHECErrors = 0;        
4850                                 }
4851                                 else{
4852                                         pts.adslFarEndPerfStats_pt->adslfeHECErrors = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16);
4853                                 }
4854                         }
4855                         
4856                         copy_to_user((char *)lon, (char *)pts.adslFarEndPerfStats_pt, sizeof(adslFarEndPerfStats));             
4857                         kfree(pts.adslFarEndPerfStats_pt);
4858                         
4859                         up(&mei_sema);
4860                         
4861                         break;
4862 // 603221:tc.chen end
4863                 case GET_ADSL_LOOP_DIAGNOSTICS_MODE:
4864                         //lon = loop_diagnostics_mode;
4865                         copy_to_user((char *)lon, (char *)&loop_diagnostics_mode, sizeof(int)); 
4866                         break;
4867 //>> SHC
4868                 case IS_ADSL_LOOP_DIAGNOSTICS_MODE_COMPLETE:
4869                         copy_to_user((char *)lon, (char *)&loop_diagnostics_completed, sizeof(int));    
4870                         break;
4871                         
4872 //<< end SHC
4873                 case LOOP_DIAGNOSTIC_MODE_COMPLETE:
4874                         loop_diagnostics_completed = 1;
4875                         // read adsl mode
4876                         makeCMV(H2D_CMV_READ, STAT, 1, 0, 1, data); 
4877                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4878 #ifdef AMAZON_MEI_DEBUG_ON
4879                                 printk("\n\nCMV fail, Group STAT Address 1 Index 0");
4880 #endif
4881                         }
4882                         adsl_mode = RxMessage[4];
4883
4884                         makeCMV(H2D_CMV_READ, STAT, 17, 0, 1, data); 
4885                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4886 #ifdef AMAZON_MEI_DEBUG_ON
4887                                 printk("\n\nCMV fail, Group STAT Address 1 Index 0");
4888 #endif
4889                         }
4890                         adsl_mode_extend = RxMessage[4];
4891                         wake_up_interruptible(&wait_queue_loop_diagnostic);     
4892                         break;
4893                 case SET_ADSL_LOOP_DIAGNOSTICS_MODE:
4894                         if (lon != loop_diagnostics_mode)
4895                         {
4896                                 loop_diagnostics_completed = 0;
4897                                 loop_diagnostics_mode = lon;
4898
4899                                 mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_REBOOT, NULL);
4900                                 
4901                         }
4902                         break;
4903                 case GET_ADSL_ATUR_SUBCARRIER_STATS:
4904                         if (loop_diagnostics_completed == 0)
4905                         {
4906                                 interruptible_sleep_on_timeout(&wait_queue_loop_diagnostic,300*HZ);
4907                                 if (loop_diagnostics_completed==0)
4908                                 {
4909                                         return -ERESTARTSYS;
4910                                 }
4911                         }
4912                         if(down_interruptible(&mei_sema))
4913                                 return -ERESTARTSYS;
4914                                 
4915                         pts.adslATURSubcarrierInfo_pt = (adslATURSubcarrierInfo *)kmalloc(sizeof(adslATURSubcarrierInfo), GFP_KERNEL);
4916                         copy_from_user((char *)pts.adslATURSubcarrierInfo_pt, (char *)lon, sizeof(adslATURSubcarrierInfo));
4917                         
4918                         if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)),  FAREND_HLINSC)){
4919                                 FAREND_HLINSC_MAKECMV(H2D_CMV_READ);
4920                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4921 #ifdef AMAZON_MEI_DEBUG_ON
4922                                         printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
4923 #endif
4924                                         pts.adslATURSubcarrierInfo_pt->HLINSCds = 0;    
4925                                 }
4926                                 else{
4927                                         pts.adslATURSubcarrierInfo_pt->HLINSCds = RxMessage[4];
4928                                         
4929                                 }
4930                         }
4931                         if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)),  FAREND_HLINPS)){
4932                                 int index=0,size=12;
4933                                 //printk("FAREND_HLINPS\n");
4934                                 for (index=0;index<1024;index+=size)
4935                                 {
4936                                         if (index+size>=1024)
4937                                                 size = 1024-index;
4938                                         FAREND_HLINPS_MAKECMV(H2D_CMV_READ,index,size);
4939                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4940 #ifdef AMAZON_MEI_DEBUG_ON
4941                                                 printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
4942 #endif
4943                                         }
4944                                         else{
4945                                                 memcpy(&pts.adslATURSubcarrierInfo_pt->HLINpsds[index],&RxMessage[4],size*2);
4946 #if 0
4947                                                 int msg_idx;
4948                                                 for(msg_idx=0;msg_idx<size;msg_idx++)
4949                                                         printk("index:%d ,cmv_result: %04X\n",index+msg_idx,RxMessage[4+msg_idx]);
4950 #endif
4951                                         }
4952                                 }
4953                         }
4954                         
4955                         if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)),  FAREND_HLOGMT)){
4956                                 FAREND_HLOGMT_MAKECMV(H2D_CMV_READ);
4957                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4958 #ifdef AMAZON_MEI_DEBUG_ON
4959                                         printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
4960 #endif
4961                                         pts.adslATURSubcarrierInfo_pt->HLOGMTds = 0;    
4962                                 }
4963                                 else{
4964                                         pts.adslATURSubcarrierInfo_pt->HLOGMTds = RxMessage[4];
4965                                         
4966                                 }
4967                         }
4968                         
4969                         /////////////////////////////////////////////////////////////////////////
4970                         if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)),  FAREND_HLOGPS)){
4971                                 //printk("FAREND_HLOGPS\n");
4972                                 int index=0,size=12;
4973                                 for (index=0;index<256;index+=size)
4974                                 {
4975                                         if (index+size>=256)
4976                                                 size = 256-index;
4977
4978                                         FAREND_HLOGPS_MAKECMV(H2D_CMV_READ,index,size);
4979                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
4980 #ifdef AMAZON_MEI_DEBUG_ON
4981                                                 printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
4982 #endif
4983                                         }
4984                                         else{
4985                                                 if (adsl_mode < 0x4000 && adsl_mode_extend==0)//adsl2 mode
4986                                                 {
4987                                                         memcpy(&pts.adslATURSubcarrierInfo_pt->HLOGpsds[index],&RxMessage[4],size*2);
4988                                                 }else
4989                                                 {
4990                                                         int msg_idx=0;
4991                                                         for (msg_idx=0;msg_idx<size;msg_idx++)
4992                                                         {
4993                                                                 pts.adslATURSubcarrierInfo_pt->HLOGpsds[(index+msg_idx)*2+1] = RxMessage[4+msg_idx];
4994                                                                 //printk("index:%d ,cmv_result: %04X\n",index+msg_idx,RxMessage[4+msg_idx]);
4995                                                         }
4996                                                 }       
4997                                         }
4998                                 }
4999                                 if (adsl_mode >= 0x4000 || adsl_mode_extend >0)//adsl2+ mode
5000                                 {
5001                                         pts.adslATURSubcarrierInfo_pt->HLOGpsds[0] = pts.adslATURSubcarrierInfo_pt->HLOGpsds[1];
5002                                         for (index=1;index<256;index++)
5003                                         {
5004                                                 pts.adslATURSubcarrierInfo_pt->HLOGpsds[index*2]   = (pts.adslATURSubcarrierInfo_pt->HLOGpsds[(index)*2-1] +  pts.adslATURSubcarrierInfo_pt->HLOGpsds[(index)*2+1] +1) >>1;
5005                                         }
5006                                 }
5007                         }
5008                         if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)),  FAREND_QLNMT)){
5009                                 FAREND_QLNMT_MAKECMV(H2D_CMV_READ);
5010                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5011 #ifdef AMAZON_MEI_DEBUG_ON
5012                                         printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
5013 #endif
5014                                         pts.adslATURSubcarrierInfo_pt->QLNMTds = 0;     
5015                                 }
5016                                 else{
5017                                         pts.adslATURSubcarrierInfo_pt->QLNMTds = RxMessage[4];                                  
5018                                 }
5019                         }
5020                         
5021                         /////////////////////////////////////////////////////////////////////////
5022                         if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)),  FAREND_QLNPS)){
5023                                 int index=0,size=12;
5024                                 //printk("FAREND_QLNPS\n");
5025                                 for (index=0;index<128;index+=size)
5026                                 {
5027                                         if (index+size>=128)
5028                                                 size = 128-index;
5029                                         FAREND_QLNPS_MAKECMV(H2D_CMV_READ,index,size);
5030                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5031 #ifdef AMAZON_MEI_DEBUG_ON
5032                                                 printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
5033 #endif
5034                                         }
5035                                         else{
5036                                                 int msg_idx=0;
5037                                                 for (msg_idx=0;msg_idx<size;msg_idx++)
5038                                                 {
5039                                                         //memcpy(&pts.adslATURSubcarrierInfo_pt->QLNpsds[index],&RxMessage[4],size*2);
5040                                                         if (adsl_mode < 0x4000 && adsl_mode_extend==0)//adsl2 mode
5041                                                         {
5042                                                                 pts.adslATURSubcarrierInfo_pt->QLNpsds[(index+msg_idx)*2] = (u16)(RxMessage[4+msg_idx]&0xFF);
5043                                                                 pts.adslATURSubcarrierInfo_pt->QLNpsds[(index+msg_idx)*2+1] = (u16)((RxMessage[4+msg_idx]>>8)&0xFF);
5044                                                         }else
5045                                                         {
5046                                                                 pts.adslATURSubcarrierInfo_pt->QLNpsds[(index+msg_idx)*4+1] = (u16)(RxMessage[4+msg_idx]&0xFF);
5047                                                                 pts.adslATURSubcarrierInfo_pt->QLNpsds[(index+msg_idx)*4+3] = (u16)((RxMessage[4+msg_idx]>>8)&0xFF);
5048                                                                 //printk("index:%d ,cmv_result: %04X\n",index+msg_idx,RxMessage[4+msg_idx]);
5049                                                         }
5050                                                 }
5051
5052                                                 
5053                                         }
5054                                 }
5055                                 if (adsl_mode >= 0x4000 || adsl_mode_extend >0)//adsl2+ mode
5056                                 {
5057                                         pts.adslATURSubcarrierInfo_pt->QLNpsds[0] = pts.adslATURSubcarrierInfo_pt->QLNpsds[1];
5058                                         for (index=1;index<256;index++)
5059                                         {
5060                                                 pts.adslATURSubcarrierInfo_pt->QLNpsds[index*2]   = (pts.adslATURSubcarrierInfo_pt->QLNpsds[(index)*2-1] +  pts.adslATURSubcarrierInfo_pt->QLNpsds[(index)*2+1]) >>1;
5061                                         }
5062                                 }
5063                         }
5064                         if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)),  FAREND_SNRMT)){
5065                                 FAREND_SNRMT_MAKECMV(H2D_CMV_READ);
5066                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5067 #ifdef AMAZON_MEI_DEBUG_ON
5068                                         printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
5069 #endif
5070                                         pts.adslATURSubcarrierInfo_pt->SNRMTds = 0;     
5071                                 }
5072                                 else{
5073                                         pts.adslATURSubcarrierInfo_pt->SNRMTds = RxMessage[4];                                  
5074                                 }
5075                         }
5076                         if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)),  FAREND_SNRPS)){
5077                                 int index=0,size=12;
5078                                 //printk("FAREND_SNRPS\n");
5079                                 for (index=0;index<512;index+=size)
5080                                 {
5081                                         if (index+size>=512)
5082                                                 size = 512-index;
5083                                         FAREND_SNRPS_MAKECMV(H2D_CMV_READ,index,size);
5084                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5085 #ifdef AMAZON_MEI_DEBUG_ON
5086                                                 printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
5087 #endif
5088                                         }
5089                                         else{
5090                                                 //memcpy(&pts.adslATURSubcarrierInfo_pt->SNRpsds[index],&RxMessage[4],size*2);
5091                                                 int msg_idx=0;
5092                                                 for (msg_idx=0;msg_idx<size;msg_idx++)
5093                                                 {
5094                                                         pts.adslATURSubcarrierInfo_pt->SNRpsds[index+msg_idx] = (u16)(RxMessage[4+msg_idx]&0xFF);
5095                                                         //printk("index:%d ,cmv_result: %04X\n",index+msg_idx,RxMessage[4+msg_idx]);
5096                                                 }
5097                                                 
5098                                         }
5099                                 }
5100                         }
5101                         if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)),  FAREND_BITPS)){
5102                                 int index=0,size=12;
5103                                 //printk("FAREND_BITPS\n");
5104                                 for (index=0;index<256;index+=size)
5105                                 {
5106                                         if (index+size>=256)
5107                                                 size = 256-index;
5108                                         FAREND_BITPS_MAKECMV(H2D_CMV_READ,index,size);
5109                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5110 #ifdef AMAZON_MEI_DEBUG_ON
5111                                                 printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
5112 #endif
5113                                         }
5114                                         else{
5115                                                 int msg_idx=0;
5116                                                 for (msg_idx=0;msg_idx<size;msg_idx++)
5117                                                 {
5118                                                         pts.adslATURSubcarrierInfo_pt->BITpsds[(index+msg_idx)*2] = (u16)(RxMessage[4+msg_idx]&0xFF);
5119                                                         pts.adslATURSubcarrierInfo_pt->BITpsds[(index+msg_idx)*2+1] = (u16)((RxMessage[4+msg_idx]>>8)&0xFF);
5120                                                         //printk("index:%d ,cmv_result: %04X, %d\n",index+msg_idx,RxMessage[4+msg_idx],RxMessage[4+msg_idx]);
5121                                                         
5122                                                 }
5123                                                 
5124                                         }
5125                                 }
5126                         }
5127                         if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)),  FAREND_GAINPS)){
5128                                 int index=0,size=12;
5129                                 //printk("FAREND_GAINPS\n");
5130                                 for (index=0;index<512;index+=size)
5131                                 {
5132                                         FAREND_GAINPS_MAKECMV(H2D_CMV_READ,index,size);
5133                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5134 #ifdef AMAZON_MEI_DEBUG_ON
5135                                                 printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
5136 #endif
5137                                         }
5138                                         else{
5139                                         /*
5140                                                 int msg_idx=0;
5141                                                 for (msg_idx=0;msg_idx<size;msg_idx++)
5142                                                 {
5143                                                         pts.adslATURSubcarrierInfo_pt->GAINpsds[(index+msg_idx)*2] = RxMessage[4+msg_idx]&0xFF;
5144                                                         pts.adslATURSubcarrierInfo_pt->GAINpsds[(index+msg_idx)*2+1] = (RxMessage[4+msg_idx]>>8)&0xFF;
5145                                                         
5146                                                 }
5147                                                 */
5148                                                 memcpy(&pts.adslATURSubcarrierInfo_pt->GAINpsds[index],&RxMessage[4],size*2);   
5149 #if 0
5150                                                 int msg_idx=0;
5151                                                 for (msg_idx=0;msg_idx<size;msg_idx++)
5152                                                 {
5153                                                         printk("index:%d ,cmv_result: %04X\n",index+msg_idx,RxMessage[4+msg_idx]);
5154                                                         
5155                                                 }
5156 #endif
5157                                         }
5158                                 }
5159                         }                               
5160                         copy_to_user((char *)lon, (char *)pts.adslATURSubcarrierInfo_pt, sizeof(adslATURSubcarrierInfo));               
5161                         kfree(pts.adslATURSubcarrierInfo_pt);
5162                         
5163                         up(&mei_sema);
5164                         break;
5165                 case GET_ADSL_ATUC_SUBCARRIER_STATS:
5166                         if (loop_diagnostics_completed == 0)
5167                         {
5168                                 interruptible_sleep_on_timeout(&wait_queue_loop_diagnostic,300*HZ);
5169                                 if (loop_diagnostics_completed==0)
5170                                 {
5171                                         return -ERESTARTSYS;
5172                                 }
5173                         }
5174                         if(down_interruptible(&mei_sema))
5175                                 return -ERESTARTSYS;
5176                         pts.adslATUCSubcarrierInfo_pt = (adslATUCSubcarrierInfo *)kmalloc(sizeof(adslATUCSubcarrierInfo), GFP_KERNEL);
5177                         copy_from_user((char *)pts.adslATUCSubcarrierInfo_pt, (char *)lon, sizeof(adslATUCSubcarrierInfo));
5178                         
5179                         
5180                         if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)),  NEAREND_HLINSC)){
5181                                 NEAREND_HLINSC_MAKECMV(H2D_CMV_READ);
5182                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5183 #ifdef AMAZON_MEI_DEBUG_ON
5184                                         printk("\n\nCMV fail, Group INFO Address 71 Index 2");
5185 #endif
5186                                         pts.adslATUCSubcarrierInfo_pt->HLINSCus = 0;    
5187                                 }
5188                                 else{
5189                                         pts.adslATUCSubcarrierInfo_pt->HLINSCus = RxMessage[4];
5190                                         
5191                                 }
5192                         }
5193                         if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)),  NEAREND_HLINPS)){
5194                                 int index=0,size=12;
5195                                 //printk("NEAREND_HLINPS\n");
5196                                 for (index=0;index<128;index+=size)
5197                                 {
5198                                         if (index+size>=128)
5199                                                 size = 128-index;
5200                                         NEAREND_HLINPS_MAKECMV(H2D_CMV_READ,index,size);
5201                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5202 #ifdef AMAZON_MEI_DEBUG_ON
5203                                                 printk("\n\nCMV fail, Group INFO Address 73 Index 0");
5204 #endif
5205                                         }
5206                                         else{
5207                                                 memcpy(&pts.adslATUCSubcarrierInfo_pt->HLINpsus[index],&RxMessage[4],size*2);
5208 #if 0
5209                                                 int msg_idx;
5210                                                 for (msg_idx=0;msg_idx<size;msg_idx++)
5211                                                 {
5212                                                         printk("index:%d ,cmv_result: %04X\n",index+msg_idx,RxMessage[4+msg_idx]);
5213                                                 }
5214 #endif
5215                                         }
5216                                 }
5217                         }
5218                         
5219                         if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)),  NEAREND_HLOGMT)){
5220                                 NEAREND_HLOGMT_MAKECMV(H2D_CMV_READ);
5221                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5222 #ifdef AMAZON_MEI_DEBUG_ON
5223                                         printk("\n\nCMV fail, Group INFO Address 80 Index 0");
5224 #endif
5225                                         pts.adslATUCSubcarrierInfo_pt->HLOGMTus = 0;    
5226                                 }
5227                                 else{
5228                                         pts.adslATUCSubcarrierInfo_pt->HLOGMTus = RxMessage[4];
5229                                         
5230                                 }
5231                         }
5232                         
5233                         /////////////////////////////////////////////////////////////////////////
5234                         if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)),  NEAREND_HLOGPS)){
5235                                 int index=0,size=12;
5236                                 //printk("NEAREND_HLOGPS\n");
5237                                 for (index=0;index<64;index+=size)
5238                                 {
5239                                         if (index+size>=64)
5240                                                 size = 64-index;
5241                                         NEAREND_HLOGPS_MAKECMV(H2D_CMV_READ,index,size);
5242                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5243 #ifdef AMAZON_MEI_DEBUG_ON
5244                                                 printk("\n\nCMV fail, Group INFO Address 75 Index 0");
5245 #endif
5246                                         }
5247                                         else{                                           
5248 #if 0
5249                                                 if (adsl_mode <0x4000)//adsl /adsl2 mode
5250                                                 {
5251 #endif
5252                                                 memcpy(&pts.adslATUCSubcarrierInfo_pt->HLOGpsus[index],&RxMessage[4],size*2);
5253 #if 0
5254                                                 }else
5255                                                 {
5256                                                         int msg_idx=0;
5257                                                         for (msg_idx=0;msg_idx<size;msg_idx++)
5258                                                         {
5259                                                                 //pts.adslATUCSubcarrierInfo_pt->HLOGpsus[(index+msg_idx)*2+1] = RxMessage[4+msg_idx];
5260                                                                 pts.adslATUCSubcarrierInfo_pt->HLOGpsus[(index+msg_idx)] = RxMessage[4+msg_idx];
5261                                                         }
5262                                                 }                                               
5263 #endif
5264                                         }
5265                                 }
5266 #if 0
5267                                 if (adsl_mode >= 0x4000)//adsl2 mode
5268                                 {
5269                                         pts.adslATUCSubcarrierInfo_pt->HLOGpsus[0] = pts.adslATUCSubcarrierInfo_pt->HLOGpsus[1];
5270                                         for (index=1;index<64;index++)
5271                                         {
5272                                                 pts.adslATUCSubcarrierInfo_pt->HLOGpsus[index*2]   = (pts.adslATUCSubcarrierInfo_pt->HLOGpsus[(index)*2-1] +  pts.adslATUCSubcarrierInfo_pt->HLOGpsus[(index)*2+1]) >>1;
5273                                         }
5274                                 }
5275 #endif
5276                         }
5277                         if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)),  NEAREND_QLNMT)){
5278                                 NEAREND_QLNMT_MAKECMV(H2D_CMV_READ);
5279                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5280 #ifdef AMAZON_MEI_DEBUG_ON
5281                                         printk("\n\nCMV fail, Group INFO Address 80 Index 1");
5282 #endif
5283                                         pts.adslATUCSubcarrierInfo_pt->QLNMTus = 0;     
5284                                 }
5285                                 else{
5286                                         pts.adslATUCSubcarrierInfo_pt->QLNMTus = RxMessage[4];                                  
5287                                 }
5288                         }
5289                         
5290                         /////////////////////////////////////////////////////////////////////////
5291                         if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)),  NEAREND_QLNPS)){
5292                                 int index=0,size=12;
5293                                 //printk("NEAREND_QLNPS\n");
5294                                 for (index=0;index<32;index+=size)
5295                                 {
5296                                         if (index+size>=32)
5297                                                 size = 32-index;
5298                                         NEAREND_QLNPS_MAKECMV(H2D_CMV_READ,index,size);
5299                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5300 #ifdef AMAZON_MEI_DEBUG_ON
5301                                                 printk("\n\nCMV fail, Group INFO Address 77 Index 0");
5302 #endif
5303                                         }
5304                                         else{
5305                                                 int msg_idx=0;
5306                                                 for (msg_idx=0;msg_idx<size;msg_idx++)
5307                                                 {
5308
5309 #if 0
5310                                                         //memcpy(&pts.adslATUCSubcarrierInfo_pt->QLNpsds[index],&RxMessage[4],size*2);
5311                                                         if (adsl_mode == 0x200 || adsl_mode == 0x800 || adsl_mode ==0x2000  || adsl_mode ==0x4000 || (adsl_mode == 0 && (adsl_mode_extend == 0x4 || adsl_mode_extend == 0x2))//ADSL 2 Annex B(0x200)/J(0x800)/M(0x2000) //ADSL 2+ B,J,M
5312                                                         if (adsl_mode < 0x4000 && adsl_mode_extend==0)//adsl2 mode
5313                                                         {
5314                                                                 pts.adslATUCSubcarrierInfo_pt->QLNpsus[(index+msg_idx)*4+1] = (u16)(RxMessage[4+msg_idx]&0xFF);
5315                                                                 pts.adslATUCSubcarrierInfo_pt->QLNpsus[(index+msg_idx)*4+3] = (u16)((RxMessage[4+msg_idx]>>8)&0xFF);
5316                                                         }else
5317 #endif
5318                                                         {
5319                                                                 pts.adslATUCSubcarrierInfo_pt->QLNpsus[(index+msg_idx)*2] = (u16)(RxMessage[4+msg_idx]&0xFF);
5320                                                                 pts.adslATUCSubcarrierInfo_pt->QLNpsus[(index+msg_idx)*2+1] = (u16)((RxMessage[4+msg_idx]>>8)&0xFF);
5321                                                         //printk("index:%d ,cmv_result: %04X\n",index+msg_idx,RxMessage[4+msg_idx]);
5322                                                         }
5323                                                 }
5324
5325                                                 
5326                                         }
5327                                 }
5328 #if 0
5329                                 //if (adsl_mode <0x4000)//Annex I/J/L/M
5330                                 if (adsl_mode == 0x200 || adsl_mode == 0x800 || adsl_mode ==0x2000  || adsl_mode ==0x4000 || (adsl_mode == 0 && (adsl_mode_extend == 0x4 || adsl_mode_extend == 0x2))//ADSL 2 Annex B(0x200)/J(0x800)/M(0x2000) //ADSL 2+ B,J,M
5331                                 {
5332                                         pts.adslATUCSubcarrierInfo_pt->QLNpsus[0] = pts.adslATUCSubcarrierInfo_pt->QLNpsus[1];
5333                                         for (index=1;index<64;index++)
5334                                         {
5335                                                 pts.adslATUCSubcarrierInfo_pt->QLNpsus[index*2]   = (pts.adslATUCSubcarrierInfo_pt->QLNpsus[(index)*2-1] +  pts.adslATUCSubcarrierInfo_pt->QLNpsus[(index)*2+1]) >>1;
5336                                         }
5337                                 }
5338 #endif
5339                         }
5340                         if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)),  NEAREND_SNRMT)){
5341                                 NEAREND_SNRMT_MAKECMV(H2D_CMV_READ);
5342                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5343 #ifdef AMAZON_MEI_DEBUG_ON
5344                                         printk("\n\nCMV fail, Group INFO Address 80 Index 2");
5345 #endif
5346                                         pts.adslATUCSubcarrierInfo_pt->SNRMTus = 0;     
5347                                 }
5348                                 else{
5349                                         pts.adslATUCSubcarrierInfo_pt->SNRMTus = RxMessage[4];                                  
5350                                 }
5351                         }
5352                         if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)),  NEAREND_SNRPS)){
5353                                 int index=0,size=12;
5354                                 //printk("NEAREND_SNRPS\n");
5355                                 for (index=0;index<64;index+=size)
5356                                 {
5357                                         if (index+size>=64)
5358                                                 size = 64-index;
5359                                         NEAREND_SNRPS_MAKECMV(H2D_CMV_READ,index,size);
5360                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5361 #ifdef AMAZON_MEI_DEBUG_ON
5362                                                 printk("\n\nCMV fail, Group INFO Address 78 Index 0");
5363 #endif
5364                                         }
5365                                         else{
5366                                                 //memcpy(&pts.adslATUCSubcarrierInfo_pt->SNRpsus[index],&RxMessage[4],size*2);
5367                                                 int msg_idx=0;
5368                                                 for (msg_idx=0;msg_idx<size;msg_idx++)
5369                                                 {
5370                                                         pts.adslATUCSubcarrierInfo_pt->SNRpsus[index+msg_idx] = (u16)(RxMessage[4+msg_idx]&0xFF);
5371                                                         //printk("index:%d ,cmv_result: %04X\n",index+msg_idx,RxMessage[4+msg_idx]);
5372                                                 }
5373                                                 
5374                                         }
5375                                 }
5376                         }
5377                         if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)),  NEAREND_BITPS)){
5378                                 int index=0,size=12;
5379                                 //printk("NEAREND_BITPS\n");
5380                                 for (index=0;index<32;index+=size)
5381                                 {
5382                                         if (index+size>=32)
5383                                                 size = 32-index;
5384                                         NEAREND_BITPS_MAKECMV(H2D_CMV_READ,index,size);
5385                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5386 #ifdef AMAZON_MEI_DEBUG_ON
5387                                                 printk("\n\nCMV fail, Group INFO Address 22 Index 0");
5388 #endif
5389                                         }
5390                                         else{
5391                                                 int msg_idx=0;
5392                                                 for (msg_idx=0;msg_idx<size;msg_idx++)
5393                                                 {
5394                                                         pts.adslATUCSubcarrierInfo_pt->BITpsus[(index+msg_idx)*2] = (u16)(RxMessage[4+msg_idx]&0xFF);
5395                                                         pts.adslATUCSubcarrierInfo_pt->BITpsus[(index+msg_idx)*2+1] = (u16)((RxMessage[4+msg_idx]>>8)&0xFF);
5396                                                         //printk("index:%d ,cmv_result: %04X\n",index+msg_idx,RxMessage[4+msg_idx]);
5397                                                 }
5398                                                 
5399                                         }
5400                                 }
5401                         }
5402                         if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)),  NEAREND_GAINPS)){
5403                                 int index=0,size=12;
5404                                 //printk("NEAREND_GAINPS\n");
5405                                 for (index=0;index<64;index+=size)
5406                                 {
5407                                         if (index+size>=64)
5408                                                 size = 64-index;
5409                                         NEAREND_GAINPS_MAKECMV(H2D_CMV_READ,index,size);
5410                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5411 #ifdef AMAZON_MEI_DEBUG_ON
5412                                                 printk("\n\nCMV fail, Group INFO Address 24 Index 0");
5413 #endif
5414                                         }
5415                                         else{
5416                                         /*
5417                                                 int msg_idx=0;
5418                                                 for (msg_idx=0;msg_idx<size;msg_idx++)
5419                                                 {
5420                                                         pts.adslATUCSubcarrierInfo_pt->GAINpsds[(index+msg_idx)*2] = RxMessage[4+msg_idx]&0xFF;
5421                                                         pts.adslATUCSubcarrierInfo_pt->GAINpsds[(index+msg_idx)*2+1] = (RxMessage[4+msg_idx]>>8)&0xFF;
5422                                                         
5423                                                 }
5424                                                 */
5425                                                 memcpy(&pts.adslATUCSubcarrierInfo_pt->GAINpsus[index],&RxMessage[4],size*2);   
5426 #if 0
5427                                                 int msg_idx;
5428                                                 for (msg_idx=0;msg_idx<size;msg_idx++)
5429                                                 {
5430                                                         printk("index:%d ,cmv_result: %04X\n",index+msg_idx,RxMessage[4+msg_idx]);
5431                                                 }
5432 #endif
5433                                         }
5434                                 }
5435                         }                               
5436                         copy_to_user((char *)lon, (char *)pts.adslATUCSubcarrierInfo_pt, sizeof(adslATUCSubcarrierInfo));               
5437                         kfree(pts.adslATUCSubcarrierInfo_pt);                   
5438                         up(&mei_sema);
5439                         break;
5440                 case GET_ADSL_LINE_INIT_STATS:                  
5441                         copy_to_user((char *)lon, (char *)&AdslInitStatsData, sizeof(AdslInitStatsData));               
5442                         break;
5443                 
5444                 case GET_ADSL_POWER_SPECTRAL_DENSITY:           
5445                         if(down_interruptible(&mei_sema))
5446                                 return -ERESTARTSYS;
5447                         i=0;
5448                         pts.adslPowerSpectralDensity_pt = (adslPowerSpectralDensity *)kmalloc(sizeof(adslPowerSpectralDensity), GFP_KERNEL);
5449                         memset((char *)pts.adslPowerSpectralDensity_pt, 0, sizeof(adslPowerSpectralDensity));   
5450
5451                         //US
5452                         NOMPSD_US_MAKECMV;
5453                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5454 #ifdef AMAZON_MEI_DEBUG_ON
5455                                 printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
5456 #endif
5457                                 i=-1;
5458                         }
5459                         else{
5460                                 j=RxMessage[4];
5461                         }
5462                         PCB_US_MAKECMV;
5463                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5464 #ifdef AMAZON_MEI_DEBUG_ON
5465                                 printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
5466 #endif
5467                                 i=-1;
5468                         }
5469                         else{
5470                                 temp=RxMessage[4];
5471                         }
5472                         RMSGI_US_MAKECMV;
5473                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5474 #ifdef AMAZON_MEI_DEBUG_ON
5475                                 printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
5476 #endif
5477                                 i=-1;
5478                         }
5479                         else{
5480                                 k=(int16_t)RxMessage[4];
5481                         }
5482                         if (i==0)
5483                         {
5484                                 pts.adslPowerSpectralDensity_pt->ACTPSDus = ((int )(j*256 - temp*10*256 + k*10)) /256;
5485                         }
5486                         // DS
5487                         i=0;
5488                         j=temp=temp2=0;
5489                         NOMPSD_DS_MAKECMV;
5490                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5491 #ifdef AMAZON_MEI_DEBUG_ON
5492                                 printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
5493 #endif
5494                                 i=-1;
5495                         }
5496                         else{
5497                                 j=RxMessage[4];
5498                         }
5499                         PCB_DS_MAKECMV;
5500                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5501 #ifdef AMAZON_MEI_DEBUG_ON
5502                                 printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
5503 #endif
5504                                 i=-1;
5505                         }
5506                         else{
5507                                 temp=RxMessage[4];
5508                         }
5509                         RMSGI_DS_MAKECMV;
5510                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5511 #ifdef AMAZON_MEI_DEBUG_ON
5512                                 printk("\n\nCMV fail, Group PLAM Address 35 Index 0");
5513 #endif
5514                                 i=-1;
5515                         }
5516                         else{
5517                                 //temp2=RxMessage[4];
5518                                 k=(int16_t)RxMessage[4];
5519                         }
5520                         if (i==0)
5521                         {
5522                                 pts.adslPowerSpectralDensity_pt->ACTPSDds = ((int )(j*256 - temp*10*256 + k*10)) /256;
5523                         }
5524                         copy_to_user((char *)lon, (char *)pts.adslPowerSpectralDensity_pt, sizeof(adslPowerSpectralDensity));   
5525                         kfree(pts.adslPowerSpectralDensity_pt);         
5526                         up(&mei_sema);
5527                         break;
5528                 case AMAZON_MEI_START:
5529                         showtime=0;
5530                         loop_diagnostics_completed = 0;
5531 #ifdef  ARC_READY_ACK
5532 #ifdef LOCK_RETRY
5533                         i=0;
5534 lock_retry:
5535                         if(down_trylock(&mei_sema)!=0)
5536                         {
5537                                 reboot_lock = 1;
5538                                 printk("lock fail\n");
5539                                 i++;
5540                                 if (i <=5)
5541                                 {
5542                                         set_current_state(TASK_INTERRUPTIBLE);
5543                                         schedule_timeout(10);
5544                                         goto lock_retry;
5545                                 }else
5546                                 {
5547                                         printk("Force to Reboot ADSL!\n");
5548                                         up(&mei_sema);
5549                                         set_current_state(TASK_INTERRUPTIBLE);
5550                                         schedule_timeout(1000);
5551                                         sema_init(&mei_sema, 1);  // semaphore initialization, mutex
5552                                 }
5553                         }else
5554                         {
5555                                 reboot_lock = 1;
5556                         }
5557 #else
5558                         if(down_interruptible(&mei_sema))       //disable CMV access until ARC ready
5559                         {
5560                                 return -ERESTARTSYS;
5561                         }
5562 #endif
5563 #endif
5564                         //CLEAR_BIT((*((volatile u32 *)0xB0100B40)), 0x40); //Warning LED GPIO ON
5565                         if(chantype.interleave==1){
5566                                 kfree(interleave_mei_net.priv);
5567                                 unregister_netdev(&interleave_mei_net);
5568                         }
5569                         else if(chantype.fast==1){
5570                                 kfree(fast_mei_net.priv);
5571                                 unregister_netdev(&fast_mei_net);
5572                         }               
5573                         chantype.interleave=0;
5574                         chantype.fast=0;
5575                         meiMailboxInterruptsDisable(); //disable all MEI interrupts
5576                         if(mei_arc_swap_buff == NULL){
5577                         mei_arc_swap_buff = (u32 *)kmalloc(MAXSWAPSIZE*4, GFP_KERNEL);
5578                         if(mei_arc_swap_buff==NULL){
5579 #ifdef AMAZON_MEI_DEBUG_ON
5580                                 printk("\n\n malloc fail for codeswap buff");
5581 #endif
5582                                 meierr=MEI_FAILURE;
5583                         }
5584                         }
5585                         if(meiForceRebootAdslModem() != MEI_SUCCESS){
5586 #ifdef AMAZON_MEI_DEBUG_ON
5587                                 printk("\n\n meiForceRebootAdslModem()  error...");
5588 #endif
5589                                 meierr=MEI_FAILURE;
5590                         }     
5591                         interruptible_sleep_on(&wait_queue_codeswap);
5592                         // reset is called
5593                         break;
5594                 case AMAZON_MEI_MIB_DAEMON:
5595 #ifdef IFX_SMALL_FOOTPRINT /* [ */
5596                         return -1;
5597 #else /* ][ !IFX_SMALL_FOOTPRINT */
5598                         i=0;
5599                         while(1){
5600                                 if(i<MIB_INTERVAL)
5601                                         interruptible_sleep_on_timeout(&wait_queue_mibdaemon, ((MIB_INTERVAL-i)/(1000/HZ)));
5602                                 i=0;
5603                                 if(showtime==1){
5604 //                                      printk("\n\n update mib");
5605                                         
5606                                         do_gettimeofday(&time_now);
5607                                         if(time_now.tv_sec - current_intvl->start_time.tv_sec>=900){
5608                                                 if(current_intvl->list.next!=&interval_list){
5609                                                         current_intvl = list_entry(current_intvl->list.next, amazon_mei_mib, list);
5610                                                         do_gettimeofday(&(current_intvl->start_time));
5611                                                 }
5612                                                 else{
5613                                                         mib_ptr = list_entry(interval_list.next, amazon_mei_mib, list);
5614                                                         list_del(interval_list.next);
5615                                                         memset(mib_ptr, 0, sizeof(amazon_mei_mib));
5616                                                         list_add_tail(&(mib_ptr->list), &interval_list);
5617                                                         if(current_intvl->list.next==&interval_list)
5618 #ifdef AMAZON_MEI_DEBUG_ON
5619                                                                 printk("\n\nlink list error");
5620 #endif
5621                                                         current_intvl = list_entry(current_intvl->list.next, amazon_mei_mib, list);
5622                                                         do_gettimeofday(&(current_intvl->start_time));
5623                                                 }       
5624                                         }
5625                                         
5626                                         if(down_interruptible(&mei_sema))
5627                                                 return -ERESTARTSYS;
5628 /*                                              
5629                                         ATUC_PERF_LO_FLAG_MAKECMV;
5630                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5631 #ifdef AMAZON_MEI_DEBUG_ON
5632                                                 printk("\n\nCMV fail, Group 7 Address 0 Index 0");
5633 #endif
5634                                         }
5635                                         else{
5636                                                 if(RxMessage[4]&PLAM_LOS_FailureBit){
5637                                                         current_intvl->AtucPerfLos++;
5638                                                         ATUC_PERF_LOSS++;
5639                                                         CurrStatus.adslAtucCurrStatus = 2;
5640                                                 }
5641                                                 if(RxMessage[4]&PLAM_LOF_FailureBit){
5642                                                         current_intvl->AtucPerfLof++;
5643                                                         ATUC_PERF_LOFS++;
5644                                                         CurrStatus.adslAtucCurrStatus = 1;
5645                                                 }
5646                                                 if(!(RxMessage[4]&(PLAM_LOS_FailureBit|PLAM_LOF_FailureBit)))
5647                                                         CurrStatus.adslAtucCurrStatus = 0;
5648                                         }
5649 */
5650                                         ATUC_PERF_ESS_FLAG_MAKECMV;
5651                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5652 #ifdef AMAZON_MEI_DEBUG_ON
5653                                                 printk("\n\nCMV fail, Group 7 Address 7 Index 0");
5654 #endif
5655                                         }
5656                                         else{
5657                                                 temp = RxMessage[4]-mib_pread.ATUC_PERF_ESS;
5658                                                 if(temp>=0){
5659                                                         current_intvl->AtucPerfEs+=temp;
5660                                                         ATUC_PERF_ESS+=temp;
5661                                                         mib_pread.ATUC_PERF_ESS = RxMessage[4];
5662                                                 }
5663                                                 else{
5664                                                         current_intvl->AtucPerfEs+=0xffff-mib_pread.ATUC_PERF_ESS+RxMessage[4];
5665                                                         ATUC_PERF_ESS+=0xffff-mib_pread.ATUC_PERF_ESS+RxMessage[4];
5666                                                         mib_pread.ATUC_PERF_ESS = RxMessage[4];         
5667                                                 }
5668                                         }
5669 /*              
5670                                         ATUR_PERF_LO_FLAG_MAKECMV;
5671                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5672 #ifdef AMAZON_MEI_DEBUG_ON
5673                                                 printk("\n\nCMV fail, Group 7 Address 1 Index 0");
5674 #endif
5675                                         }
5676                                         else{
5677                                                 if(RxMessage[4]&PLAM_LOS_FailureBit){
5678                                                         current_intvl->AturPerfLos++;
5679                                                         ATUR_PERF_LOSS++;
5680                                                         CurrStatus.adslAturCurrStatus = 2;
5681                                                 }
5682                                                 if(RxMessage[4]&PLAM_LOF_FailureBit){
5683                                                         current_intvl->AturPerfLof++;
5684                                                         ATUR_PERF_LOFS++;
5685                                                         CurrStatus.adslAturCurrStatus = 1;
5686                                                 }
5687                                                 if(RxMessage[4]&PLAM_LPR_FailureBit){
5688                                                         current_intvl->AturPerfLpr++;
5689                                                         ATUR_PERF_LPR++;
5690                                                         CurrStatus.adslAturCurrStatus = 3;
5691                                                 }
5692                                                 if(!(RxMessage[4]&(PLAM_LOS_FailureBit|PLAM_LOF_FailureBit|PLAM_LPR_FailureBit)))
5693                                                         CurrStatus.adslAturCurrStatus = 0;      
5694                                         }
5695 */
5696                                         ATUR_PERF_ESS_FLAG_MAKECMV;
5697                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5698 #ifdef AMAZON_MEI_DEBUG_ON
5699                                                 printk("\n\nCMV fail, Group 7 Address 33 Index 0");
5700 #endif
5701                                         }
5702                                         else{
5703                                                 temp = RxMessage[4]-mib_pread.ATUR_PERF_ESS;
5704                                                 if(temp>=0){
5705                                                         current_intvl->AturPerfEs+=temp;
5706                                                         ATUR_PERF_ESS+=temp;
5707                                                         mib_pread.ATUR_PERF_ESS = RxMessage[4];
5708                                                 }
5709                                                 else{
5710                                                         current_intvl->AturPerfEs+=0xffff-mib_pread.ATUR_PERF_ESS+RxMessage[4];
5711                                                         ATUR_PERF_ESS+= 0xffff-mib_pread.ATUR_PERF_ESS+RxMessage[4];
5712                                                         mib_pread.ATUR_PERF_ESS=RxMessage[4];
5713                                                 }
5714                                         }
5715                                         // to update rx/tx blocks
5716                                         ATUR_CHAN_RECV_BLK_FLAG_MAKECMV_LSW;
5717                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5718 #ifdef AMAZON_MEI_DEBUG_ON
5719                                                 printk("\n\nCMV fail, Group 7 Address 20 Index 0");
5720 #endif
5721                                         }
5722                                         else{
5723                                                 temp = RxMessage[4];    
5724                                         }
5725                                         ATUR_CHAN_RECV_BLK_FLAG_MAKECMV_MSW;
5726                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5727 #ifdef AMAZON_MEI_DEBUG_ON
5728                                                 printk("\n\nCMV fail, Group 7 Address 21 Index 0");
5729 #endif
5730                                         }
5731                                         else{
5732                                                 temp2 = RxMessage[4];   
5733                                         }
5734                                         if((temp + (temp2<<16) - mib_pread.ATUR_CHAN_RECV_BLK)>=0){
5735                                                 current_intvl->AturChanPerfRxBlk+=temp + (temp2<<16) - mib_pread.ATUR_CHAN_RECV_BLK;
5736                                                 ATUR_CHAN_RECV_BLK+=temp + (temp2<<16) - mib_pread.ATUR_CHAN_RECV_BLK;
5737                                                 mib_pread.ATUR_CHAN_RECV_BLK = temp + (temp2<<16);
5738                                                 }       
5739                                         else{
5740                                                 current_intvl->AturChanPerfRxBlk+=0xffffffff - mib_pread.ATUR_CHAN_RECV_BLK +(temp + (temp2<<16));
5741                                                 ATUR_CHAN_RECV_BLK+=0xffffffff - mib_pread.ATUR_CHAN_RECV_BLK +(temp + (temp2<<16));
5742                                                 mib_pread.ATUR_CHAN_RECV_BLK = temp + (temp2<<16);
5743                                         }
5744                                         current_intvl->AturChanPerfTxBlk = current_intvl->AturChanPerfRxBlk;
5745                                         ATUR_CHAN_TX_BLK = ATUR_CHAN_RECV_BLK;
5746 /*                                      
5747                                         ATUR_CHAN_TX_BLK_FLAG_MAKECMV_LSW;
5748                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS)
5749                                                 printk("\n\nCMV fail, Group 7 Address 20 Index 0");
5750                                         else{
5751                                                 if(RxMessage[4]){
5752                                                         current_intvl->AturChanPerfTxBlk+=RxMessage[4];
5753                                                         ATUR_CHAN_TX_BLK+=RxMessage[4];
5754                                                 }       
5755                                         }
5756                                         ATUR_CHAN_TX_BLK_FLAG_MAKECMV_MSW;
5757                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS)
5758                                                 printk("\n\nCMV fail, Group 7 Address 21 Index 0");
5759                                         else{
5760                                                 if(RxMessage[4]){
5761                                                         current_intvl->AturChanPerfTxBlk+=(int)((RxMessage[4])<<16);
5762                                                         ATUR_CHAN_TX_BLK+=(int)((RxMessage[4])<<16);
5763                                                 }       
5764                                         }
5765 */                                      
5766                                         if(chantype.interleave == 1){
5767                                                 ATUR_CHAN_CORR_BLK_FLAG_MAKECMV_INTL;
5768                                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5769 #ifdef AMAZON_MEI_DEBUG_ON
5770                                                         printk("\n\nCMV fail, Group 7 Address 3 Index 0");
5771 #endif
5772                                                 }
5773                                                 else{
5774                                                         temp = RxMessage[4] - mib_pread.ATUR_CHAN_CORR_BLK_INTL;
5775                                                         if(temp>=0){
5776                                                                 current_intvl->AturChanPerfCorrBlk+=temp;
5777                                                                 ATUR_CHAN_CORR_BLK+=temp;
5778                                                                 mib_pread.ATUR_CHAN_CORR_BLK_INTL = RxMessage[4];
5779                                                         }       
5780                                                         else{
5781                                                                 current_intvl->AturChanPerfCorrBlk+=0xffff - mib_pread.ATUR_CHAN_CORR_BLK_INTL +RxMessage[4];
5782                                                                 ATUR_CHAN_CORR_BLK+=0xffff - mib_pread.ATUR_CHAN_CORR_BLK_INTL +RxMessage[4];
5783                                                                 mib_pread.ATUR_CHAN_CORR_BLK_INTL = RxMessage[4];       
5784                                                         }       
5785                                                 }       
5786                                         }
5787                                         else if(chantype.fast == 1){
5788                                                 ATUR_CHAN_CORR_BLK_FLAG_MAKECMV_FAST;
5789                                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5790 #ifdef AMAZON_MEI_DEBUG_ON
5791                                                         printk("\n\nCMV fail, Group 7 Address 3 Index 1");
5792 #endif
5793                                                 }
5794                                                 else{
5795                                                         temp = RxMessage[4] - mib_pread.ATUR_CHAN_CORR_BLK_FAST;
5796                                                         if(temp>=0){
5797                                                                 current_intvl->AturChanPerfCorrBlk+=temp;
5798                                                                 ATUR_CHAN_CORR_BLK+=temp;
5799                                                                 mib_pread.ATUR_CHAN_CORR_BLK_FAST = RxMessage[4];
5800                                                         }       
5801                                                         else{
5802                                                                 current_intvl->AturChanPerfCorrBlk+=0xffff - mib_pread.ATUR_CHAN_CORR_BLK_FAST + RxMessage[4];
5803                                                                 ATUR_CHAN_CORR_BLK+=0xffff - mib_pread.ATUR_CHAN_CORR_BLK_FAST + RxMessage[4];
5804                                                                 mib_pread.ATUR_CHAN_CORR_BLK_FAST = RxMessage[4];
5805                                                         }       
5806                                                 }               
5807                                         }
5808                                         
5809                                         if(chantype.interleave == 1){
5810                                                 ATUR_CHAN_UNCORR_BLK_FLAG_MAKECMV_INTL;
5811                                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5812 #ifdef AMAZON_MEI_DEBUG_ON
5813                                                         printk("\n\nCMV fail, Group 7 Address 2 Index 0");
5814 #endif
5815                                                 }
5816                                                 else{
5817                                                         temp = RxMessage[4] - mib_pread.ATUR_CHAN_UNCORR_BLK_INTL;
5818                                                         if(temp>=0){
5819                                                                 current_intvl->AturChanPerfUncorrBlk+=temp;
5820                                                                 ATUR_CHAN_UNCORR_BLK+=temp;
5821                                                                 mib_pread.ATUR_CHAN_UNCORR_BLK_INTL = RxMessage[4];
5822                                                         }
5823                                                         else{
5824                                                                 current_intvl->AturChanPerfUncorrBlk+=0xffff - mib_pread.ATUR_CHAN_UNCORR_BLK_INTL + RxMessage[4];
5825                                                                 ATUR_CHAN_UNCORR_BLK+=0xffff - mib_pread.ATUR_CHAN_UNCORR_BLK_INTL + RxMessage[4];
5826                                                                 mib_pread.ATUR_CHAN_UNCORR_BLK_INTL = RxMessage[4];
5827                                                         }
5828                                                 }               
5829                                         }
5830                                         else if(chantype.fast == 1){
5831                                                 ATUR_CHAN_UNCORR_BLK_FLAG_MAKECMV_FAST;
5832                                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5833 #ifdef AMAZON_MEI_DEBUG_ON
5834                                                         printk("\n\nCMV fail, Group 7 Address 2 Index 1");
5835 #endif
5836                                                 }
5837                                                 else{
5838                                                         temp = RxMessage[4] - mib_pread.ATUR_CHAN_UNCORR_BLK_FAST;
5839                                                         if(temp>=0){
5840                                                                 current_intvl->AturChanPerfUncorrBlk+=temp;
5841                                                                 ATUR_CHAN_UNCORR_BLK+=temp;
5842                                                                 mib_pread.ATUR_CHAN_UNCORR_BLK_FAST = RxMessage[4];
5843                                                         }
5844                                                         else{
5845                                                                 current_intvl->AturChanPerfUncorrBlk+=0xffff - mib_pread.ATUR_CHAN_UNCORR_BLK_FAST + RxMessage[4];
5846                                                                 ATUR_CHAN_UNCORR_BLK+=0xffff - mib_pread.ATUR_CHAN_UNCORR_BLK_FAST + RxMessage[4];
5847                                                                 mib_pread.ATUR_CHAN_UNCORR_BLK_FAST = RxMessage[4];
5848                                                         }
5849                                                 }               
5850                                         }
5851                                         
5852                                         //RFC-3440
5853
5854 #ifdef AMAZON_MEI_MIB_RFC3440
5855                                         ATUC_PERF_STAT_FASTR_FLAG_MAKECMV; //???
5856                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5857 #ifdef AMAZON_MEI_DEBUG_ON
5858                                                 printk("\n\nCMV fail, Group 0 Address 0 Index 0");
5859 #endif
5860                                         }
5861                                         else{
5862                                                 temp = RxMessage[4] - mib_pread.ATUC_PERF_STAT_FASTR;
5863                                                 if(temp>=0){
5864                                                         current_intvl->AtucPerfStatFastR+=temp;
5865                                                         ATUC_PERF_STAT_FASTR+=temp;
5866                                                         mib_pread.ATUC_PERF_STAT_FASTR = RxMessage[4];
5867                                                 }
5868                                                 else{
5869                                                         current_intvl->AtucPerfStatFastR+=0xffff - mib_pread.ATUC_PERF_STAT_FASTR + RxMessage[4];
5870                                                         ATUC_PERF_STAT_FASTR+=0xffff - mib_pread.ATUC_PERF_STAT_FASTR + RxMessage[4];
5871                                                         mib_pread.ATUC_PERF_STAT_FASTR = RxMessage[4];
5872                                                 }
5873                                         }
5874                                         ATUC_PERF_STAT_FAILED_FASTR_FLAG_MAKECMV; //???
5875                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5876 #ifdef AMAZON_MEI_DEBUG_ON
5877                                                 printk("\n\nCMV fail, Group 0 Address 0 Index 0");
5878 #endif
5879                                         }
5880                                         else{
5881                                                 temp = RxMessage[4] - mib_pread.ATUC_PERF_STAT_FAILED_FASTR;
5882                                                 if(temp>=0){
5883                                                         current_intvl->AtucPerfStatFailedFastR+=temp;
5884                                                         ATUC_PERF_STAT_FAILED_FASTR+=temp;
5885                                                         mib_pread.ATUC_PERF_STAT_FAILED_FASTR = RxMessage[4];
5886                                                 }
5887                                                 else{
5888                                                         current_intvl->AtucPerfStatFailedFastR+=0xffff - mib_pread.ATUC_PERF_STAT_FAILED_FASTR + RxMessage[4];
5889                                                         ATUC_PERF_STAT_FAILED_FASTR+=0xffff - mib_pread.ATUC_PERF_STAT_FAILED_FASTR + RxMessage[4];
5890                                                         mib_pread.ATUC_PERF_STAT_FAILED_FASTR = RxMessage[4];
5891                                                 }
5892                                         }
5893                                         ATUC_PERF_STAT_SESL_FLAG_MAKECMV;
5894                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5895 #ifdef AMAZON_MEI_DEBUG_ON
5896                                                 printk("\n\nCMV fail, Group 7 Address 8 Index 0");
5897 #endif
5898                                         }
5899                                         else{
5900                                                 temp = RxMessage[4] - mib_pread.ATUC_PERF_STAT_SESL;
5901                                                 if(temp>=0){
5902                                                         current_intvl->AtucPerfStatSesL+=temp;
5903                                                         ATUC_PERF_STAT_SESL+=temp;
5904                                                         mib_pread.ATUC_PERF_STAT_SESL = RxMessage[4];
5905                                                 }
5906                                                 else{
5907                                                         current_intvl->AtucPerfStatSesL+=0xffff - mib_pread.ATUC_PERF_STAT_SESL + RxMessage[4];
5908                                                         ATUC_PERF_STAT_SESL+=0xffff - mib_pread.ATUC_PERF_STAT_SESL + RxMessage[4];
5909                                                         mib_pread.ATUC_PERF_STAT_SESL = RxMessage[4];
5910                                                 }
5911                                         }
5912                                         ATUC_PERF_STAT_UASL_FLAG_MAKECMV;
5913                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5914 #ifdef AMAZON_MEI_DEBUG_ON
5915                                                 printk("\n\nCMV fail, Group 7 Address 10 Index 0");
5916 #endif
5917                                         }
5918                                         else{
5919                                                 temp = RxMessage[4] - mib_pread.ATUC_PERF_STAT_UASL;
5920                                                 if(temp>=0){
5921                                                         current_intvl->AtucPerfStatUasL+=temp;
5922                                                         ATUC_PERF_STAT_UASL+=temp;
5923                                                         mib_pread.ATUC_PERF_STAT_UASL = RxMessage[4];
5924                                                 }
5925                                                 else{
5926                                                         current_intvl->AtucPerfStatUasL+=0xffff - mib_pread.ATUC_PERF_STAT_UASL + RxMessage[4];
5927                                                         ATUC_PERF_STAT_UASL+=0xffff - mib_pread.ATUC_PERF_STAT_UASL + RxMessage[4];
5928                                                         mib_pread.ATUC_PERF_STAT_UASL = RxMessage[4];
5929                                                 }
5930                                         }
5931                                         ATUR_PERF_STAT_SESL_FLAG_MAKECMV;
5932                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
5933 #ifdef AMAZON_MEI_DEBUG_ON
5934                                                 printk("\n\nCMV fail, Group 7 Address 34 Index 0");
5935 #endif
5936                                         }
5937                                         else{
5938                                                 temp = RxMessage[4] - mib_pread.ATUR_PERF_STAT_SESL;
5939                                                 if(temp>=0){
5940                                                         current_intvl->AtucPerfStatUasL+=temp;
5941                                                         ATUC_PERF_STAT_UASL+=temp;
5942                                                         mib_pread.ATUR_PERF_STAT_SESL = RxMessage[4];
5943                                                 }
5944                                                 else{
5945                                                         current_intvl->AtucPerfStatUasL+=0xffff - mib_pread.ATUR_PERF_STAT_SESL + RxMessage[4];
5946                                                         ATUC_PERF_STAT_UASL+=0xffff - mib_pread.ATUR_PERF_STAT_SESL + RxMessage[4];
5947                                                         mib_pread.ATUR_PERF_STAT_SESL = RxMessage[4];
5948                                                 }
5949                                         }
5950                                         
5951 #endif
5952                                         up(&mei_sema);
5953                                         
5954                                         do_gettimeofday(&time_fini);
5955                                         i = ((int)((time_fini.tv_sec-time_now.tv_sec)*1000)) + ((int)((time_fini.tv_usec-time_now.tv_usec)/1000))  ; //msec 
5956                                 }//showtime==1
5957                         }        
5958                         break;
5959 #endif /* ] !IFX_SMALL_FOOTPRINT */
5960                 case AMAZON_MEI_RESET:                  
5961                 case AMAZON_MEI_REBOOT:
5962                 case AMAZON_MEI_SHOWTIME:
5963 /*                      if(mei_arc_swap_buff !=NULL){
5964                                 kfree(mei_arc_swap_buff);
5965                                 mei_arc_swap_buff=NULL;
5966                         }       
5967                         if(image_buffer !=NULL){
5968 //                              kfree(image_buffer);
5969                                 vfree(image_buffer);
5970                                 image_buffer =NULL;
5971                         }
5972 */
5973                         if(clreoc_command_pkt !=NULL){
5974                                 kfree(clreoc_command_pkt);
5975                                 clreoc_command_pkt =NULL;
5976                         }
5977                         for(i=0;i<CLREOC_BUFF_SIZE;i++)
5978                                 clreoc_pkt[i].len=0;    //flush all remaining clreoc commands in buffer
5979 /*
5980                         memset(mei_mib, 0, (sizeof(amazon_mei_mib)*INTERVAL_NUM));
5981                         INIT_LIST_HEAD(&interval_list);
5982                         for(i=0;i<INTERVAL_NUM;i++)
5983                                 list_add_tail(&(mei_mib[i].list), &interval_list); 
5984                         current_intvl = list_entry(interval_list.next, amazon_mei_mib, list);
5985                         do_gettimeofday(&(current_intvl->start_time));
5986                         ATUC_PERF_LOFS=0;
5987                         ATUC_PERF_LOSS=0;
5988                         ATUC_PERF_ESS=0;
5989                         ATUC_PERF_INITS=0;
5990                         ATUR_PERF_LOFS=0;
5991                         ATUR_PERF_LOSS=0;
5992                         ATUR_PERF_LPR=0;
5993                         ATUR_PERF_ESS=0;
5994                         ATUR_CHAN_RECV_BLK=0;
5995                         ATUR_CHAN_TX_BLK=0;
5996                         ATUR_CHAN_CORR_BLK=0;
5997                         ATUR_CHAN_UNCORR_BLK=0;
5998                         memset((((u8 *)&AlarmConfProfile)+32), 0, 16*4);
5999                         AlarmConfProfile.adslLineAlarmConfProfileRowStatus=1;
6000 */
6001                         PrevTxRate.adslAtucChanPrevTxRate=0;
6002                         PrevTxRate.adslAturChanPrevTxRate=0;
6003                         CurrStatus.adslAtucCurrStatus=0;
6004                         CurrStatus.adslAturCurrStatus=0;
6005                         
6006                         if((command==AMAZON_MEI_RESET) || (command==AMAZON_MEI_REBOOT)){
6007 #ifdef  AMAZON_CHECK_LINK
6008                                 if (adsl_link_notify){
6009                                         (*adsl_link_notify)(0);
6010                                 }
6011 #endif
6012                                 showtime=0;
6013                                 //CLEAR_BIT((*((volatile u32 *)0xB0100B40)), 0x40); //Warning LED GPIO ON
6014                                 // disconnect net_dev
6015                                 if(chantype.interleave==1){
6016                                         kfree(interleave_mei_net.priv);
6017                                         unregister_netdev(&interleave_mei_net);
6018 //                                      if(unregister_netdev(&interleave_mei_net)!=0)
6019 //                                              printk("\n unregister interleave fail");
6020                                 }
6021                                 else if(chantype.fast==1){
6022                                         kfree(fast_mei_net.priv);
6023                                         unregister_netdev(&fast_mei_net);
6024 //                                      if(unregister_netdev(&fast_mei_net)!=0)
6025 //                                              printk("\n unregister fast fail");
6026                                 }
6027                                 chantype.interleave=0;
6028                                 chantype.fast=0;
6029 // 603221:tc.chen start
6030                                 chantype.bearchannel0 = 0;
6031                                 chantype.bearchannel1 = 0;
6032                                 adsl_mode = 0;
6033 // 603221:tc.chen end
6034                                 
6035                                 while(1){
6036                                         
6037                                         makeCMV(H2D_CMV_READ, STAT, 0, 0, 1, NULL); //maximum allowed tx message length, in bytes
6038                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
6039                                                 //printk("AdslInitStatsData.FullInitializationCount++\n");
6040                                                 AdslInitStatsData.FullInitializationCount++;
6041                                                 //printk("AdslInitStatsData.FailedFullInitializationCount++\n");
6042                                                 AdslInitStatsData.FailedFullInitializationCount++;
6043                                                 //printk("AdslInitStatsData.LINIT_Errors++\n");
6044                                                 AdslInitStatsData.LINIT_Errors++;
6045                                         }else
6046                                         {
6047                                                 //printk("RxMessage=%X\n",RxMessage[4]);
6048                                                 if ( RxMessage[4]!=0x1)
6049                                                 {
6050                                                         //printk("AdslInitStatsData.FullInitializationCount++\n");
6051                                                         AdslInitStatsData.FullInitializationCount++;    
6052                                                         if ( RxMessage[4] != 0x7)
6053                                                         {
6054                                                                 //printk("AdslInitStatsData.LINIT_Errors++\n");
6055                                                                 AdslInitStatsData.LINIT_Errors++;
6056                                                                 //printk("AdslInitStatsData.FailedFullInitializationCount++\n");
6057                                                                 AdslInitStatsData.FailedFullInitializationCount++;
6058                                                                 
6059                                                         }                       
6060                                                 }
6061                                         }
6062
6063                                         reboot_flag=0;
6064                                         wake_up_interruptible(&wait_queue_codeswap); //wake up codeswap daemon                          
6065
6066                                         interruptible_sleep_on_timeout(&wait_queue_reboot, 1*HZ);  // sleep until arc ready
6067 #ifdef  ARC_READY_ACK
6068                                         if(reboot_flag!=0)
6069                                                 break;
6070                                         else
6071                                         {
6072                                                 up(&mei_sema);
6073                                                 printk("\n reboot retry");
6074                                         }
6075 #else
6076                                         break;
6077 #endif
6078                                 }
6079                         }
6080                         else{ //AMAZON_MEI_SHOWTIME 
6081                                 if(down_interruptible(&mei_sema))
6082                                         return -ERESTARTSYS;
6083                                 
6084                                 // clreoc stuff
6085                                 makeCMV(H2D_CMV_READ, INFO, 83, 0, 1, data); //maximum allowed tx message length, in bytes
6086                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
6087 #ifdef AMAZON_MEI_DEBUG_ON
6088                                         printk("\n\nCMV fail, Group 3 Address 83 Index 0");
6089 #endif
6090                                 }
6091                                 else{
6092                                         clreoc_max_tx_len = (int)RxMessage[4];
6093                                         clreoc_command_pkt = kmalloc((clreoc_max_tx_len*CLREOC_BUFF_SIZE), GFP_KERNEL);
6094                                         if(clreoc_command_pkt == NULL){
6095 #ifdef AMAZON_MEI_DEBUG_ON
6096                                                 printk("kmalloc error for clreoc_command_pkt\n\n");
6097 #endif
6098                                                 up(&mei_sema);
6099                                                 return -1;
6100                                         }
6101                                         for(i=0;i<CLREOC_BUFF_SIZE;i++){
6102                                                 clreoc_pkt[i].command = (u8 *)(((u8 *)clreoc_command_pkt) + (clreoc_max_tx_len*i));
6103                                                 clreoc_pkt[i].len=0;
6104                                         }       
6105                                 }
6106                                 
6107                                 // decide what channel, then register   
6108                                 makeCMV(H2D_CMV_READ, STAT, 12, 0, 1, data); 
6109                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
6110 #ifdef AMAZON_MEI_DEBUG_ON
6111                                         printk("\n\nCMV fail, Group 2 Address 12 Index 0");
6112 #endif
6113                                 }
6114                                 else{
6115                                         if((RxMessage[4]&0x1)==1){      
6116                                                 if(register_netdev(&interleave_mei_net)!=0){
6117 #ifdef AMAZON_MEI_DEBUG_ON
6118                                                         printk("\n\n Register interleave Device Failed.");
6119 #endif
6120                                                 }
6121                                                 else{
6122                                                         chantype.interleave = 1;
6123                                                         chantype.fast= 0;
6124 #ifdef AMAZON_MEI_DEBUG_ON
6125                                                         printk("\n channel is interleave");
6126 #endif
6127                                                 }       
6128                                         }
6129                                         else if((RxMessage[4]&0x2)==2){ 
6130                                                 if(register_netdev(&fast_mei_net)!=0){
6131 #ifdef AMAZON_MEI_DEBUG_ON
6132                                                         printk("\n\n Register fast Device Failed.");
6133 #endif
6134                                                 }
6135                                                 else{
6136                                                         chantype.fast = 1;
6137                                                         chantype.interleave = 0;
6138 #ifdef AMAZON_MEI_DEBUG_ON
6139                                                         printk("\n channel is fast");
6140 #endif
6141                                                 }
6142                                         }
6143                                         else{
6144 #ifdef AMAZON_MEI_DEBUG_ON
6145                                                 printk("\nunknown channel type, 0x%8x", RxMessage[4]);
6146 #endif
6147                                         }       
6148 // 603221:tc.chen start 
6149                                         if ( (RxMessage[4]&0x100) == 0x100)
6150                                         {
6151                                                 chantype.bearchannel0 = 1;
6152                                         }else   if ( (RxMessage[4]&0x100) == 0x200)
6153                                         {
6154                                                 chantype.bearchannel1 = 1;
6155                                         }
6156 // 603221:tc.chen end
6157                                 }
6158 // 603221:tc.chen start                 
6159                                 // read adsl mode
6160                                 makeCMV(H2D_CMV_READ, STAT, 1, 0, 1, data); 
6161                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
6162 #ifdef AMAZON_MEI_DEBUG_ON
6163                                         printk("\n\nCMV fail, Group STAT Address 1 Index 0");
6164 #endif
6165                                 }
6166                                 adsl_mode = RxMessage[4];
6167 // 603221:tc.chen end
6168                                 makeCMV(H2D_CMV_READ, STAT, 17, 0, 1, data); 
6169                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
6170 #ifdef AMAZON_MEI_DEBUG_ON
6171                                         printk("\n\nCMV fail, Group STAT Address 1 Index 0");
6172 #endif
6173                                 }
6174                                 adsl_mode_extend = RxMessage[4];
6175                                 
6176                                 // update previous channel tx rate
6177                                 ATUC_CHAN_CURR_TX_RATE_FLAG_MAKECMV;
6178                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
6179 #ifdef AMAZON_MEI_DEBUG_ON
6180                                         printk("\n\nCMV fail, Group 6 Address 1 Index 0");
6181 #endif
6182                                         PrevTxRate.adslAtucChanPrevTxRate = 0;  
6183                                 }
6184                                 else{
6185                                         PrevTxRate.adslAtucChanPrevTxRate = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16);
6186                                 }
6187                                 ATUR_CHAN_CURR_TX_RATE_FLAG_MAKECMV;
6188                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
6189 #ifdef AMAZON_MEI_DEBUG_ON
6190                                         printk("\n\nCMV fail, Group 6 Address 0 Index 0");
6191 #endif
6192                                         PrevTxRate.adslAturChanPrevTxRate = 0;  
6193                                 }
6194                                 else{
6195                                         PrevTxRate.adslAturChanPrevTxRate = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16);
6196                                 }
6197                                 
6198 //                              up(&mei_sema);
6199                                 
6200 //                              showtime=1;
6201                                 //SET_BIT((*((volatile u32 *)0xB0100B40)), 0x40); //Warning LED GPIO OFF
6202 //dying gasp -start     
6203 #ifdef IFX_DYING_GASP                   
6204                                 lop_debugwr.buffer[0]=0xffffffff;               //dying gasp
6205                                 lop_debugwr.iCount=1;                           //dying gasp
6206                                 makeCMV(H2D_CMV_READ, INFO, 66, 4, 1, NULL);
6207                                 //mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, &RxMessage);        
6208                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
6209 #ifdef AMAZON_MEI_DEBUG_ON
6210                                         printk("\n\nCMV fail, Group 3 Address 66 Index 4");
6211                                 }
6212 #endif
6213                                 lop_debugwr.iAddress=(u32)RxMessage[4];
6214                                 makeCMV(H2D_CMV_READ, INFO, 66, 5, 1, NULL);
6215                                 //mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, &RxMessage);                        
6216                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
6217 #ifdef AMAZON_MEI_DEBUG_ON
6218                                         printk("\n\nCMV fail, Group 3 Address 66 Index 5");
6219                                 }
6220 #endif
6221                                 lop_debugwr.iAddress+=((u32)RxMessage[4])<<16;
6222                                 
6223 //dying gasp -end                               
6224 #endif  // IFX_DYING_GASP                       
6225
6226 //joelin 04/16/2005-start
6227                                 makeCMV(H2D_CMV_WRITE, PLAM, 10, 0, 1, &unavailable_seconds);
6228                                 //mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, &RxMessage);                        
6229                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
6230 #ifdef AMAZON_MEI_DEBUG_ON
6231                                         printk("\n\nCMV fail, Group 7 Address 10 Index 0");
6232                                 
6233 #endif
6234                                 }
6235                                 
6236
6237 //joelin 04/16/2005-end         
6238                                 showtime=1;
6239                                 up(&mei_sema);
6240 #ifdef  AMAZON_CHECK_LINK
6241                                 if (adsl_link_notify){
6242                                         (*adsl_link_notify)(1);
6243                                 }
6244 #endif
6245                                 
6246                                 
6247                         }
6248                         break;
6249 /*
6250                 case AMAZON_MEI_REPLY:
6251                         copy_from_user((char *)buff, (char *)lon, MSG_LENGTH * 2);
6252                         if(meiCMV(buff, YES_REPLY) != MEI_SUCCESS){
6253                                 printk("\n\n meiCMV no reply back");
6254                                 meierr=MEI_FAILURE;
6255                         }
6256                         else
6257                                 copy_to_user((char *)lon, (char *)RxMessage, MSG_LENGTH * 2);
6258                         break;
6259                 case AMAZON_MEI_NOREPLY:
6260                         copy_from_user((char *)buff, (char *)lon, MSG_LENGTH * 2);
6261                         if(meiCMV(buff, NO_REPLY) != MEI_SUCCESS){
6262                                 printk("\n\n meiCMV Host to DSP failed");
6263                                 meierr=MEI_FAILURE;
6264                         }  
6265                         break;
6266 */
6267                 
6268                 case AMAZON_MEI_HALT:
6269                         meiHaltArc();
6270                         break;
6271                 case AMAZON_MEI_CMV_WINHOST:
6272                         if(down_interruptible(&mei_sema))
6273                                 return -ERESTARTSYS;
6274
6275                         if (!from_kernel )      
6276                                 copy_from_user((char *)TxMessage, (char *)lon, MSG_LENGTH*2);//joelin
6277                         else
6278                                 memcpy(TxMessage,(char *)lon,MSG_LENGTH*2);
6279                                 
6280 #if 0                   
6281 //                      if((TxMessage[0]&0xff0)==0x0a0){
6282                                 for(i=0;i<16;i++){
6283                                         printk("\nTxMessage[%i]=%8x", i, TxMessage[i]);
6284                                 }
6285 //                      }                       
6286 #endif                  
6287                         
6288                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
6289 #ifdef AMAZON_MEI_DEBUG_ON
6290 //                              printk("\n\n WINHOST CMV fail ");
6291                                 printk("\n\nWINHOST CMV fail :TxMessage:%X %X %X %X, RxMessage:%X %X %X %X %X\n",TxMessage[0],TxMessage[1],TxMessage[2],TxMessage[3],RxMessage[0],RxMessage[1],RxMessage[2],RxMessage[3],RxMessage[4]);
6292 #endif
6293                                 meierr = MEI_FAILURE;   
6294                         }
6295                         else 
6296                         {
6297                                 if (!from_kernel )      //joelin
6298                                 copy_to_user((char *)lon, (char *)RxMessage, MSG_LENGTH*2);
6299                                 else
6300                                         memcpy((char *)lon,(char *)RxMessage,MSG_LENGTH*2);
6301                         }
6302                                 
6303                         up(&mei_sema);  
6304                         break;
6305 #ifdef AMAZON_MEI_CMV_EXTRA
6306                 case AMAZON_MEI_CMV_READ:
6307                         copy_from_user((char *)(&regrdwr), (char *)lon, sizeof(meireg));
6308                         meiLongwordRead(regrdwr.iAddress, &(regrdwr.iData));
6309                         {
6310 //                              printk("\n\n iAddress = %8x",regrdwr.iAddress);
6311                         }
6312                         copy_to_user((char *)lon, (char *)(&regrdwr), sizeof(meireg));
6313                         {
6314 //                              printk("\n\n iData readback = %8x", regrdwr.iData);
6315                         }
6316                         break;
6317 #endif
6318
6319 #ifdef AMAZON_MEI_CMV_EXTRA
6320                 case AMAZON_MEI_CMV_WRITE:
6321                         copy_from_user((char *)(&regrdwr), (char *)lon, sizeof(meireg));
6322                         {
6323 //                              printk("\n\n iAddress = %8x",regrdwr.iAddress);
6324 //                              printk("\n\n iData = %8x",regrdwr.iData);
6325                         }
6326                         meiLongwordWrite(regrdwr.iAddress, regrdwr.iData);
6327                         break;
6328 #endif
6329
6330 #ifdef AMAZON_MEI_CMV_EXTRA
6331                 case AMAZON_MEI_REMOTE:
6332                         copy_from_user((char *)(&i), (char *)lon, sizeof(int));
6333                         if(i==0){
6334                                 meiMailboxInterruptsEnable();
6335                                         
6336                                 up(&mei_sema);
6337                         }
6338                         else if(i==1){
6339                                 meiMailboxInterruptsDisable();
6340                                 if(down_interruptible(&mei_sema))
6341                                         return -ERESTARTSYS;
6342                         }
6343                         else{
6344 #ifdef AMAZON_MEI_DEBUG_ON
6345                                 printk("\n\n AMAZON_MEI_REMOTE argument error");
6346 #endif
6347                                 meierr=MEI_FAILURE;
6348                         }               
6349                         break;
6350 #endif
6351
6352 #ifdef AMAZON_MEI_CMV_EXTRA
6353                 case AMAZON_MEI_READDEBUG:
6354                 case AMAZON_MEI_WRITEDEBUG:
6355                         if(down_interruptible(&mei_sema))
6356                                 return -ERESTARTSYS;
6357 #ifdef IFX_DYING_GASP                   
6358         if (!from_kernel) copy_from_user((char *)(&debugrdwr), (char *)lon, sizeof(debugrdwr));//dying gasp
6359                                 else memcpy((char *)(&debugrdwr), (char *)lon,  sizeof(debugrdwr));
6360 #else //IFX_DYING_GASP  
6361                         copy_from_user((char *)(&debugrdwr), (char *)lon, sizeof(debugrdwr));
6362
6363 #endif //IFX_DYING_GASP                                                 
6364 #if 0
6365                         printk("\nIN iAddress: %8x, iCount:%8x\n", debugrdwr.iAddress, debugrdwr.iCount);
6366 #endif
6367                         
6368                         if(command==AMAZON_MEI_READDEBUG)
6369                                 meiDebugRead(debugrdwr.iAddress, debugrdwr.buffer, debugrdwr.iCount);
6370                         else
6371                                 meiDebugWrite(debugrdwr.iAddress, debugrdwr.buffer, debugrdwr.iCount);  
6372                                 
6373 #ifdef IFX_DYING_GASP                           
6374                         if (!from_kernel) copy_to_user((char *)lon, (char*)(&debugrdwr), sizeof(debugrdwr));//dying gasp
6375 #else //IFX_DYING_GASP  
6376                         copy_to_user((char *)lon, (char*)(&debugrdwr), sizeof(debugrdwr));
6377 #endif //IFX_DYING_GASP 
6378                         up(&mei_sema);
6379                         
6380 #if 0
6381                         printk("\nOUT iAddress: %8x, iCount:%8x\n", debugrdwr.iAddress, debugrdwr.iCount);
6382                         for(i=0;i<debugrdwr.iCount;i++)
6383                                 printk("\n %8x",debugrdwr.buffer[i]);
6384 #endif
6385                         break;
6386 #endif
6387
6388                 case AMAZON_MEI_LOP:    
6389                 //GPIO31 :dying gasp event indication
6390                 //      (1) logic high: dying gasp event is false (default)
6391                 //      (2) logic low: dying gasp event is true
6392 #ifdef IFX_DYING_GASP
6393                         break;
6394 #else                                   
6395                         CLEAR_BIT((*((volatile u32 *)0xB0100B48)), 0x8000);
6396                         CLEAR_BIT((*((volatile u32 *)0xB0100B4C)), 0x8000);
6397                         CLEAR_BIT((*((volatile u32 *)0xB0100B50)), 0x8000);
6398                         SET_BIT((*((volatile u32 *)0xB0100B54)), 0x8000);
6399                         asm("SYNC");
6400                         if(((*((volatile u32 *)0xB0100B44))&0x8000)==0x0)
6401                                 meierr=MEI_FAILURE; //return - to indicate loss of power
6402                         break;
6403 #endif //#ifdef IFX_DYING_GASP                  
6404                         
6405                                         //for PCM
6406                 case AMAZON_MEI_PCM_SETUP:
6407                         //gpio
6408                         
6409                         *AMAZON_GPIO_P0_DIR |=1<<15;
6410                         *AMAZON_GPIO_P0_ALTSEL0 |=1<<15;
6411                         *AMAZON_GPIO_P0_ALTSEL1 &=~(1<<15);
6412                         *AMAZON_GPIO_P0_OD |=1<<15;
6413                                                                                 
6414                         /*GPIO 16 TDM_DI*/
6415                         *AMAZON_GPIO_P1_DIR &=~1;
6416                         *AMAZON_GPIO_P1_ALTSEL0 |=1;
6417                         *AMAZON_GPIO_P1_ALTSEL1 &=~1;
6418                                                                                 
6419                         /*GPIO 17 TDM_DCL */
6420                         *AMAZON_GPIO_P1_DIR|=0x02;
6421                         *AMAZON_GPIO_P1_ALTSEL0|=0x02;
6422                         *AMAZON_GPIO_P1_ALTSEL1 &=(u32)~0x02;
6423                         *AMAZON_GPIO_P1_OD|=0x02;
6424                                                                                 
6425                         /*GPIO 18 TDM FSC*/
6426                         *AMAZON_GPIO_P1_DIR|=0x04;
6427                         *AMAZON_GPIO_P1_ALTSEL0|=0x04;
6428                         *AMAZON_GPIO_P1_ALTSEL1 &=(u32)~0x04;
6429                         *AMAZON_GPIO_P1_OD|=0x04;
6430                         
6431                         for(i=0;i<2;i++){
6432                                 for(j=0;j<256;j++)
6433                                         sampledata[i*256+j]=j;
6434                         }
6435                         
6436                         pcm_start_addr = lon;
6437                         
6438                         printk("\n\n pcm_start_addr is %8x", lon);
6439                         
6440                         for(i=0;i<PCM_CHANNEL_NUM;i++){
6441 #ifdef  PCM_ACCESS_DEBUG
6442                                 meiDebugRead_16((pcm_start_addr+i*16), (u32*)(pcm_data+i), 4);
6443 #else
6444                                 meiDMARead_16((pcm_start_addr+i*16), (u32*)(pcm_data+i), 4);
6445 #endif
6446                                 if((pcm_data[i].S!=8)||(pcm_data[i].len<1)||(pcm_data[i].rdindex!=0)||(pcm_data[i].wrindex!=0)||(pcm_data[i].flow!=0))
6447                                         printk("\n\n pcm_data fill in wrongly\n\n");
6448                                 printk("\npcm_data %d",i);
6449                                 printk("\n S = %d", pcm_data[i].S);
6450                                 printk("\n LSW = %4x", pcm_data[i].LSW);
6451                                 printk("\n MSW = %4x", pcm_data[i].MSW);
6452                                 printk("\n len = %d", pcm_data[i].len);
6453                                 printk("\n rdindex = %d", pcm_data[i].rdindex);
6454                                 printk("\n wrindex = %d", pcm_data[i].wrindex); 
6455                                 printk("\n flow = %d", pcm_data[i].flow);                               
6456                                 pcm_data[i].finish=0;   
6457                                 if(i%2==0){//tx channel
6458                                         for(j=0;j<PCM_BUFF_SIZE/256;j++){
6459                                                 for(k=0;k<256;k++){
6460                                                         pcm_data[i].buff[j*256+k]=k;
6461                                                 /*      if(k%2==0)
6462                                                                 pcm_data[i].buff[j*256+k]=0xaa;
6463                                                         else
6464                                                                 pcm_data[i].buff[j*256+k]=0x55;*/
6465                                                 }
6466                                         }
6467 #ifdef  PCM_ACCESS_DEBUG
6468                                         meiDebugWrite_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16)), (u32*)(pcm_data[i].buff),((pcm_data[i].len/4)/2));//fill half first
6469 //                                      meiDebugWrite_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16)), (u32*)(pcm_data[i].buff),2);//fill half first
6470 #else
6471                                         meiDMAWrite_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16)), (u32*)(pcm_data[i].buff),((pcm_data[i].len/4)/2));//fill half first
6472 //                                      meiDMAWrite_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16)), (u32*)(pcm_data[i].buff),2);//fill half first
6473 #endif
6474                                         pcm_data[i].point=(pcm_data[i].len)/2;
6475 //                                      pcm_data[i].point=8;
6476 #ifdef  PCM_ACCESS_DEBUG
6477                                         meiDebugRead_16(pcm_start_addr+i*16+12, &temp, 1);
6478 #else
6479                                         meiDMARead_16(pcm_start_addr+i*16+12, &temp, 1);
6480 #endif
6481                                         temp = (temp &0xffff) + (((u32)(pcm_data[i].point))<<16);
6482 #ifdef  PCM_ACCESS_DEBUG
6483                                         meiDebugWrite_16(pcm_start_addr+i*16+12,&temp, 1);//update wrindex
6484 #else
6485                                         meiDMAWrite_16(pcm_start_addr+i*16+12,&temp, 1);//update wrindex
6486 #endif
6487                                 }
6488                                 else{// rx channel
6489                                         pcm_data[i].point=0;
6490                                 }
6491                         }
6492                         break;
6493                 case AMAZON_MEI_PCM_START_TIMER:
6494                                 /* GPTU timer 6 */
6495                         /* enable the timer in the PMU */
6496                         *(AMAZON_PMU_PWDCR) = (*(AMAZON_PMU_PWDCR))| AMAZON_PMU_PWDCR_GPT|AMAZON_PMU_PWDCR_FPI;
6497                         /* setup the GPTU for timer tick  f_fpi == f_gptu*/
6498                         *(AMAZON_GPTU_CLC) = 0x100;
6499                         //reload value = fpi/(HZ * P), timer mode, Prescaler = 4 ( T6I = 000, T6BPS2 = 0)
6500                         *(AMAZON_GPTU_CAPREL) = (int)(117500000/(lon*4));       
6501                         *(AMAZON_GPTU_T6CON) = 0x80C0;
6502                         
6503                         if (request_irq(AMAZON_TIMER6_INT, amazon_timer6_interrupt_MEI,0, "hrt", NULL)!=0){
6504 #ifdef AMAZON_MEI_DEBUG_ON
6505                                 printk("\n\n unable to register irq for hrt!!!");
6506 #endif
6507                                 return -1;
6508                         }
6509                         enable_irq(AMAZON_TIMER6_INT);
6510                         break;
6511                 case AMAZON_MEI_PCM_STOP_TIMER:
6512                         disable_irq(AMAZON_TIMER6_INT);
6513                         free_irq(AMAZON_TIMER6_INT, NULL);
6514                         break;
6515                 case AMAZON_MEI_PCM_CHECK:
6516                         for(i=0;i<PCM_CHANNEL_NUM;i++){
6517                                 if(pcm_data[i].finish!=1)
6518                                         return 0;       
6519                         }
6520                         for(i=0;i<PCM_CHANNEL_NUM/2;i++){
6521                                 j=0;
6522                                 while(1){
6523                                         if((pcm_data[i*2+1].buff[j]==0x0) && (pcm_data[i*2+1].buff[j+1]==0x1)&& (pcm_data[i*2+1].buff[j+2]==0x2))
6524                                                 break;
6525                                         else
6526                                                 j++;
6527                                 }
6528                                 printk("\n j=%d", j);
6529                                 temp=0;
6530                                 for(k=0;k<((PCM_BUFF_SIZE-j)/4);k++){
6531                                         if(memcmp(pcm_data[i*2].buff+k*4, pcm_data[i*2+1].buff+j+k*4, 4)!=0){
6532                                                 temp++;
6533                                                 printk("\n\n%2x %2x %2x %2x %2x %2x %2x %2x\n\n", *((u8*)(pcm_data[i*2].buff+k*4)), *((u8*)(pcm_data[i*2].buff+k*4+1)),*((u8*)(pcm_data[i*2].buff+k*4+2)),*((u8*)(pcm_data[i*2].buff+k*4+3)),*((u8*)(pcm_data[i*2+1].buff+j+k*4)),*((u8*)(pcm_data[i*2+1].buff+j+k*4+1)),*((u8*)(pcm_data[i*2+1].buff+j+k*4+2)),*((u8*)(pcm_data[i*2+1].buff+j+k*4+3)));
6534                                                 break;
6535                                         }
6536                                 }
6537                                 if(temp!=0)
6538                                         printk("\n\n Channel pair %d not match: err32 %d\n\n", i, temp);
6539                                 else
6540                                         printk("\n\n Channel pair %d match\n\n", i);
6541                         }
6542                         for(i=0;i<PCM_CHANNEL_NUM;i++){
6543                                 if(i%2==1){//rx channel
6544 #ifdef  PCM_ACCESS_DEBUG
6545                                         meiDebugRead_16(pcm_start_addr+i*16+12, &temp, 1);
6546 #else
6547                                         meiDMARead_16(pcm_start_addr+i*16+12, &temp, 1);
6548 #endif
6549                                         printk("\n\nRx channel %d: Overflow Bytes %d", i, (temp&0xffff));       
6550                                 }
6551                                 else{//tx channel
6552 #ifdef  PCM_ACCESS_DEBUG
6553                                         meiDebugRead_16(pcm_start_addr+i*16, &temp, 1);
6554 #else
6555                                         meiDMARead_16(pcm_start_addr+i*16, &temp, 1);
6556 #endif
6557                                         printk("\n\nElectra Err: %d",(temp&0xffff));            
6558                                 }
6559                         }
6560                         //check electra overflow
6561                         
6562                         meierr=1;
6563                         break;
6564                 case AMAZON_MEI_PCM_GETDATA:
6565                         copy_to_user(lon, pcm_data[1].buff, PCM_BUFF_SIZE);
6566                         break;
6567                 case AMAZON_MEI_PCM_GPIO:
6568                         //gpio
6569                         
6570                         *AMAZON_GPIO_P0_DIR |=1<<15;
6571                         *AMAZON_GPIO_P0_ALTSEL0 |=1<<15;
6572                         *AMAZON_GPIO_P0_ALTSEL1 &=~(1<<15);
6573                         *AMAZON_GPIO_P0_OD |=1<<15;
6574                                                                                 
6575                         /*GPIO 16 TDM_DI*/
6576                         *AMAZON_GPIO_P1_DIR &=~1;
6577                         *AMAZON_GPIO_P1_ALTSEL0 |=1;
6578                         *AMAZON_GPIO_P1_ALTSEL1 &=~1;
6579                                                                                 
6580                         /*GPIO 17 TDM_DCL */
6581                         *AMAZON_GPIO_P1_DIR|=0x02;
6582                         *AMAZON_GPIO_P1_ALTSEL0|=0x02;
6583                         *AMAZON_GPIO_P1_ALTSEL1 &=(u32)~0x02;
6584                         *AMAZON_GPIO_P1_OD|=0x02;
6585                                                                                 
6586                         /*GPIO 18 TDM FSC*/
6587                         *AMAZON_GPIO_P1_DIR|=0x04;
6588                         *AMAZON_GPIO_P1_ALTSEL0|=0x04;
6589                         *AMAZON_GPIO_P1_ALTSEL1 &=(u32)~0x04;
6590                         *AMAZON_GPIO_P1_OD|=0x04;       
6591                         break;
6592                         
6593                         
6594                         
6595                                 //for clearEoC
6596 #ifdef AMAZON_CLEAR_EOC
6597                 case AMAZON_MEI_GET_EOC_LEN:
6598                         while(1){
6599                                 current_clreoc = list_entry(clreoc_list.next, amazon_clreoc_pkt, list);
6600                                 if((current_clreoc->len)>0){
6601                                         copy_to_user((char *)lon, (char*)(&(current_clreoc->len)), 4);
6602                                         break;  
6603                                 }
6604                                 else//wait for eoc data from higher layer
6605                                         interruptible_sleep_on(&wait_queue_clreoc);     
6606                         }
6607                         break;
6608                 case AMAZON_MEI_GET_EOC_DATA:
6609                         current_clreoc = list_entry(clreoc_list.next, amazon_clreoc_pkt, list);
6610                         if((current_clreoc->len)>0){
6611                                 copy_to_user((char*)lon, (char*)(current_clreoc->command), current_clreoc->len);
6612                                 meierr=1;
6613                                 list_del(clreoc_list.next);     //remove and add to end of list
6614                                 current_clreoc->len = 0;
6615                                 list_add_tail(&(current_clreoc->list), &clreoc_list);
6616                         }
6617                         else
6618                                 meierr=-1;
6619                         break;
6620                 case AMAZON_MEI_EOC_SEND:
6621                         copy_from_user((char *)(&debugrdwr), (char *)lon, sizeof(debugrdwr));
6622                         eoc_skb = dev_alloc_skb(debugrdwr.iCount*4);
6623                         if(eoc_skb==NULL){
6624                                 printk("\n\nskb alloc fail");
6625                                 break;
6626                         }
6627                         
6628                         eoc_skb->len=debugrdwr.iCount*4;
6629                         memcpy(skb_put(eoc_skb, debugrdwr.iCount*4), (char *)debugrdwr.buffer, debugrdwr.iCount*4);
6630                         
6631                         ifx_push_eoc(eoc_skb);  //pass data to higher layer
6632                         break;
6633 #endif //#ifdef AMAZON_CLEAR_EOC
6634                 case AMAZON_MIB_LO_ATUC:
6635                         do_gettimeofday(&time_now);
6636                         if(lon&0x1){
6637                                 if((time_now.tv_sec-(mib_pflagtime.ATUC_PERF_LOSS_PTIME).tv_sec)>2){
6638                                         current_intvl->AtucPerfLos++;
6639                                         ATUC_PERF_LOSS++;
6640                                         CurrStatus.adslAtucCurrStatus = 2;
6641                                 }
6642                                 (mib_pflagtime.ATUC_PERF_LOSS_PTIME).tv_sec = time_now.tv_sec;
6643                         }
6644                         if(lon&0x2){
6645                                 if((time_now.tv_sec-(mib_pflagtime.ATUC_PERF_LOFS_PTIME).tv_sec)>2){
6646                                         current_intvl->AtucPerfLof++;
6647                                         ATUC_PERF_LOFS++;
6648                                         CurrStatus.adslAtucCurrStatus = 1;
6649                                 }
6650                                 (mib_pflagtime.ATUC_PERF_LOFS_PTIME).tv_sec = time_now.tv_sec;
6651                         }
6652                         if(!(lon&0x3))
6653                                 CurrStatus.adslAtucCurrStatus = 0;
6654                         break;
6655                 case AMAZON_MIB_LO_ATUR:
6656                         do_gettimeofday(&time_now);
6657                         if(lon&0x1){
6658                                 if((time_now.tv_sec-(mib_pflagtime.ATUR_PERF_LOSS_PTIME).tv_sec)>2){
6659                                         current_intvl->AturPerfLos++;
6660                                         ATUR_PERF_LOSS++;
6661                                         CurrStatus.adslAturCurrStatus = 2;
6662                         }
6663                                 (mib_pflagtime.ATUR_PERF_LOSS_PTIME).tv_sec = time_now.tv_sec;
6664                         }
6665                         if(lon&0x2){
6666                                 if((time_now.tv_sec-(mib_pflagtime.ATUR_PERF_LOFS_PTIME).tv_sec)>2){
6667                                         current_intvl->AturPerfLof++;
6668                                         ATUR_PERF_LOFS++;
6669                                         CurrStatus.adslAturCurrStatus = 1;
6670                                 }
6671                                 (mib_pflagtime.ATUR_PERF_LOFS_PTIME).tv_sec = time_now.tv_sec;
6672                         }
6673                         if(lon&0x4){
6674                                 if((time_now.tv_sec-(mib_pflagtime.ATUR_PERF_LPR_PTIME).tv_sec)>2){
6675                                         current_intvl->AturPerfLpr++;
6676                                         ATUR_PERF_LPR++;
6677                                         CurrStatus.adslAturCurrStatus = 3;
6678                                 }
6679                                 (mib_pflagtime.ATUR_PERF_LPR_PTIME).tv_sec = time_now.tv_sec;
6680                         }
6681                         if(!(lon&0x7))
6682                                 CurrStatus.adslAturCurrStatus = 0;
6683                         break;
6684                 case AMAZON_MEI_DOWNLOAD:
6685                         // DMA the boot code page(s)
6686 #ifdef AMAZON_MEI_DEBUG_ON
6687                         printk("\n\n start download pages");
6688 #endif
6689                         for( boot_loop = 0; boot_loop < img_hdr->count; boot_loop++){
6690                                 if( img_hdr->page[boot_loop].p_size & BOOT_FLAG){
6691                                         page_size = meiGetPage( boot_loop, GET_PROG, MAXSWAPSIZE, mei_arc_swap_buff, &dest_addr);
6692                                         if( page_size > 0){
6693                                                 meiDMAWrite(dest_addr, mei_arc_swap_buff, page_size);
6694                                         }
6695                                 }
6696                                 if( img_hdr->page[boot_loop].d_size & BOOT_FLAG){
6697                                         page_size = meiGetPage( boot_loop, GET_DATA, MAXSWAPSIZE, mei_arc_swap_buff, &dest_addr);
6698                                         if( page_size > 0){
6699                                                 meiDMAWrite( dest_addr, mei_arc_swap_buff, page_size);
6700                                         }
6701                                 }
6702                         }
6703 #ifdef AMAZON_MEI_DEBUG_ON
6704                         printk("\n\n pages downloaded");
6705 #endif
6706                         break;
6707                 //509221:tc.chen start
6708                 case AMAZON_MEI_DEBUG_MODE:
6709                         mei_debug_mode = lon;
6710                         break;
6711                 //509221:tc.chen end
6712         }
6713         return meierr;
6714 }
6715
6716
6717 //////////////////////          Interrupt handler               /////////////////////////////////////////////////////
6718 static void mei_interrupt_arcmsgav(int,void *,struct pt_regs *);
6719 static void mei_interrupt_arcmsgav(int int1, void * void0, struct pt_regs * regs)
6720 {
6721         u32 scratch;
6722         u32 fetchpage;
6723         u32 size;
6724         u32 dest_addr;
6725         u32 temp;
6726         int i;
6727         
6728         meiDebugRead(ARC_MEI_MAILBOXR, &scratch, 1);
6729         if(scratch & OMB_CODESWAP_MESSAGE_MSG_TYPE_MASK)
6730         {
6731                 if(showtime==1){
6732 #ifdef AMAZON_MEI_DEBUG_ON
6733                         printk("\n\n Code Swap Request After ShowTime !!!");
6734 #endif
6735                 }
6736                 else{
6737 #ifdef AMAZON_MEI_DEBUG_ON
6738 //                      printk("\n\n Code Swap Request");
6739 #endif
6740                         fetchpage = scratch & ~OMB_CODESWAP_MESSAGE_MSG_TYPE_MASK;
6741                         size = meiGetPage( fetchpage, GET_PROG, MAXSWAPSIZE, mei_arc_swap_buff, &dest_addr);
6742                         if( size > 0)
6743                         {
6744 #ifdef AMAZON_MEI_DEBUG_ON
6745 //                              printk("  : prom page num %d",fetchpage);
6746 #endif
6747                                 meiDMAWrite( dest_addr, mei_arc_swap_buff, size);
6748                         }
6749
6750                         size = meiGetPage( fetchpage, GET_DATA, MAXSWAPSIZE, mei_arc_swap_buff, &dest_addr);
6751                         if( size > 0)
6752                         {
6753 #ifdef AMAZON_MEI_DEBUG_ON
6754 //                              printk("  : data page num %d",fetchpage);
6755 #endif
6756                                 meiDMAWrite( dest_addr, mei_arc_swap_buff, size);
6757                         }
6758                 }
6759                         //      Notify arc that mailbox read complete
6760                 meiLongwordWrite(ARC_TO_MEI_INT, ARC_TO_MEI_MSGAV);
6761
6762                 //      Tell ARC Codeswap is done
6763                 meiLongwordWrite(MEI_TO_ARC_INT, MEI_TO_ARC_CS_DONE);
6764                 asm("SYNC");
6765                 i=0;
6766                 while(i<WHILE_DELAY){
6767                         meiLongwordRead(MEI_TO_ARC_INT, &temp);
6768                         if((temp & MEI_TO_ARC_CS_DONE) ==0){
6769 #ifdef AMAZON_MEI_DEBUG_ON
6770 //                              printk("\n\n Code Swap Done");
6771 #endif
6772                                 break;
6773                         }
6774                         i++;
6775                         if(i==WHILE_DELAY){
6776 #ifdef AMAZON_MEI_DEBUG_ON
6777                                 printk("\n\n MEI_TO_ARC_CS_DONE not cleared by ARC");
6778                                 //509221:tc.chen start
6779                                 if (!mei_debug_mode)
6780                                 {
6781                                         //printk("Reset Arc!\n");
6782                                         //printk("AdslInitStatsData.FullInitializationCount++\n");
6783                                         AdslInitStatsData.FullInitializationCount++;    
6784                                         if (!showtime)
6785                                         {
6786                                                 //printk("AdslInitStatsData.FailedFullInitializationCount++\n");
6787                                                 AdslInitStatsData.FailedFullInitializationCount++;
6788                                                 //printk("AdslInitStatsData.LINIT_Errors++\n");
6789                                                 AdslInitStatsData.LINIT_Errors++;
6790                                         }
6791
6792                                         wake_up_interruptible(&wait_queue_codeswap);    // wait up ioctl reboot
6793                                 }
6794                                 //509221:tc.chen end
6795 #endif
6796                         }
6797                 }
6798         }
6799         else{    // normal message
6800 //                      printk("\n\n interrupt");       
6801                         meiMailboxRead(RxMessage, MSG_LENGTH);
6802                         if(cmv_waiting==1){            
6803                                 arcmsgav=1;
6804                                 cmv_waiting=0;
6805                                 wake_up_interruptible(&wait_queue_arcmsgav);                  
6806                         }
6807                         else{
6808                                 indicator_count++;
6809                                 memcpy((char *)Recent_indicator, (char *)RxMessage,  MSG_LENGTH *2);
6810 #ifdef  ARC_READY_ACK
6811                                 if(((RxMessage[0]&0xff0)>>4)==D2H_AUTONOMOUS_MODEM_READY_MSG){  //check ARC ready message
6812                                         
6813 #ifdef LOCK_RETRY
6814                                         if (reboot_lock)
6815                                         {
6816                                             reboot_lock = 0;
6817                                             up(&mei_sema);      // allow cmv access
6818                                         }
6819 #else
6820                                         up(&mei_sema);  // allow cmv access
6821 #endif
6822                                         reboot_flag=1;
6823 //#ifdef ADSL_LED_SUPPORT                                       
6824 #if 0
6825                                         led_support_check=1;//adsl led for 1.1.2.7.1.1
6826                                         adsl_led_flash();//adsl led for 1.1.2.7.1.1
6827 #endif
6828                                         wake_up_interruptible(&wait_queue_reboot);      // wait up ioctl reboot
6829                                 }
6830 #endif
6831                         }                  
6832         }
6833 //      meiLongwordWrite(ARC_TO_MEI_INT, ARC_TO_MEI_MSGAV);
6834         mask_and_ack_amazon_irq(AMAZON_MEI_INT);
6835         return;
6836 }
6837
6838 // 603221:tc.chen start
6839 ////////////////////////hdlc ////////////////
6840
6841 // get hdlc status
6842 static unsigned int ifx_me_hdlc_status(void)
6843 {
6844         u16 CMVMSG[MSG_LENGTH]; 
6845         int ret;
6846
6847         if (showtime!=1)
6848                 return -ENETRESET;
6849         
6850         makeCMV_local(H2D_CMV_READ, STAT, 14, 0, 1, NULL,CMVMSG);       //Get HDLC status 
6851         ret = mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG);
6852         if (ret != 0)
6853         {
6854                 return -EIO;
6855         }
6856         return CMVMSG[4]&0x0F;
6857 }
6858
6859 int ifx_me_is_resloved(int status)
6860 {
6861         u16 CMVMSG[MSG_LENGTH];
6862         int ret;
6863         
6864         if (status == ME_HDLC_MSG_QUEUED || status == ME_HDLC_MSG_SENT)
6865                 return ME_HDLC_UNRESOLVED;
6866         if (status == ME_HDLC_IDLE)
6867         {
6868                 makeCMV_local(H2D_CMV_READ, CNTL, 2, 0, 1, NULL,CMVMSG);        //Get ME-HDLC Control
6869                 ret = mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG);
6870                 if (ret != 0)
6871                 {
6872                         return IFX_POP_EOC_FAIL;
6873                 }
6874                 if (CMVMSG[4]&(1<<0))
6875                 {
6876                         return ME_HDLC_UNRESOLVED;
6877                 }
6878                 
6879         }
6880         return ME_HDLC_RESOLVED;
6881 }
6882
6883 int _ifx_me_hdlc_send(unsigned char *hdlc_pkt,int len,int max_length)
6884 {
6885         int ret;
6886         u16 CMVMSG[MSG_LENGTH];
6887         u16 data=0;
6888         u16 pkt_len=len;
6889         if (pkt_len > max_length)
6890         {
6891                 printk("Exceed maximum eoc message length\n");
6892                 return -ENOBUFS;
6893         }
6894         //while(pkt_len > 0)
6895         {               
6896                 makeCMV_local(H2D_CMV_WRITE, INFO, 81, 0, (pkt_len+1)/2,(u16 *)hdlc_pkt,CMVMSG);        //Write clear eoc message to ARC
6897                 ret = mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG);
6898                 if (ret != 0)
6899                 {
6900                         return -EIO;
6901                 }
6902                 
6903                 makeCMV_local(H2D_CMV_WRITE, INFO, 83, 2, 1,&pkt_len,CMVMSG);   //Update tx message length
6904                 ret = mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG);
6905                 if (ret != 0)
6906                 {
6907                         return -EIO;
6908                 }
6909                 
6910                 data = (1<<0);
6911                 makeCMV_local(H2D_CMV_WRITE, CNTL, 2, 0, 1,&data,CMVMSG);       //Start to send
6912                 ret = mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG);
6913                 if (ret != 0)
6914                 {
6915                         return -EIO;
6916                 }
6917                 return 0;
6918         }
6919 }
6920
6921 static int ifx_me_hdlc_send(unsigned char *hdlc_pkt,int hdlc_pkt_len)
6922 {
6923         int hdlc_status=0;
6924         u16 CMVMSG[MSG_LENGTH];
6925         int max_hdlc_tx_length=0,ret=0,retry=0;
6926         
6927         while(retry<10)
6928         {
6929                 hdlc_status = ifx_me_hdlc_status();
6930                 if (ifx_me_is_resloved(hdlc_status)==ME_HDLC_RESOLVED) // arc ready to send HDLC message
6931                 {
6932                         makeCMV_local(H2D_CMV_READ, INFO, 83, 0, 1, NULL,CMVMSG);       //Get Maximum Allowed HDLC Tx Message Length
6933                         ret = mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG);
6934                         if (ret != 0)
6935                         {
6936                                 return -EIO;
6937                         }
6938                         max_hdlc_tx_length = CMVMSG[4];
6939                         ret = _ifx_me_hdlc_send(hdlc_pkt,hdlc_pkt_len,max_hdlc_tx_length);
6940                         return ret;
6941                 }
6942                 set_current_state(TASK_INTERRUPTIBLE);
6943                 schedule_timeout(10);
6944         }
6945         return -EBUSY;
6946 }
6947
6948 int ifx_mei_hdlc_read(char *hdlc_pkt,int max_hdlc_pkt_len)
6949 {
6950         u16 CMVMSG[MSG_LENGTH]; 
6951         int msg_read_len,ret=0,pkt_len=0,retry = 0;
6952                 
6953         while(retry<10)
6954         {
6955                 ret = ifx_me_hdlc_status();
6956                 if (ret == ME_HDLC_RESP_RCVD)
6957                 {
6958                         int current_size=0;
6959                         makeCMV_local(H2D_CMV_READ, INFO, 83, 3, 1, NULL,CMVMSG);       //Get EoC packet length
6960                         ret = mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG);
6961                         if (ret != 0)
6962                         {
6963                                 return -EIO;
6964                         }
6965         
6966                         pkt_len = CMVMSG[4];
6967                         if (pkt_len > max_hdlc_pkt_len)
6968                         {
6969                                 ret = -ENOMEM;
6970                                 goto error;
6971                         }
6972                         while( current_size < pkt_len)
6973                         {
6974                                 if (pkt_len - current_size >(MSG_LENGTH*2-8))
6975                                         msg_read_len = (MSG_LENGTH*2-8);
6976                                 else
6977                                         msg_read_len = pkt_len - (current_size);
6978                                 makeCMV_local(H2D_CMV_READ, INFO, 82, 0 + (current_size/2), (msg_read_len+1)/2, NULL,CMVMSG);   //Get hdlc packet
6979                                 ret = mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG);
6980                                 if (ret != 0)
6981                                 {
6982                                         goto error;
6983                                 }
6984                                 memcpy(hdlc_pkt+current_size,&CMVMSG[4],msg_read_len);
6985                                 current_size +=msg_read_len;
6986                         }
6987                         ret = current_size;
6988                         break;
6989                 }else
6990                 {
6991                         ret = -ENODATA;
6992                 }
6993                 
6994                 retry++;
6995                 set_current_state(TASK_INTERRUPTIBLE);
6996                 schedule_timeout(10);
6997                 
6998         }
6999         return ret;
7000 error:
7001         
7002         return ret;
7003 }
7004
7005 ////////////////////////hdlc ////////////////
7006 // 603221:tc.chen end
7007
7008 /////////////////////// clearEoC, int ifx_pop_eoc(sk_buff * pkt)  //////////
7009 int ifx_pop_eoc(struct sk_buff * pkt);
7010 int ifx_pop_eoc(struct sk_buff * pkt)
7011 {
7012         amazon_clreoc_pkt * current;
7013         if(showtime!=1){
7014                 dev_kfree_skb(pkt);
7015                 return IFX_POP_EOC_FAIL;
7016         }
7017         if((pkt->len)>clreoc_max_tx_len){
7018                 dev_kfree_skb(pkt);
7019                 return IFX_POP_EOC_FAIL;
7020         }
7021         current = list_entry(clreoc_list.next, amazon_clreoc_pkt, list);
7022         while(1){
7023                 if(current->len==0){
7024                         memcpy(current->command, pkt->data, pkt->len);
7025                         current->len=pkt->len;
7026                         break;
7027                 }
7028                 else{
7029                         if((current->list).next==&clreoc_list){
7030                                 dev_kfree_skb(pkt);
7031                                 return IFX_POP_EOC_FAIL;        //buffer full
7032                         }
7033                         current = list_entry((current->list).next,amazon_clreoc_pkt, list);
7034                 }
7035         }       
7036         wake_up_interruptible(&wait_queue_clreoc);
7037         
7038         dev_kfree_skb(pkt);
7039         return IFX_POP_EOC_DONE;
7040 }       
7041 /*  this is used in circular fifo mode */
7042 /*
7043 int ifx_pop_eoc(sk_buff * pkt);
7044 int ifx_pop_eoc(sk_buff * pkt)
7045 {
7046         int buff_space,i;
7047         if(showtime!=1)
7048                 return IFX_POP_EOC_FAIL;
7049         
7050         if(clreoc_wr>=clreoc_rd)
7051                 buff_space = (MEI_CLREOC_BUFF_SIZE-1)-(clreoc_wr - clreoc_rd);
7052         else
7053                 buff_space = clreoc_rd - clreoc_wr - 1;
7054         if((pkt->len)>buff_space)
7055                 return IFX_POP_EOC_FAIL;
7056                                         
7057         if((clreoc_wr+pkt->len)>MEI_CLREOC_BUFF_SIZE){
7058                 memcpy((clreoc+clreoc_wr), pkt->data, ((clreoc_wr+pkt->len)-MEI_CLREOC_BUFF_SIZE+1));
7059                 memcpy(clreoc, (pkt->data)+((clreoc_wr+pkt->len)-MEI_CLREOC_BUFF_SIZE+1), (pkt->len)-((clreoc_wr+pkt->len)-MEI_CLREOC_BUFF_SIZE+1)); 
7060                 clreoc_wr=(clreoc_wr+pkt->len)-MEI_CLREOC_BUFF_SIZE;
7061         }       
7062         else{
7063                 memcpy((clreoc+clreoc_wr), pkt->data, pkt->len);
7064                 if((clreoc_wr+pkt->len)=MEI_CLREOC_BUFF_SIZE)
7065                         clreoc_wr=0;
7066                 else
7067                         clreoc_wr+=pkt->len;
7068         }
7069         wake_up_interruptible(&wait_queue_clreoc);
7070         return IFX_POP_EOC_DONE;                        
7071 }
7072 */
7073
7074
7075 ////////////////////////////////////////////////////////////////////////////
7076 //int amazon_mei_init_module (void);
7077 //void amazon_mei_cleanup_module (void);
7078 //int __init init_module (void);
7079 //void __exit cleanup_module (void);
7080
7081 int __init amazon_mei_init_module(void)
7082 //int __init init_module(void)
7083 {
7084         struct proc_dir_entry *entry;
7085         int i;
7086         
7087 //dying gasp-start      
7088 #ifdef IFX_DYING_GASP
7089
7090 //000003:fchang Start
7091 #ifdef CONFIG_CPU_AMAZON_E
7092                 //GPIO31 :dying gasp event indication
7093                 //      (1) logic high: dying gasp event is false (default)
7094                 //      (2) logic low: dying gasp event is true
7095                         CLEAR_BIT((*((volatile u32 *)0xB0100B18)), 0x4);
7096                         CLEAR_BIT((*((volatile u32 *)0xB0100B1c)), 0x4);
7097                         CLEAR_BIT((*((volatile u32 *)0xB0100B20)), 0x4);
7098                         SET_BIT((*((volatile u32 *)0xB0100B24)), 0x4);
7099                         asm("SYNC");                    
7100 #else //000003:fchang End
7101
7102                 //GPIO31 :dying gasp event indication
7103                 //      (1) logic high: dying gasp event is false (default)
7104                 //      (2) logic low: dying gasp event is true
7105                         CLEAR_BIT((*((volatile u32 *)0xB0100B48)), 0x8000);
7106                         CLEAR_BIT((*((volatile u32 *)0xB0100B4C)), 0x8000);
7107                         CLEAR_BIT((*((volatile u32 *)0xB0100B50)), 0x8000);
7108                         SET_BIT((*((volatile u32 *)0xB0100B54)), 0x8000);
7109 #if 0                   
7110 //warning-led-start     
7111 //GPIO 22               
7112                         SET_BIT ((*((volatile u32 *)0xB0100B48)), 0x40);
7113                         CLEAR_BIT((*((volatile u32 *)0xB0100B4C)), 0x40);
7114                         CLEAR_BIT((*((volatile u32 *)0xB0100B50)), 0x40);
7115                         SET_BIT((*((volatile u32 *)0xB0100B54)), 0x40);                 
7116                         CLEAR_BIT((*((volatile u32 *)0xB0100B40)), 0x40); //GPIO ON
7117                         printk("LED ON ON ON ON ON ON.....");
7118 //warning-led-end                       
7119 #endif
7120                         asm("SYNC");    
7121 #endif //000003:fchang
7122
7123 #endif //IFX_DYING_GASP 
7124 //dying gasp -end        
7125         
7126         
7127         reg_entry_t regs_temp[PROC_ITEMS] =                                     // Items being debugged
7128         {
7129         /*      {       flag,          name,          description } */
7130         { &arcmsgav, "arcmsgav", "arc to mei message ", 0 },
7131             { &cmv_reply, "cmv_reply", "cmv needs reply", 0},
7132             { &cmv_waiting, "cmv_waiting", "waiting for cmv reply from arc", 0},
7133             { &indicator_count, "indicator_count", "ARC to MEI indicator count", 0},
7134             { &cmv_count, "cmv_count", "MEI to ARC CMVs", 0},
7135             { &reply_count, "reply_count", "ARC to MEI Reply", 0},
7136             { (int *)Recent_indicator, "Recent_indicator", "most recent indicator", 0},
7137             { (int *)8, "version", "version of firmware", 0},
7138         };
7139         memcpy((char *)regs, (char *)regs_temp, sizeof(regs_temp));
7140
7141
7142         //sema_init(&mei_sema, 0);  // semaphore initialization, mutex
7143         sema_init(&mei_sema, 1);  // semaphore initialization, mutex
7144         
7145         init_waitqueue_head(&wait_queue_arcmsgav);              // for ARCMSGAV
7146         init_waitqueue_head(&wait_queue_codeswap);              // for codeswap daemon
7147         init_waitqueue_head(&wait_queue_mibdaemon);             // for mib daemon
7148         init_waitqueue_head(&wait_queue_reboot);                // for ioctl reboot 
7149         init_waitqueue_head(&wait_queue_clreoc);                // for clreoc_wr function
7150         init_waitqueue_head(&wait_queue_loop_diagnostic);               // for loop diagnostic function
7151 #ifdef ADSL_LED_SUPPORT 
7152         init_waitqueue_head(&wait_queue_led);                   // adsl led for led function
7153         init_waitqueue_head(&wait_queue_led_polling);           // adsl led for led function
7154         led_task.routine = adsl_led_flash_task;                 // adsl led for led function
7155         led_poll_init();                                        // adsl led for led function
7156 #endif  //ADSL_LED_SUPPORT
7157 #ifdef IFX_DYING_GASP   
7158         init_waitqueue_head(&wait_queue_dying_gasp);            // IFX_DYING_GASP
7159         lop_poll_init();                                        // IFX_DYING_GASP 
7160 #endif  //IFX_DYING_GASP
7161  
7162         init_waitqueue_head(&wait_queue_uas_poll);//joelin 04/16/2005
7163         unavailable_seconds_poll_init();//joelin 04/16/2005
7164         memset(&mib_pflagtime, 0, (sizeof(mib_flags_pretime)));
7165         
7166         // initialize link list for intervals
7167         mei_mib = (amazon_mei_mib *)kmalloc((sizeof(amazon_mei_mib)*INTERVAL_NUM), GFP_KERNEL);
7168         if(mei_mib == NULL){
7169 #ifdef AMAZON_MEI_DEBUG_ON
7170                 printk("kmalloc error for amazon_mei_mib\n\n");
7171 #endif
7172                 return -1;
7173         }
7174         memset(mei_mib, 0, (sizeof(amazon_mei_mib)*INTERVAL_NUM));
7175         INIT_LIST_HEAD(&interval_list);
7176         for(i=0;i<INTERVAL_NUM;i++)
7177                 list_add_tail(&(mei_mib[i].list), &interval_list); 
7178         current_intvl = list_entry(interval_list.next, amazon_mei_mib, list);
7179         do_gettimeofday(&(current_intvl->start_time)); 
7180         // initialize clreoc list
7181         clreoc_pkt = (amazon_clreoc_pkt *)kmalloc((sizeof(amazon_clreoc_pkt)*CLREOC_BUFF_SIZE), GFP_KERNEL);
7182         if(clreoc_pkt == NULL){
7183 #ifdef AMAZON_MEI_DEBUG_ON
7184                 printk("kmalloc error for clreoc_pkt\n\n");
7185 #endif
7186                 return -1;
7187         }
7188         memset(clreoc_pkt, 0, (sizeof(amazon_clreoc_pkt)*CLREOC_BUFF_SIZE));
7189         INIT_LIST_HEAD(&clreoc_list);
7190         for(i=0;i<CLREOC_BUFF_SIZE;i++)
7191                 list_add_tail(&(clreoc_pkt[i].list), &clreoc_list);
7192                 
7193         memset(&AdslInitStatsData, 0, sizeof(AdslInitStatsData));
7194         if (register_chrdev(major, "amazon_mei", &mei_operations)!=0) {
7195 #ifdef AMAZON_MEI_DEBUG_ON
7196                 printk("\n\n unable to register major for amazon_mei!!!");
7197 #endif
7198                 return -1;
7199         }
7200         if (request_irq(AMAZON_MEI_INT, mei_interrupt_arcmsgav,0, "amazon_mei_arcmsgav", NULL)!=0){
7201 #ifdef AMAZON_MEI_DEBUG_ON
7202                 printk("\n\n unable to register irq for amazon_mei!!!");
7203 #endif
7204                 return -1;
7205         }
7206 //        disable_irq(AMAZON_MEI_INT);
7207         enable_irq(AMAZON_MEI_INT);
7208         // procfs
7209         meidir=proc_mkdir(MEI_DIRNAME, &proc_root);
7210         if ( meidir == NULL) {
7211 #ifdef AMAZON_MEI_DEBUG_ON
7212                 printk(KERN_ERR ": can't create /proc/" MEI_DIRNAME "\n\n");
7213 #endif
7214                 return(-ENOMEM);
7215         }
7216
7217         for(i=0;i<NUM_OF_REG_ENTRY;i++) {
7218                 entry = create_proc_entry(regs[i].name,
7219                                 S_IWUSR |S_IRUSR | S_IRGRP | S_IROTH,
7220                                 meidir);
7221                 if(entry) {
7222                         regs[i].low_ino = entry->low_ino;
7223                         entry->proc_fops = &proc_operations;
7224                 } else {
7225 #ifdef AMAZON_MEI_DEBUG_ON
7226                         printk( KERN_ERR 
7227                                 ": can't create /proc/" MEI_DIRNAME
7228                                 "/%s\n\n", regs[i].name);
7229 #endif
7230                         return(-ENOMEM);
7231                 }
7232         }
7233         ///////////////////////////////// register net device ////////////////////////////
7234         if(register_netdev(&phy_mei_net)!=0){
7235 #ifdef AMAZON_MEI_DEBUG_ON
7236                 printk("\n\n Register phy Device Failed.");
7237 #endif
7238                 return -1;
7239         }
7240 /*
7241         if(register_netdev(&interleave_mei_net)!=0){
7242                 printk("\n\n Register interleave Device Failed.");
7243                 return -1;
7244         }
7245         if(register_netdev(&fast_mei_net)!=0){
7246                 printk("\n\n Register fast Device Failed.");
7247                 return -1;
7248         }
7249 */
7250 #ifdef DFE_LOOPBACK
7251         mei_arc_swap_buff = (u32 *)kmalloc(MAXSWAPSIZE*4, GFP_KERNEL);
7252         if (mei_arc_swap_buff){
7253 #ifdef  ARC_READY_ACK
7254                 if(down_interruptible(&mei_sema))       //disable CMV access until ARC ready
7255                 {
7256                         return -ERESTARTSYS;
7257                 }
7258 #ifdef LOCK_RETRY
7259                 reboot_lock = 1;
7260 #endif
7261 #endif
7262                 meiForceRebootAdslModem();
7263                 kfree(mei_arc_swap_buff);
7264         }else{
7265 #ifdef AMAZON_MEI_DEBUG_ON
7266                 printk("cannot load image: no memory\n\n");
7267 #endif
7268         }
7269 #endif
7270 #ifdef IFX_SMALL_FOOTPRINT
7271         mib_poll_init();
7272 #endif
7273         return 0;
7274 }
7275
7276 void __exit amazon_mei_cleanup_module(void)
7277 //void __exit cleanup_module(void)
7278 {
7279         int i;
7280 #ifdef ADSL_LED_SUPPORT        
7281         stop_led_module=1;                      //wake up and clean led module 
7282         led_support_check=0;//joelin , clear task
7283         showtime=0;//joelin,clear task
7284         //CLEAR_BIT((*((volatile u32 *)0xB0100B40)), 0x40); //Warning LED GPIO ON
7285         firmware_support_led=0;//joelin ,clear task
7286         wake_up_interruptible(&wait_queue_led); //wake up and clean led module 
7287         wake_up_interruptible(&wait_queue_led_polling); //wake up and clean led module         
7288 #endif        
7289         for(i=0;i<NUM_OF_REG_ENTRY;i++)
7290                 remove_proc_entry(regs[i].name, meidir);
7291         remove_proc_entry(MEI_DIRNAME, &proc_root);
7292         
7293         disable_irq(AMAZON_MEI_INT);
7294         free_irq(AMAZON_MEI_INT, NULL);
7295         unregister_chrdev(major, "amazon_mei");
7296
7297         kfree(mei_mib);
7298         kfree(clreoc_pkt);
7299         
7300         kfree(phy_mei_net.priv);
7301         unregister_netdev(&phy_mei_net);
7302         
7303         return;
7304 }
7305 #ifdef IFX_SMALL_FOOTPRINT
7306
7307
7308 int adsl_mib_poll(void *unused)
7309 {
7310         struct task_struct *tsk = current;
7311         int i=0;
7312         struct timeval time_now;
7313         struct timeval time_fini;
7314         u32 temp,temp2;
7315
7316         amazon_mei_mib * mib_ptr;
7317 //      u16 buff[MSG_LENGTH]__attribute__ ((aligned(4)));
7318         u16 * data=NULL;  //used in makeCMV, to pass in payload when CMV set, ignored when CMV read.
7319
7320         daemonize();
7321         strcpy(tsk->comm, "kmibpoll");
7322         sigfillset(&tsk->blocked);
7323
7324         printk("Inside mib poll loop ...\n");
7325         i=0;
7326         while(1){
7327                 if(i<MIB_INTERVAL)
7328                         interruptible_sleep_on_timeout(&wait_queue_mibdaemon, ((MIB_INTERVAL-i)/(1000/HZ)));
7329                 i=0;
7330                 if(showtime==1){
7331 //                      printk("\n\n update mib");
7332                                         
7333                         do_gettimeofday(&time_now);
7334                         if(time_now.tv_sec - current_intvl->start_time.tv_sec>=900){
7335                                 if(current_intvl->list.next!=&interval_list){
7336                                         current_intvl = list_entry(current_intvl->list.next, amazon_mei_mib, list);
7337                                         do_gettimeofday(&(current_intvl->start_time));
7338                                 }
7339                                 else{
7340                                         mib_ptr = list_entry(interval_list.next, amazon_mei_mib, list);
7341                                         list_del(interval_list.next);
7342                                         memset(mib_ptr, 0, sizeof(amazon_mei_mib));
7343                                         list_add_tail(&(mib_ptr->list), &interval_list);
7344                                         if(current_intvl->list.next==&interval_list)
7345 #ifdef AMAZON_MEI_DEBUG_ON
7346                                         printk("\n\nlink list error");
7347 #endif
7348                                         current_intvl = list_entry(current_intvl->list.next, amazon_mei_mib, list);
7349                                         do_gettimeofday(&(current_intvl->start_time));
7350                                 }       
7351                         }
7352                                         
7353                         if(down_interruptible(&mei_sema))
7354                                 return -ERESTARTSYS;
7355 /*                                              
7356                         ATUC_PERF_LO_FLAG_MAKECMV;
7357                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
7358 #ifdef AMAZON_MEI_DEBUG_ON
7359                                 printk("\n\nCMV fail, Group 7 Address 0 Index 0");
7360 #endif
7361                         }
7362                         else{
7363                                 if(RxMessage[4]&PLAM_LOS_FailureBit){
7364                                         current_intvl->AtucPerfLos++;
7365                                         ATUC_PERF_LOSS++;
7366                                         CurrStatus.adslAtucCurrStatus = 2;
7367                                 }
7368                                 if(RxMessage[4]&PLAM_LOF_FailureBit){
7369                                         current_intvl->AtucPerfLof++;
7370                                         ATUC_PERF_LOFS++;
7371                                         CurrStatus.adslAtucCurrStatus = 1;
7372                                 }
7373                                 if(!(RxMessage[4]&(PLAM_LOS_FailureBit|PLAM_LOF_FailureBit)))
7374                                         CurrStatus.adslAtucCurrStatus = 0;
7375                                 }
7376 */
7377                                 
7378                                 if(showtime!=1)
7379                                         goto mib_poll_end;
7380                                 ATUC_PERF_ESS_FLAG_MAKECMV;
7381                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
7382 #ifdef AMAZON_MEI_DEBUG_ON
7383                                         printk("\n\nCMV fail, Group 7 Address 7 Index 0");
7384 #endif
7385                                 }
7386                                 else{
7387                                                 temp = RxMessage[4]-mib_pread.ATUC_PERF_ESS;
7388                                                 if(temp>=0){
7389                                                         current_intvl->AtucPerfEs+=temp;
7390                                                         ATUC_PERF_ESS+=temp;
7391                                                         mib_pread.ATUC_PERF_ESS = RxMessage[4];
7392                                                 }
7393                                                 else{
7394                                                         current_intvl->AtucPerfEs+=0xffff-mib_pread.ATUC_PERF_ESS+RxMessage[4];
7395                                                         ATUC_PERF_ESS+=0xffff-mib_pread.ATUC_PERF_ESS+RxMessage[4];
7396                                                         mib_pread.ATUC_PERF_ESS = RxMessage[4];         
7397                                         }
7398                                 }
7399 /*              
7400                                 ATUR_PERF_LO_FLAG_MAKECMV;
7401                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
7402 #ifdef AMAZON_MEI_DEBUG_ON
7403                                         printk("\n\nCMV fail, Group 7 Address 1 Index 0");
7404 #endif
7405                                 }
7406                                 else{
7407                                         if(RxMessage[4]&PLAM_LOS_FailureBit){
7408                                                 current_intvl->AturPerfLos++;
7409                                                 ATUR_PERF_LOSS++;
7410                                                 CurrStatus.adslAturCurrStatus = 2;
7411                                         }
7412                                         if(RxMessage[4]&PLAM_LOF_FailureBit){
7413                                                 current_intvl->AturPerfLof++;
7414                                                 ATUR_PERF_LOFS++;
7415                                                 CurrStatus.adslAturCurrStatus = 1;
7416                                         }
7417                                         if(RxMessage[4]&PLAM_LPR_FailureBit){
7418                                                 current_intvl->AturPerfLpr++;
7419                                                 ATUR_PERF_LPR++;
7420                                                 CurrStatus.adslAturCurrStatus = 3;
7421                                         }
7422                                         if(!(RxMessage[4]&(PLAM_LOS_FailureBit|PLAM_LOF_FailureBit|PLAM_LPR_FailureBit)))
7423                                                 CurrStatus.adslAturCurrStatus = 0;      
7424                                 }
7425 */
7426                                 if(showtime!=1)
7427                                         goto mib_poll_end;
7428                                 ATUR_PERF_ESS_FLAG_MAKECMV;
7429                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
7430 #ifdef AMAZON_MEI_DEBUG_ON
7431                                         printk("\n\nCMV fail, Group 7 Address 33 Index 0");
7432 #endif
7433                                 }
7434                                 else{
7435                                                 temp = RxMessage[4]-mib_pread.ATUR_PERF_ESS;
7436                                                 if(temp>=0){
7437                                                         current_intvl->AturPerfEs+=temp;
7438                                                         ATUR_PERF_ESS+=temp;
7439                                                         mib_pread.ATUR_PERF_ESS = RxMessage[4];
7440                                                 }
7441                                                 else{
7442                                                         current_intvl->AturPerfEs+=0xffff-mib_pread.ATUR_PERF_ESS+RxMessage[4];
7443                                                         ATUR_PERF_ESS+= 0xffff-mib_pread.ATUR_PERF_ESS+RxMessage[4];
7444                                                         mib_pread.ATUR_PERF_ESS=RxMessage[4];
7445                                         }
7446                                 }
7447                                 if(showtime!=1)
7448                                         goto mib_poll_end;
7449                                 // to update rx/tx blocks
7450                                 ATUR_CHAN_RECV_BLK_FLAG_MAKECMV_LSW;
7451                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
7452 #ifdef AMAZON_MEI_DEBUG_ON
7453                                         printk("\n\nCMV fail, Group 7 Address 20 Index 0");
7454 #endif
7455                                 }
7456                                 else{
7457                                                 temp = RxMessage[4];    
7458                                 }
7459                                 if(showtime!=1)
7460                                         goto mib_poll_end;
7461                                 ATUR_CHAN_RECV_BLK_FLAG_MAKECMV_MSW;
7462                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
7463 #ifdef AMAZON_MEI_DEBUG_ON
7464                                         printk("\n\nCMV fail, Group 7 Address 21 Index 0");
7465 #endif
7466                                 }
7467                                 else{
7468                                                 temp2 = RxMessage[4];   
7469                                         }       
7470                                         if((temp + (temp2<<16) - mib_pread.ATUR_CHAN_RECV_BLK)>=0){
7471                                                 current_intvl->AturChanPerfRxBlk+=temp + (temp2<<16) - mib_pread.ATUR_CHAN_RECV_BLK;
7472                                                 ATUR_CHAN_RECV_BLK+=temp + (temp2<<16) - mib_pread.ATUR_CHAN_RECV_BLK;
7473                                                 mib_pread.ATUR_CHAN_RECV_BLK = temp + (temp2<<16);
7474                                         }
7475                                         else{
7476                                                 current_intvl->AturChanPerfRxBlk+=0xffffffff - mib_pread.ATUR_CHAN_RECV_BLK +(temp + (temp2<<16));
7477                                                 ATUR_CHAN_RECV_BLK+=0xffffffff - mib_pread.ATUR_CHAN_RECV_BLK +(temp + (temp2<<16));
7478                                                 mib_pread.ATUR_CHAN_RECV_BLK = temp + (temp2<<16);
7479                                 }
7480                                 current_intvl->AturChanPerfTxBlk = current_intvl->AturChanPerfRxBlk;
7481                                 ATUR_CHAN_TX_BLK = ATUR_CHAN_RECV_BLK;
7482 /*                                      
7483                                 ATUR_CHAN_TX_BLK_FLAG_MAKECMV_LSW;
7484                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS)
7485                                         printk("\n\nCMV fail, Group 7 Address 20 Index 0");
7486                                 else{
7487                                         if(RxMessage[4]){
7488                                                 current_intvl->AturChanPerfTxBlk+=RxMessage[4];
7489                                                 ATUR_CHAN_TX_BLK+=RxMessage[4];
7490                                         }       
7491                                 }
7492                                 ATUR_CHAN_TX_BLK_FLAG_MAKECMV_MSW;
7493                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS)
7494                                         printk("\n\nCMV fail, Group 7 Address 21 Index 0");
7495                                 else{
7496                                         if(RxMessage[4]){
7497                                                 current_intvl->AturChanPerfTxBlk+=(int)((RxMessage[4])<<16);
7498                                                 ATUR_CHAN_TX_BLK+=(int)((RxMessage[4])<<16);
7499                                         }       
7500                                 }
7501 */                                      
7502                                 if(chantype.interleave == 1){
7503                                 if(showtime!=1)
7504                                         goto mib_poll_end;
7505                                         ATUR_CHAN_CORR_BLK_FLAG_MAKECMV_INTL;
7506                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
7507 #ifdef AMAZON_MEI_DEBUG_ON
7508                                                 printk("\n\nCMV fail, Group 7 Address 3 Index 0");
7509 #endif
7510                                         }
7511                                         else{
7512                                                         temp = RxMessage[4] - mib_pread.ATUR_CHAN_CORR_BLK_INTL;
7513                                                         if(temp>=0){
7514                                                                 current_intvl->AturChanPerfCorrBlk+=temp;
7515                                                                 ATUR_CHAN_CORR_BLK+=temp;
7516                                                                 mib_pread.ATUR_CHAN_CORR_BLK_INTL = RxMessage[4];
7517                                                         }       
7518                                                         else{
7519                                                                 current_intvl->AturChanPerfCorrBlk+=0xffff - mib_pread.ATUR_CHAN_CORR_BLK_INTL +RxMessage[4];
7520                                                                 ATUR_CHAN_CORR_BLK+=0xffff - mib_pread.ATUR_CHAN_CORR_BLK_INTL +RxMessage[4];
7521                                                                 mib_pread.ATUR_CHAN_CORR_BLK_INTL = RxMessage[4];       
7522                                                 }       
7523                                         }       
7524                                 }
7525                                 else if(chantype.fast == 1){
7526                                 if(showtime!=1)
7527                                         goto mib_poll_end;
7528                                         ATUR_CHAN_CORR_BLK_FLAG_MAKECMV_FAST;
7529                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
7530 #ifdef AMAZON_MEI_DEBUG_ON
7531                                                 printk("\n\nCMV fail, Group 7 Address 3 Index 1");
7532 #endif
7533                                         }
7534                                         else{
7535                                                         temp = RxMessage[4] - mib_pread.ATUR_CHAN_CORR_BLK_FAST;
7536                                                         if(temp>=0){
7537                                                                 current_intvl->AturChanPerfCorrBlk+=temp;
7538                                                                 ATUR_CHAN_CORR_BLK+=temp;
7539                                                                 mib_pread.ATUR_CHAN_CORR_BLK_FAST = RxMessage[4];
7540                                                         }       
7541                                                         else{
7542                                                                 current_intvl->AturChanPerfCorrBlk+=0xffff - mib_pread.ATUR_CHAN_CORR_BLK_FAST + RxMessage[4];
7543                                                                 ATUR_CHAN_CORR_BLK+=0xffff - mib_pread.ATUR_CHAN_CORR_BLK_FAST + RxMessage[4];
7544                                                                 mib_pread.ATUR_CHAN_CORR_BLK_FAST = RxMessage[4];
7545                                                 }       
7546                                         }               
7547                                 }
7548                                 
7549                                 if(chantype.interleave == 1){
7550                                 if(showtime!=1)
7551                                         goto mib_poll_end;
7552                                         ATUR_CHAN_UNCORR_BLK_FLAG_MAKECMV_INTL;
7553                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
7554 #ifdef AMAZON_MEI_DEBUG_ON
7555                                                 printk("\n\nCMV fail, Group 7 Address 2 Index 0");
7556 #endif
7557                                         }
7558                                         else{
7559                                                         temp = RxMessage[4] - mib_pread.ATUR_CHAN_UNCORR_BLK_INTL;
7560                                                         if(temp>=0){
7561                                                                 current_intvl->AturChanPerfUncorrBlk+=temp;
7562                                                                 ATUR_CHAN_UNCORR_BLK+=temp;
7563                                                                 mib_pread.ATUR_CHAN_UNCORR_BLK_INTL = RxMessage[4];
7564                                                         }
7565                                                         else{
7566                                                                 current_intvl->AturChanPerfUncorrBlk+=0xffff - mib_pread.ATUR_CHAN_UNCORR_BLK_INTL + RxMessage[4];
7567                                                                 ATUR_CHAN_UNCORR_BLK+=0xffff - mib_pread.ATUR_CHAN_UNCORR_BLK_INTL + RxMessage[4];
7568                                                                 mib_pread.ATUR_CHAN_UNCORR_BLK_INTL = RxMessage[4];
7569                                                 }
7570                                         }               
7571                                 }
7572                                 else if(chantype.fast == 1){
7573                                 if(showtime!=1)
7574                                         goto mib_poll_end;
7575                                         ATUR_CHAN_UNCORR_BLK_FLAG_MAKECMV_FAST;
7576                                         if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
7577 #ifdef AMAZON_MEI_DEBUG_ON
7578                                                 printk("\n\nCMV fail, Group 7 Address 2 Index 1");
7579 #endif
7580                                         }
7581                                         else{
7582                                                         temp = RxMessage[4] - mib_pread.ATUR_CHAN_UNCORR_BLK_FAST;
7583                                                         if(temp>=0){
7584                                                                 current_intvl->AturChanPerfUncorrBlk+=temp;
7585                                                                 ATUR_CHAN_UNCORR_BLK+=temp;
7586                                                                 mib_pread.ATUR_CHAN_UNCORR_BLK_FAST = RxMessage[4];
7587                                                         }
7588                                                         else{
7589                                                                 current_intvl->AturChanPerfUncorrBlk+=0xffff - mib_pread.ATUR_CHAN_UNCORR_BLK_FAST + RxMessage[4];
7590                                                                 ATUR_CHAN_UNCORR_BLK+=0xffff - mib_pread.ATUR_CHAN_UNCORR_BLK_FAST + RxMessage[4];
7591                                                                 mib_pread.ATUR_CHAN_UNCORR_BLK_FAST = RxMessage[4];
7592                                                 }
7593                                         }               
7594                                 }
7595                                         
7596                                 //RFC-3440
7597
7598 #ifdef AMAZON_MEI_MIB_RFC3440
7599                                 if(showtime!=1)
7600                                         goto mib_poll_end;
7601                                 ATUC_PERF_STAT_FASTR_FLAG_MAKECMV; //???
7602                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
7603 #ifdef AMAZON_MEI_DEBUG_ON
7604                                         printk("\n\nCMV fail, Group 0 Address 0 Index 0");
7605 #endif
7606                                 }
7607                                 else{
7608                                                 temp = RxMessage[4] - mib_pread.ATUC_PERF_STAT_FASTR;
7609                                                 if(temp>=0){
7610                                                         current_intvl->AtucPerfStatFastR+=temp;
7611                                                         ATUC_PERF_STAT_FASTR+=temp;
7612                                                         mib_pread.ATUC_PERF_STAT_FASTR = RxMessage[4];
7613                                                 }
7614                                                 else{
7615                                                         current_intvl->AtucPerfStatFastR+=0xffff - mib_pread.ATUC_PERF_STAT_FASTR + RxMessage[4];
7616                                                         ATUC_PERF_STAT_FASTR+=0xffff - mib_pread.ATUC_PERF_STAT_FASTR + RxMessage[4];
7617                                                         mib_pread.ATUC_PERF_STAT_FASTR = RxMessage[4];
7618                                         }
7619                                 }
7620                                 if(showtime!=1)
7621                                         goto mib_poll_end;
7622                                 ATUC_PERF_STAT_FAILED_FASTR_FLAG_MAKECMV; //???
7623                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
7624 #ifdef AMAZON_MEI_DEBUG_ON
7625                                         printk("\n\nCMV fail, Group 0 Address 0 Index 0");
7626 #endif
7627                                 }
7628                                 else{
7629                                                 temp = RxMessage[4] - mib_pread.ATUC_PERF_STAT_FAILED_FASTR;
7630                                                 if(temp>=0){
7631                                                         current_intvl->AtucPerfStatFailedFastR+=temp;
7632                                                         ATUC_PERF_STAT_FAILED_FASTR+=temp;
7633                                                         mib_pread.ATUC_PERF_STAT_FAILED_FASTR = RxMessage[4];
7634                                                 }
7635                                                 else{
7636                                                         current_intvl->AtucPerfStatFailedFastR+=0xffff - mib_pread.ATUC_PERF_STAT_FAILED_FASTR + RxMessage[4];
7637                                                         ATUC_PERF_STAT_FAILED_FASTR+=0xffff - mib_pread.ATUC_PERF_STAT_FAILED_FASTR + RxMessage[4];
7638                                                         mib_pread.ATUC_PERF_STAT_FAILED_FASTR = RxMessage[4];
7639                                         }
7640                                 }
7641                                 if(showtime!=1)
7642                                         goto mib_poll_end;
7643                                 ATUC_PERF_STAT_SESL_FLAG_MAKECMV;
7644                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
7645 #ifdef AMAZON_MEI_DEBUG_ON
7646                                         printk("\n\nCMV fail, Group 7 Address 8 Index 0");
7647 #endif
7648                                 }
7649                                 else{
7650                                                 temp = RxMessage[4] - mib_pread.ATUC_PERF_STAT_SESL;
7651                                                 if(temp>=0){
7652                                                         current_intvl->AtucPerfStatSesL+=temp;
7653                                                         ATUC_PERF_STAT_SESL+=temp;
7654                                                         mib_pread.ATUC_PERF_STAT_SESL = RxMessage[4];
7655                                                 }
7656                                                 else{
7657                                                         current_intvl->AtucPerfStatSesL+=0xffff - mib_pread.ATUC_PERF_STAT_SESL + RxMessage[4];
7658                                                         ATUC_PERF_STAT_SESL+=0xffff - mib_pread.ATUC_PERF_STAT_SESL + RxMessage[4];
7659                                                         mib_pread.ATUC_PERF_STAT_SESL = RxMessage[4];
7660                                         }
7661                                 }
7662                                 if(showtime!=1)
7663                                         goto mib_poll_end;
7664                                 ATUC_PERF_STAT_UASL_FLAG_MAKECMV;
7665                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
7666 #ifdef AMAZON_MEI_DEBUG_ON
7667                                         printk("\n\nCMV fail, Group 7 Address 10 Index 0");
7668 #endif
7669                                 }
7670                                 else{
7671                                                 temp = RxMessage[4] - mib_pread.ATUC_PERF_STAT_UASL;
7672                                                 if(temp>=0){
7673                                                         current_intvl->AtucPerfStatUasL+=temp;
7674                                                         ATUC_PERF_STAT_UASL+=temp;
7675                                                         mib_pread.ATUC_PERF_STAT_UASL = RxMessage[4];
7676                                                 }
7677                                                 else{
7678                                                         current_intvl->AtucPerfStatUasL+=0xffff - mib_pread.ATUC_PERF_STAT_UASL + RxMessage[4];
7679                                                         ATUC_PERF_STAT_UASL+=0xffff - mib_pread.ATUC_PERF_STAT_UASL + RxMessage[4];
7680                                                         mib_pread.ATUC_PERF_STAT_UASL = RxMessage[4];
7681                                         }
7682                                 }
7683                                 if(showtime!=1)
7684                                         goto mib_poll_end;
7685                                 ATUR_PERF_STAT_SESL_FLAG_MAKECMV;
7686                                 if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){
7687 #ifdef AMAZON_MEI_DEBUG_ON
7688                                         printk("\n\nCMV fail, Group 7 Address 34 Index 0");
7689 #endif
7690                                 }
7691                                 else{
7692                                                 temp = RxMessage[4] - mib_pread.ATUR_PERF_STAT_SESL;
7693                                                 if(temp>=0){
7694                                                         current_intvl->AtucPerfStatUasL+=temp;
7695                                                         ATUC_PERF_STAT_UASL+=temp;
7696                                                         mib_pread.ATUR_PERF_STAT_SESL = RxMessage[4];
7697                                                 }
7698                                                 else{
7699                                                         current_intvl->AtucPerfStatUasL+=0xffff - mib_pread.ATUR_PERF_STAT_SESL + RxMessage[4];
7700                                                         ATUC_PERF_STAT_UASL+=0xffff - mib_pread.ATUR_PERF_STAT_SESL + RxMessage[4];
7701                                                         mib_pread.ATUR_PERF_STAT_SESL = RxMessage[4];
7702                                         }
7703                                 }
7704                                         
7705 #endif
7706 mib_poll_end:
7707                                 up(&mei_sema);
7708                                 
7709                                 do_gettimeofday(&time_fini);
7710                                 i = ((int)((time_fini.tv_sec-time_now.tv_sec)*1000)) + ((int)((time_fini.tv_usec-time_now.tv_usec)/1000))  ; //msec 
7711                         }//showtime==1
7712                 }        
7713         
7714 }
7715 int mib_poll_init(void)
7716 {
7717         printk("Starting mib_poll...\n");
7718
7719         kernel_thread(adsl_mib_poll, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL);
7720         return 0;
7721 }
7722 #endif //IFX_SMALL_FOOTPRINT
7723 //EXPORT_NO_SYMBOLS;
7724
7725 #ifdef ADSL_LED_SUPPORT
7726 // adsl led -start
7727 int led_status_on=0,led_need_to_flash=0;
7728 int led_current_flashing=0;
7729 unsigned long led_delay=0;
7730 static int led_poll(void *unused)
7731 {
7732         stop_led_module=0;      //begin polling ...
7733         while(!stop_led_module){
7734                 if ((!led_status_on)&&(!led_need_to_flash)) interruptible_sleep_on_timeout (&wait_queue_led_polling,1000); //10 seconds timeout for waiting wakeup
7735 //                      else printk("direct running task, no waiting");
7736                 run_task_queue(&tq_ifx_led);//joelin task
7737 //      printk("led and LOP polling...\n");
7738                 }
7739         return 0;       
7740 }       
7741 static int led_poll_init(void)
7742 {
7743 //      printk("Starting adsl led polling...\n");
7744
7745 //warning-led-start
7746 //      CLEAR_BIT((*((volatile u32 *)0xB0100B40)), 0x40); //Warning LED GPIO ON
7747 //warning-led-end
7748
7749         kernel_thread(led_poll, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL);
7750         return 0;
7751 }
7752
7753 int adsl_led_flash(void)
7754 {       
7755         int i;
7756         if (!firmware_support_led)      return 0;       //joelin version check 
7757
7758         if (led_status_on == 0 && led_need_to_flash == 0)
7759         {
7760                 queue_task(&led_task, &tq_ifx_led);//joelin task
7761                 wake_up_interruptible(&wait_queue_led_polling); //wake up and clean led module 
7762 //              printk("queue Task 1...\n");    //joelin  test  
7763         }
7764         led_need_to_flash=1;//asking to flash led
7765
7766         return 0;
7767 }
7768
7769 int adsl_led_flash_task(void *ptr)
7770 {
7771
7772         u16     one=1;
7773         u16     zero=0;
7774         u16     data=0x0600;
7775         int kernel_use=1;
7776         u16 CMVMSG[MSG_LENGTH];                                                                           
7777 //adsl-led-start for >v1.1.2.7.1.1
7778 //      printk("Task Running...\n");    //joelin  test
7779         if ((firmware_support_led==2)&&(led_support_check))
7780         {
7781         led_support_check=0;
7782         data=0x0600;
7783         makeCMV_local(H2D_CMV_WRITE, INFO, 91, 0, 1, &data,CMVMSG);     //configure GPIO9 GPIO10 as outputs
7784         mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG);
7785
7786         makeCMV_local(H2D_CMV_WRITE, INFO, 91, 2, 1, &data,CMVMSG);     //enable writing to bit 9 and bit10
7787         mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG);
7788         
7789         data=0x0a01;
7790         makeCMV_local(H2D_CMV_WRITE, INFO, 91, 4, 1, &data,CMVMSG);     //use GPIO10 for TR68 .Enable and don't invert.
7791         mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG);      
7792         
7793 #ifdef DATA_LED_ON_MODE 
7794         data=0x0903;//tecom //use GPIO9 for TR68 data led .turn on.
7795 #else
7796         data=0x0900;
7797 #endif  
7798         makeCMV_local(H2D_CMV_WRITE, INFO, 91, 5, 1, &data,CMVMSG);     //use GPIO9 for TR68 data led .turn off.
7799         mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG);              
7800         
7801         }
7802         if (!showtime) {led_need_to_flash=0; return 0;} 
7803 //adsl-led-end for >v1.1.2.7.1.1
7804
7805         if (led_status_on == 0 || led_need_to_flash == 1)
7806         {
7807
7808                 if (led_current_flashing==0)
7809                 {
7810                         if (firmware_support_led==1){//>1.1.2.3.1.1
7811                         makeCMV_local(H2D_CMV_WRITE, INFO, 91, 0, 1, &one,CMVMSG);      //flash
7812                         mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, &CMVMSG);     
7813                 }
7814                         else if (firmware_support_led==2){//>1.1.2.7.1.1
7815                                 data=0x0901;//flash
7816                                 makeCMV_local(H2D_CMV_WRITE, INFO, 91, 5, 1, &data,CMVMSG);     //use GPIO9 for TR68 data led .flash.
7817                                 mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, &CMVMSG);                     
7818                                 
7819                         }//(firmware_support_led==2)
7820                         led_current_flashing = 1;//turn on led
7821                 }
7822                 led_status_on=1;
7823
7824                 do{//do nothing , waiting untill no data traffic 
7825                         led_need_to_flash=0;
7826                         interruptible_sleep_on_timeout(&wait_queue_led, 25); //the time for LED Off , if no data traffic                         
7827                 }while(led_need_to_flash==1);
7828                 
7829         }else if (led_status_on == 1 && led_need_to_flash==0)
7830         {
7831                 if (led_current_flashing==1)
7832                 {//turn off led
7833                         if (firmware_support_led==1){//>1.1.2.3.1.1
7834                         makeCMV_local(H2D_CMV_WRITE, INFO, 91, 0, 1, &zero,CMVMSG);//off        
7835                         mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, &CMVMSG);
7836                         }       //>1.1.2.3.1.1          
7837                         else if (firmware_support_led==2){//>1.1.2.7.1.1
7838 #ifdef DATA_LED_ON_MODE                                 
7839                                 data=0x0903;//tecom //use GPIO9 for TR68 data led .turn on.
7840 #else
7841                                 data=0x0900;//off
7842 #endif                          
7843                                 makeCMV_local(H2D_CMV_WRITE, INFO, 91, 5, 1, &data,CMVMSG);     //use GPIO9 for TR68 data led .off.
7844                         mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, &CMVMSG);
7845                                 
7846                         }//(firmware_support_led==2)
7847                         led_status_on=0;
7848                         led_current_flashing = 0;
7849                 }
7850                 }
7851         
7852         if (led_status_on == 1 || led_need_to_flash)
7853         {//led flash job on going or led need to flash 
7854                 queue_task(&led_task, &tq_ifx_led);     //joelin task   
7855 //              printk("queue Task 2...\n");    //joelin  test  
7856         }
7857         return 0;
7858 }
7859 //joelin adsl led-end
7860 #else 
7861 int adsl_led_flash(void)
7862 {
7863         return 0;
7864 }
7865 #endif //ADSL_LED_SUPPORT
7866 #ifdef IFX_DYING_GASP
7867 static int lop_poll(void *unused)
7868 {
7869         
7870         while(1)
7871         {
7872         interruptible_sleep_on_timeout(&wait_queue_dying_gasp, 1); 
7873 #ifdef CONFIG_CPU_AMAZON_E //000003:fchang
7874         if(showtime&&((*((volatile u32 *)0xB0100B14))&0x4)==0x0)        {//000003:fchang
7875 #else //000003:fchang
7876         if(showtime&&((*((volatile u32 *)0xB0100B44))&0x8000)==0x0)     {
7877 #endif //CONFIG_CPU_AMAZON_E
7878                 mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_WRITEDEBUG, &lop_debugwr);
7879                 printk("send dying gasp..\n");}
7880                 
7881         }
7882         return 0;       
7883         }
7884 static int lop_poll_init(void)
7885 {
7886 //      printk("Starting LOP polling...\n");
7887         kernel_thread(lop_poll, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL);
7888         return 0;
7889 }
7890
7891 #endif //IFX_DYING_GASP
7892
7893 //joelin 04/16/2005-satrt
7894 static int unavailable_seconds_poll(void *unused)
7895 {
7896         while(1){
7897                 interruptible_sleep_on_timeout (&wait_queue_uas_poll,100); //1 second timeout for waiting wakeup
7898                 if (!showtime) unavailable_seconds++;
7899         }
7900         return 0;       
7901 }       
7902 static int unavailable_seconds_poll_init(void)
7903 {
7904   
7905         kernel_thread(unavailable_seconds_poll, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL);
7906         return 0;
7907 }
7908
7909
7910 //joelin 04/16/2005-end
7911 EXPORT_SYMBOL(meiDebugWrite);
7912 EXPORT_SYMBOL(ifx_pop_eoc);
7913
7914 MODULE_LICENSE("GPL");
7915
7916 module_init(amazon_mei_init_module);
7917 module_exit(amazon_mei_cleanup_module);
7918