/* ============================================================================ * Copyright (C) 2004 -Infineon Technologies AG. * * All rights reserved. * ============================================================================ * *============================================================================ * Licensed under GNU GPL v2 * ============================================================================ */ /* =========================================================================== * * File Name: amazon_mei.c * Author : Ou Ke * * =========================================================================== * * Project: Amazon * * =========================================================================== * Contents:This file implements the MEI driver for Amazon ADSL/ADSL2+ * controller. * * =========================================================================== * References: * */ /* =========================================================================== * Revision History: * 12/1/2005 : Ritesh Banerjee * - Create a kernel thread kmibpoll to poll for periodic RFC 2662 * and RFC 3440 counters. Removes the need for user space * adsl_mibpoll_daemon and saves atleast 30KB of RAM. * * $Log$ * =========================================================================== */ /* * =========================================================================== * INCLUDE FILES * =========================================================================== */ //000002:fchang 2005/6/2 joelin 04/27/2005 for pcm clock //000003:fchang 2005/6/2 Henry added for Amazon-E support //165001:henryhsu 2005/9/6 Modify for adsl firmware version 1.2.1.2.0.1 DATA_LED can't flash. // 509221:tc.chen 2005/09/22 Reset DFE added when MEI_TO_ARC_CS_DONE not cleared by ARC // 603221:tc.chen 2006/03/21 added APIs to support the WEB related parameters for ADSL Statistics #ifndef EXPORT_SYMTAB #define EXPORT_SYMTAB #endif #define AMAZON_MEI_MIB_RFC3440 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define SET_BIT(reg, mask) reg |= (mask) #define CLEAR_BIT(reg, mask) reg &= (~mask) #define CLEAR_BITS(reg, mask) CLEAR_BIT(reg, mask) #define SET_BITS(reg, mask) SET_BIT(reg, mask) #define SET_BITFIELD(reg, mask, off, val) {reg &= (~mask); reg |= (val << off);} extern void mask_and_ack_amazon_irq(unsigned int irq_nr); #ifdef AMAZON_CHECK_LINK //amazon_tpe.c extern int (*adsl_link_notify)(int); #endif //AMAZON_CHECK_LINK // for ARC memory access #define WHILE_DELAY 20000 #define AMAZON_DMA_DEBUG_MUTEX //TODO #undef DFE_LOOPBACK #define ARC_READY_ACK static amazon_mei_mib * current_intvl; static struct list_head interval_list; static amazon_mei_mib * mei_mib; static int reboot_firsttime=1;//000002:fchang //PCM #define PCM_CHANNEL_NUM 2 //1 rx, 1 tx static pcm_data_struct pcm_data[PCM_CHANNEL_NUM]__attribute__ ((aligned(4))); //0=tx0, 1=rx0, 2=tx1, 3=rx1 static u32 pcm_start_addr; //#define PCM_HRT_TIME_HZ 4000 //?us #define PCM_ACCESS_DEBUG static int irqtimes=0; #undef DATA_LED_ON_MODE #define ADSL_LED_SUPPORT //joelin for adsl led #ifdef ADSL_LED_SUPPORT static int firmware_support_led=0; //joelin version check for adsl led static int stop_led_module=0; //wakeup and clean led module static int led_support_check=0; //1.1.2.7.1.1 #endif //ADSL_LED_SUPPORT #define IFX_DYING_GASP #ifdef IFX_DYING_GASP static wait_queue_head_t wait_queue_dying_gasp; //dying gasp //struct tq_struct dying_gasp_task; //dying gasp static wait_queue_head_t wait_queue_uas_poll; //joelin 04/16/2005 static u16 unavailable_seconds=0; //joelin 04/16/2005 static meidebug lop_debugwr; //dying gasp #endif //IFX_DYING_GASP static int dbg_int=0; //#define DEBUG_ACCESS_DELAY for(dbg_int=0;dbg_int<100;dbg_int++){;} #define DEBUG_ACCESS_DELAY static u8 sampledata[512]; static int firsttime[PCM_CHANNEL_NUM]={0,1}; static int num_cmp[PCM_CHANNEL_NUM]={0,0}; static int pcm_start_loc[PCM_CHANNEL_NUM]={0,0}; // for clearEoC //#define MEI_CLREOC_BUFF_SIZE 512 //double the receive fifo size, bytes //static u8 clreoc[MEI_CLREOC_BUFF_SIZE]__attribute__ ((aligned(4))); //buffer to hold clearEoC data in bytes #undef AMAZON_CLEAR_EOC #ifdef AMAZON_CLEAR_EOC extern void ifx_push_eoc(struct sk_buff * pkt); #endif static int meiResetArc(void); #define IFX_POP_EOC_DONE 0 #define IFX_POP_EOC_FAIL -1 static struct list_head clreoc_list; static amazon_clreoc_pkt * clreoc_pkt; #define CLREOC_BUFF_SIZE 12 //number of clreoc commands being buffered //static int clreoc_wr=0; //static int clreoc_rd=0; //used to control clreoc circular buffer static wait_queue_head_t wait_queue_clreoc; #ifdef ADSL_LED_SUPPORT static wait_queue_head_t wait_queue_led; //adsl led static wait_queue_head_t wait_queue_led_polling;// adsl led struct tq_struct led_task; // adsl led static DECLARE_TASK_QUEUE(tq_ifx_led); // task int adsl_led_flash_task(void *ptr); // adsl led #endif //ADSL_LED_SUPPORT static void * clreoc_command_pkt=NULL; static int clreoc_max_tx_len=0; // 603221:tc.chen start #define ME_HDLC_IDLE 0 #define ME_HDLC_INVALID_MSG 1 #define ME_HDLC_MSG_QUEUED 2 #define ME_HDLC_MSG_SENT 3 #define ME_HDLC_RESP_RCVD 4 #define ME_HDLC_RESP_TIMEOUT 5 #define ME_HDLC_RX_BUF_OVERFLOW 6 #define ME_HDLC_UNRESOLVED 1 #define ME_HDLC_RESOLVED 2 // 603221:tc.chen end #ifdef LOCK_RETRY static int reboot_lock=0; #endif static mib_previous_read mib_pread={0,0,0,0,0,0,0,0,0,0,0,0}; static mib_flags_pretime mib_pflagtime;// initialized when module loaded static u32 ATUC_PERF_LOFS=0; static u32 ATUC_PERF_LOSS=0; static u32 ATUC_PERF_ESS=0; static u32 ATUC_PERF_INITS=0; static u32 ATUR_PERF_LOFS=0; static u32 ATUR_PERF_LOSS=0; static u32 ATUR_PERF_LPR=0; static u32 ATUR_PERF_ESS=0; static u32 ATUR_CHAN_RECV_BLK=0; static u32 ATUR_CHAN_TX_BLK=0; static u32 ATUR_CHAN_CORR_BLK=0; static u32 ATUR_CHAN_UNCORR_BLK=0; //RFC-3440 static u32 ATUC_PERF_STAT_FASTR=0; static u32 ATUC_PERF_STAT_FAILED_FASTR=0; static u32 ATUC_PERF_STAT_SESL=0; static u32 ATUC_PERF_STAT_UASL=0; static u32 ATUR_PERF_STAT_SESL=0; static u32 ATUR_PERF_STAT_UASL=0; static adslChanPrevTxRate PrevTxRate={0,0}; static adslPhysCurrStatus CurrStatus={0,0}; static ChanType chantype={0,0}; static adslLineAlarmConfProfileEntry AlarmConfProfile={"No Name\0",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}; // 603221:tc.chen start static adslFarEndPerfStats FarendStatsData; struct timeval FarendData_acquire_time={0}; static u32 adsl_mode,adsl_mode_extend; // adsl mode : adsl/ 2/ 2+ static adslInitStats AdslInitStatsData; //603221:tc.chen end static u32 loop_diagnostics_mode=0; static wait_queue_head_t wait_queue_loop_diagnostic; #ifdef AMAZON_MEI_MIB_RFC3440 static adslLineAlarmConfProfileExtEntry AlarmConfProfileExt={"No Name\0",0,0,0,0,0,0}; #endif static int showtime=0; static int loop_diagnostics_completed=0; ////////////////////////////////////////////////////////////////////////////////// static int phy_mei_net_init(struct net_device * dev); static int interleave_mei_net_init(struct net_device * dev); static int fast_mei_net_init(struct net_device * dev); static struct net_device_stats * phy_mei_net_get_stats(struct net_device * dev); static struct net_device_stats * interleave_mei_net_get_stats(struct net_device * dev); static struct net_device_stats * fast_mei_net_get_stats(struct net_device * dev); typedef struct mei_priv{ struct net_device_stats stats; }mei_priv; static struct net_device phy_mei_net = { init: phy_mei_net_init, name: "MEI_PHY"}; static struct net_device interleave_mei_net = { init: interleave_mei_net_init, name: "MEI_INTL"}; static struct net_device fast_mei_net = { init: fast_mei_net_init, name: "MEI_FAST"}; /////////////////////////////////////////////////////////////////////////////////// static int major=AMAZON_MEI_MAJOR; static struct semaphore mei_sema; // Mei to ARC CMV count, reply count, ARC Indicator count static int indicator_count=0; static int cmv_count=0; static int reply_count=0; static u16 Recent_indicator[MSG_LENGTH]; // Used in interrupt handler as flags static int arcmsgav=0; static int cmv_reply=0; static int cmv_waiting=0; #define PROC_ITEMS 8 long mei_debug_mode = 0; //509221:tc.chen for adsl firmware debug // to wait for arc cmv reply, sleep on wait_queue_arcmsgav; static wait_queue_head_t wait_queue_arcmsgav; static wait_queue_head_t wait_queue_codeswap; static wait_queue_head_t wait_queue_mibdaemon; static wait_queue_head_t wait_queue_reboot; static u32 * image_buffer=NULL; // holding adsl firmware image static u16 RxMessage[MSG_LENGTH]__attribute__ ((aligned(4))); static u16 TxMessage[MSG_LENGTH]__attribute__ ((aligned(4))); static u32 * mei_arc_swap_buff=NULL; // holding swap pages static ARC_IMG_HDR * img_hdr; static int reboot_flag; #ifdef DFE_LOOPBACK #include "arc_pm.h" #endif ///////////////// net device /////////////////////////////////////////////////// static int phy_mei_net_init(struct net_device * dev) { //ether_setup(dev); dev->get_stats = phy_mei_net_get_stats; dev->ip_ptr = NULL; dev->type = 94; // dev->mtu=12345; dev->flags=IFF_UP; dev->priv = kmalloc(sizeof(struct mei_priv), GFP_KERNEL); if(dev->priv == NULL) return -ENOMEM; memset(dev->priv, 0, sizeof(struct mei_priv)); return 0; } static int interleave_mei_net_init(struct net_device * dev) { //ether_setup(dev); dev->get_stats = interleave_mei_net_get_stats; dev->ip_ptr = NULL; dev->type = 124; dev->flags=IFF_UP; dev->priv = kmalloc(sizeof(struct mei_priv), GFP_KERNEL); if(dev->priv == NULL) return -ENOMEM; memset(dev->priv, 0, sizeof(struct mei_priv)); return 0; } static int fast_mei_net_init(struct net_device * dev) { //ether_setup(dev); dev->get_stats = fast_mei_net_get_stats; dev->ip_ptr = NULL; dev->type = 125; dev->flags=IFF_UP; dev->priv = kmalloc(sizeof(struct mei_priv), GFP_KERNEL); if(dev->priv == NULL) return -ENOMEM; memset(dev->priv, 0, sizeof(struct mei_priv)); return 0; } static struct net_device_stats * phy_mei_net_get_stats(struct net_device * dev) { struct mei_priv * priv; priv = (struct mei_priv *)dev->priv; // update statistics (priv->stats).rx_packets = ATUR_CHAN_RECV_BLK; (priv->stats).tx_packets = ATUR_CHAN_TX_BLK; (priv->stats).rx_errors = ATUR_CHAN_CORR_BLK + ATUR_CHAN_UNCORR_BLK; (priv->stats).rx_dropped = ATUR_CHAN_UNCORR_BLK; return &(priv->stats); } static struct net_device_stats * interleave_mei_net_get_stats(struct net_device * dev) { struct mei_priv * priv; priv = (struct mei_priv *)dev->priv; // update statistics (priv->stats).rx_packets = ATUR_CHAN_RECV_BLK; (priv->stats).tx_packets = ATUR_CHAN_TX_BLK; (priv->stats).rx_errors = ATUR_CHAN_CORR_BLK + ATUR_CHAN_UNCORR_BLK; (priv->stats).rx_dropped = ATUR_CHAN_UNCORR_BLK; return &(priv->stats); } static struct net_device_stats * fast_mei_net_get_stats(struct net_device * dev) { struct mei_priv * priv; priv = (struct mei_priv *)dev->priv; // update statistics (priv->stats).rx_packets = ATUR_CHAN_RECV_BLK; (priv->stats).tx_packets = ATUR_CHAN_TX_BLK; (priv->stats).rx_errors = ATUR_CHAN_CORR_BLK + ATUR_CHAN_UNCORR_BLK; (priv->stats).rx_dropped = ATUR_CHAN_UNCORR_BLK; return &(priv->stats); } ///////////////// mei access Rd/Wr methods /////////////////////////////////////////////////// void meiLongwordWrite(u32 ul_address, u32 ul_data) { *((volatile u32 *)ul_address) = ul_data; asm("SYNC"); return; } // end of "meiLongwordWrite(..." void meiLongwordRead(u32 ul_address, u32 *pul_data) { *pul_data = *((volatile u32 *)ul_address); asm("SYNC"); return; } // end of "meiLongwordRead(..." MEI_ERROR meiDMAWrite(u32 destaddr, u32 *databuff, u32 databuffsize) { u32 *p = databuff; u32 temp; u32 flags; if( destaddr & 3) return MEI_FAILURE; #ifdef AMAZON_DMA_DEBUG_MUTEX save_flags(flags); cli(); #endif // Set the write transfer address meiLongwordWrite(MEI_XFR_ADDR, destaddr); // Write the data pushed across DMA while (databuffsize--) { temp = *p; if(databuff==(u32 *)TxMessage) // swap half word temp = ((temp & 0xffff)<<16) + ((temp & 0xffff0000)>>16); meiLongwordWrite(MEI_DATA_XFR, temp); p++; } // end of "while(..." #ifdef AMAZON_DMA_DEBUG_MUTEX restore_flags(flags); #endif return MEI_SUCCESS; } // end of "meiDMAWrite(..." MEI_ERROR meiDMAWrite_16(u32 destaddr, u32 *databuff, u32 databuffsize) { u32 *p = databuff; u32 temp; u32 flags; if( destaddr & 3) return MEI_FAILURE; #ifdef AMAZON_DMA_DEBUG_MUTEX save_flags(flags); cli(); #endif // Set the write transfer address meiLongwordWrite(MEI_XFR_ADDR, destaddr); // Write the data pushed across DMA while (databuffsize--) { temp = *p; temp = ((temp & 0xffff)<<16) + ((temp & 0xffff0000)>>16);//swap half word meiLongwordWrite(MEI_DATA_XFR, temp); p++; } // end of "while(..." #ifdef AMAZON_DMA_DEBUG_MUTEX restore_flags(flags); #endif return MEI_SUCCESS; } // end of "meiDMAWrite_16(..." MEI_ERROR meiDMAWrite_8(u32 destaddr, u32 *databuff, u32 databuffsize) { u32 *p = databuff; u32 temp; u32 flags; if( destaddr & 3) return MEI_FAILURE; #ifdef AMAZON_DMA_DEBUG_MUTEX save_flags(flags); cli(); #endif // Set the write transfer address meiLongwordWrite(MEI_XFR_ADDR, destaddr); // Write the data pushed across DMA while (databuffsize--) { temp = *p; temp = ((temp & 0xff)<<24) + ((temp & 0xff00)<<8)+ ((temp & 0xff0000)>>8)+ ((temp & 0xff000000)>>24);//swap byte meiLongwordWrite(MEI_DATA_XFR, temp); p++; } // end of "while(..." #ifdef AMAZON_DMA_DEBUG_MUTEX restore_flags(flags); #endif return MEI_SUCCESS; } // end of "meiDMAWrite_8(..." MEI_ERROR meiDMARead(u32 srcaddr, u32 *databuff, u32 databuffsize) { u32 *p = databuff; u32 temp; u32 flags; if( srcaddr & 3) return MEI_FAILURE; #ifdef AMAZON_DMA_DEBUG_MUTEX save_flags(flags); cli(); #endif // Set the read transfer address meiLongwordWrite(MEI_XFR_ADDR, srcaddr); // Read the data popped across DMA while (databuffsize--) { meiLongwordRead(MEI_DATA_XFR, &temp); if(databuff==(u32 *)RxMessage) // swap half word temp = ((temp & 0xffff)<<16) + ((temp & 0xffff0000)>>16); *p=temp; p++; } // end of "while(..." #ifdef AMAZON_DMA_DEBUG_MUTEX restore_flags(flags); #endif return MEI_SUCCESS; } // end of "meiDMARead(..." MEI_ERROR meiDMARead_16(u32 srcaddr, u32 *databuff, u32 databuffsize) { u32 *p = databuff; u32 temp; u32 flags; if( srcaddr & 3) return MEI_FAILURE; #ifdef AMAZON_DMA_DEBUG_MUTEX save_flags(flags); cli(); #endif // Set the read transfer address meiLongwordWrite(MEI_XFR_ADDR, srcaddr); // Read the data popped across DMA while (databuffsize--) { meiLongwordRead(MEI_DATA_XFR, &temp); temp = ((temp & 0xffff)<<16) + ((temp & 0xffff0000)>>16); *p=temp; p++; } // end of "while(..." #ifdef AMAZON_DMA_DEBUG_MUTEX restore_flags(flags); #endif return MEI_SUCCESS; } // end of "meiDMARead_16(..." MEI_ERROR meiDMARead_8(u32 srcaddr, u32 *databuff, u32 databuffsize) { u32 *p = databuff; u32 temp; u32 flags; if( srcaddr & 3) return MEI_FAILURE; #ifdef AMAZON_DMA_DEBUG_MUTEX save_flags(flags); cli(); #endif // Set the read transfer address meiLongwordWrite(MEI_XFR_ADDR, srcaddr); // Read the data popped across DMA while (databuffsize--) { meiLongwordRead(MEI_DATA_XFR, &temp); temp = ((temp & 0xff)<<24) + ((temp & 0xff00)<<8)+ ((temp & 0xff0000)>>8)+ ((temp & 0xff000000)>>24);//swap byte *p=temp; p++; } // end of "while(..." #ifdef AMAZON_DMA_DEBUG_MUTEX restore_flags(flags); #endif return MEI_SUCCESS; } // end of "meiDMARead_8(..." void meiPollForDbgDone(void) { u32 query = 0; int i=0; while (i>8)+ ((temp & 0xff000000)>>24);//swap byte meiLongwordWrite(MEI_DEBUG_DATA, temp); DEBUG_ACCESS_DELAY; meiPollForDbgDone(); address += 4; buffer++; } // end of "for(..." // Close the debug port after DMP memory write meiLongwordRead(MEI_CONTROL, &temp); DEBUG_ACCESS_DELAY; temp &= ~(HOST_MSTR); meiLongwordWrite(MEI_CONTROL, temp); DEBUG_ACCESS_DELAY; #ifdef AMAZON_DMA_DEBUG_MUTEX restore_flags(flags); #endif // Return return MEI_SUCCESS; } // end of "meiDebugWrite_8(..." MEI_ERROR meiDebugRead_8(u32 srcaddr, u32 *databuff, u32 databuffsize) { u32 i; u32 temp = 0x0; u32 address = 0x0; u32 *buffer = 0x0; u32 flags; #ifdef AMAZON_DMA_DEBUG_MUTEX save_flags(flags); cli(); #endif // Open the debug port before DMP memory read meiLongwordRead(MEI_CONTROL, &temp); DEBUG_ACCESS_DELAY; temp |= (HOST_MSTR); meiLongwordWrite(MEI_CONTROL, temp); DEBUG_ACCESS_DELAY; meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_DMP2_MASK); DEBUG_ACCESS_DELAY; // For the requested length, write the address and read the data address = srcaddr; buffer = databuff; for (i=0; i>8)+ ((temp & 0xff000000)>>24);//swap byte *buffer=temp; address += 4; buffer++; } // end of "for(..." // Close the debug port after DMP memory read meiLongwordRead(MEI_CONTROL, &temp); DEBUG_ACCESS_DELAY; temp &= ~(HOST_MSTR); meiLongwordWrite(MEI_CONTROL, temp); DEBUG_ACCESS_DELAY; #ifdef AMAZON_DMA_DEBUG_MUTEX restore_flags(flags); #endif // Return return MEI_SUCCESS; } // end of "meiDebugRead_8(..." MEI_ERROR meiDebugWrite_16(u32 destaddr, u32 *databuff, u32 databuffsize) { u32 i; u32 temp = 0x0; u32 address = 0x0; u32 *buffer = 0x0; u32 flags; #ifdef AMAZON_DMA_DEBUG_MUTEX save_flags(flags); cli(); #endif // Open the debug port before DMP memory write meiLongwordRead(MEI_CONTROL, &temp); DEBUG_ACCESS_DELAY; temp |= (HOST_MSTR); meiLongwordWrite(MEI_CONTROL, temp); DEBUG_ACCESS_DELAY; meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_DMP1_MASK); DEBUG_ACCESS_DELAY; // For the requested length, write the address and write the data address = destaddr; buffer = databuff; for (i=0; i < databuffsize; i++) { meiLongwordWrite(MEI_DEBUG_WAD, address); DEBUG_ACCESS_DELAY; temp=*buffer; temp = ((temp & 0xffff)<<16) + ((temp & 0xffff0000)>>16);//swap half word meiLongwordWrite(MEI_DEBUG_DATA, temp); DEBUG_ACCESS_DELAY; meiPollForDbgDone(); address += 4; buffer++; } // end of "for(..." // Close the debug port after DMP memory write meiLongwordRead(MEI_CONTROL, &temp); DEBUG_ACCESS_DELAY; temp &= ~(HOST_MSTR); meiLongwordWrite(MEI_CONTROL, temp); DEBUG_ACCESS_DELAY; #ifdef AMAZON_DMA_DEBUG_MUTEX restore_flags(flags); #endif // Return return MEI_SUCCESS; } // end of "meiDebugWrite_16(..." MEI_ERROR meiDebugRead_16(u32 srcaddr, u32 *databuff, u32 databuffsize) { u32 i; u32 temp = 0x0; u32 address = 0x0; u32 *buffer = 0x0; u32 flags; #ifdef AMAZON_DMA_DEBUG_MUTEX save_flags(flags); cli(); #endif // Open the debug port before DMP memory read meiLongwordRead(MEI_CONTROL, &temp); DEBUG_ACCESS_DELAY; temp |= (HOST_MSTR); meiLongwordWrite(MEI_CONTROL, temp); DEBUG_ACCESS_DELAY; meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_DMP2_MASK); DEBUG_ACCESS_DELAY; // For the requested length, write the address and read the data address = srcaddr; buffer = databuff; for (i=0; i>16);//swap half word *buffer=temp; address += 4; buffer++; } // end of "for(..." // Close the debug port after DMP memory read meiLongwordRead(MEI_CONTROL, &temp); DEBUG_ACCESS_DELAY; temp &= ~(HOST_MSTR); meiLongwordWrite(MEI_CONTROL, temp); DEBUG_ACCESS_DELAY; #ifdef AMAZON_DMA_DEBUG_MUTEX restore_flags(flags); #endif // Return return MEI_SUCCESS; } // end of "meiDebugRead_16(..." MEI_ERROR meiDebugWrite(u32 destaddr, u32 *databuff, u32 databuffsize) { u32 i; u32 temp = 0x0; u32 address = 0x0; u32 *buffer = 0x0; u32 flags; #ifdef AMAZON_DMA_DEBUG_MUTEX save_flags(flags); cli(); #endif // Open the debug port before DMP memory write meiLongwordRead(MEI_CONTROL, &temp); DEBUG_ACCESS_DELAY; temp |= (HOST_MSTR); meiLongwordWrite(MEI_CONTROL, temp); DEBUG_ACCESS_DELAY; meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_DMP1_MASK); DEBUG_ACCESS_DELAY; // For the requested length, write the address and write the data address = destaddr; buffer = databuff; for (i=0; i < databuffsize; i++) { meiLongwordWrite(MEI_DEBUG_WAD, address); DEBUG_ACCESS_DELAY; temp=*buffer; meiLongwordWrite(MEI_DEBUG_DATA, temp); DEBUG_ACCESS_DELAY; meiPollForDbgDone(); address += 4; buffer++; } // end of "for(..." // Close the debug port after DMP memory write meiLongwordRead(MEI_CONTROL, &temp); DEBUG_ACCESS_DELAY; temp &= ~(HOST_MSTR); meiLongwordWrite(MEI_CONTROL, temp); DEBUG_ACCESS_DELAY; #ifdef AMAZON_DMA_DEBUG_MUTEX restore_flags(flags); #endif // Return return MEI_SUCCESS; } // end of "meiDebugWrite(..." MEI_ERROR meiDebugRead(u32 srcaddr, u32 *databuff, u32 databuffsize) { u32 i; u32 temp = 0x0; u32 address = 0x0; u32 *buffer = 0x0; u32 flags; #ifdef AMAZON_DMA_DEBUG_MUTEX save_flags(flags); cli(); #endif // Open the debug port before DMP memory read meiLongwordRead(MEI_CONTROL, &temp); DEBUG_ACCESS_DELAY; temp |= (HOST_MSTR); meiLongwordWrite(MEI_CONTROL, temp); DEBUG_ACCESS_DELAY; meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_DMP2_MASK); DEBUG_ACCESS_DELAY; // For the requested length, write the address and read the data address = srcaddr; buffer = databuff; for (i=0; icount; boot_loop++) { if( img_hdr->page[boot_loop].p_size & BOOT_FLAG) { page_size = meiGetPage( boot_loop, GET_PROG, MAXSWAPSIZE, mei_arc_swap_buff, &dest_addr); if( page_size > 0) { meiDMAWrite(dest_addr, mei_arc_swap_buff, page_size); } } if( img_hdr->page[boot_loop].d_size & BOOT_FLAG) { page_size = meiGetPage( boot_loop, GET_DATA, MAXSWAPSIZE, mei_arc_swap_buff, &dest_addr); if( page_size > 0) { meiDMAWrite( dest_addr, mei_arc_swap_buff, page_size); } } } #ifdef AMAZON_MEI_DEBUG_ON // printk("\n\n pages downloaded"); #endif return MEI_SUCCESS; } // end of "meiDownloadBootCode(..." MEI_ERROR meiRunArc(void) { u32 arc_control_mode = 0x0; u32 arc_debug_addr = 0x0; u32 arc_debug_data = 0x0; // Switch arc control from JTAG mode to MEI mode- write '1' to bit0 meiLongwordRead(MEI_CONTROL, &arc_control_mode); arc_control_mode |= (HOST_MSTR); meiLongwordWrite(MEI_CONTROL, arc_control_mode); // Write arc aux reg access mask (0x0) into debug addr decode reg meiLongwordWrite(MEI_DEBUG_DEC, MEI_DEBUG_DEC_AUX_MASK); // Write arc status aux reg addr (0x0) into debug read addr reg meiLongwordWrite(MEI_DEBUG_RAD, arc_debug_addr); meiPollForDbgDone(); // Read debug data reg and save content meiLongwordRead(MEI_DEBUG_DATA, &arc_debug_data); // Write arc status aux reg addr (0x0) into debug write addr reg meiLongwordWrite(MEI_DEBUG_WAD, arc_debug_addr); // Write debug data reg with content ANDd with 0xFDFFFFFF (halt bit cleared) arc_debug_data &= ~(BIT25); meiLongwordWrite(MEI_DEBUG_DATA, arc_debug_data); meiPollForDbgDone(); // Switch arc control from MEI mode to JTAG mode- write '0' to bit0 meiLongwordRead(MEI_CONTROL, &arc_control_mode); arc_control_mode &= ~(HOST_MSTR); meiLongwordWrite(MEI_CONTROL, arc_control_mode); // Enable mask for arc codeswap interrupts meiMailboxInterruptsEnable(); // Return return MEI_SUCCESS; } // end of "meiActivate(..." int meiGetPage( u32 Page, u32 data, u32 MaxSize, u32 *Buffer, u32 *Dest) { u32 size; u32 i; u32 *p; if( Page > img_hdr->count) return -2; /* ** Get program or data size, depending on "data" flag */ size = (data == GET_DATA) ? img_hdr->page[ Page].d_size : img_hdr->page[ Page].p_size; size &= BOOT_FLAG_MASK; // Clear boot bit! if( size > MaxSize) return -1; if( size == 0) return 0; /* ** Get program or data offset, depending on "data" flag */ i = data ? img_hdr->page[ Page].d_offset : img_hdr->page[ Page].p_offset; /* ** Copy data/program to buffer */ i /= 4; // Adjust offset for byte-to-UINT for array operation p = (u32 *)img_hdr + i; for(i = 0; i < size; i++) Buffer[i] = *p++; /* ** Pass back data/program destination address */ *Dest = data ? img_hdr->page[Page].d_dest : img_hdr->page[Page].p_dest; return size; } MEI_ERROR meiCMV(u16 * request, int reply) // write cmv to arc, if reply needed, wait for reply { MEI_ERROR meierror; wait_queue_t wait; cmv_reply=reply; meierror = meiMailboxWrite(request, MSG_LENGTH); if(meierror != MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\n MailboxWrite Fail."); #endif return meierror; } else{ cmv_count++; } if(cmv_reply == NO_REPLY) return MEI_SUCCESS; init_waitqueue_entry(&wait, current); add_wait_queue(&wait_queue_arcmsgav, &wait); set_current_state(TASK_INTERRUPTIBLE); // cmv_waiting=1; if(arcmsgav==1){ set_current_state(TASK_RUNNING); remove_wait_queue(&wait_queue_arcmsgav, &wait); } else{ schedule_timeout(CMV_TIMEOUT); remove_wait_queue(&wait_queue_arcmsgav, &wait); } if(arcmsgav==0){//CMV_timeout cmv_waiting=0; arcmsgav=0; #ifdef AMAZON_MEI_DEBUG_ON printk("\nmeiCMV: MEI_MAILBOX_TIMEOUT\n"); #endif return MEI_MAILBOX_TIMEOUT; } else{ arcmsgav=0; reply_count++; return MEI_SUCCESS; } } //TODO, for loopback test #ifdef DFE_LOOPBACK #define mte_reg_base (0x4800*4+0x20000) /* Iridia Registers Address Constants */ #define MTE_Reg(r) (int)(mte_reg_base + (r*4)) #define IT_AMODE MTE_Reg(0x0004) #define OMBOX_BASE 0x15F80 #define IMBOX_BASE 0x15FC0 #define TIMER_DELAY (1024) #define BC0_BYTES (32) #define BC1_BYTES (30) #define NUM_MB (12) #define TIMEOUT_VALUE 2000 void BFMWait (u32 cycle) { u32 i; for (i = 0 ; i< cycle ; i++); } void WriteRegLong(u32 addr, u32 data){ //printk("[%8x] <= %8x \n\n", addr, data); *((volatile u32 *)(addr)) = data; } u32 ReadRegLong (u32 addr) { u32 rd_val; rd_val = *((volatile u32 *)(addr)); //printk("[%8x] => %8x \n\n", addr, rd_val); return rd_val; } /* This routine writes the mailbox with the data in an input array */ void WriteMbox(u32 *mboxarray,u32 size) { u32 i; WriteRegLong(MEI_XFR_ADDR,IMBOX_BASE); for (i=0;if_dentry->d_inode)->i_ino; char outputbuf[64]; int count=0; int i; u32 version=0; reg_entry_t* current_reg=NULL; for (i=0;iflag == (int *) 8){ ///proc/mei/version //format: //Firmware version: major.minor.sub_version.int_version.rel_state.spl_appl //Firmware Date Time Code: date/month min:hour if (*ppos>0) /* Assume reading completed in previous read*/ return 0; // indicates end of file if(down_interruptible(&mei_sema)) return -ERESTARTSYS; //if (indicator_count != 1){ if (indicator_count < 1){ up(&mei_sema); return -EAGAIN; } //major:bits 0-7 //minor:bits 8-15 makeCMV(H2D_CMV_READ, INFO, 54, 0, 1, NULL); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #if 0 #ifdef AMAZON_MEI_DEBUG_ON printk("\n\n WINHOST CMV fail"); #endif #endif up(&mei_sema); return -EIO; } version = RxMessage[4]; count = sprintf(outputbuf, "%d.%d.",(version)&0xff,(version>>8)&0xff); //sub_version:bits 4-7 //int_version:bits 0-3 //spl_appl:bits 8-13 //rel_state:bits 14-15 makeCMV(H2D_CMV_READ, INFO, 54, 1, 1, NULL); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #if 0 #ifdef AMAZON_MEI_DEBUG_ON printk("\n\n WINHOST CMV fail"); #endif #endif up(&mei_sema); return -EFAULT; } version =RxMessage[4]; count += sprintf(outputbuf+count, "%d.%d.%d.%d", (version>>4)&0xf, version&0xf, (version>>14)&0x3, (version>>8)&0x3f); #ifdef ADSL_LED_SUPPORT // version check -start for adsl led if ((((version>>4)&0xf)==2)&&((version&0xf)>=3)&&((version&0xf)<7)) firmware_support_led=1; else if ((((version>>4)&0xf)==2)&&((version&0xf)>=7)) firmware_support_led=2; else if (((version>>4)&0xf)>2) firmware_support_led=2; //165001:henryhsu:20050906:Modify for adsl firmware version 1.2.1.2.0.1 DATA_LED can't flash. //else firmware_support_led=0; else firmware_support_led=2; //165001 // version check -end #endif //Date:bits 0-7 //Month:bits 8-15 makeCMV(H2D_CMV_READ, INFO, 55, 0, 1, NULL); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #if 0 #ifdef AMAZON_MEI_DEBUG_ON printk("\n\n WINHOST CMV fail"); #endif #endif up(&mei_sema); return -EIO; } version = RxMessage[4]; //Hour:bits 0-7 //Minute:bits 8-15 makeCMV(H2D_CMV_READ, INFO, 55, 1, 1, NULL); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #if 0 #ifdef AMAZON_MEI_DEBUG_ON printk("\n\n WINHOST CMV fail"); #endif #endif up(&mei_sema); return -EFAULT; } version += (RxMessage[4]<<16); count += sprintf(outputbuf+count, " %d/%d %d:%d\n" ,version&0xff ,(version>>8)&0xff ,(version>>25)&0xff ,(version>>16)&0xff); up(&mei_sema); *ppos+=count; }else if(current_reg->flag != (int *)Recent_indicator){ if (*ppos>0) /* Assume reading completed in previous read*/ return 0; // indicates end of file count = sprintf(outputbuf, "0x%08X\n\n", *(current_reg->flag)); *ppos+=count; if (count>nbytes) /* Assume output can be read at one time */ return -EINVAL; }else{ if((int)(*ppos)/((int)7)==16) return 0; // indicate end of the message count = sprintf(outputbuf, "0x%04X\n\n", *(((u16 *)(current_reg->flag))+ (int)(*ppos)/((int)7))); *ppos+=count; } if (copy_to_user(buf, outputbuf, count)) return -EFAULT; return count; } static ssize_t proc_write(struct file * file, const char * buffer, size_t count, loff_t *ppos) { int i_ino = (file->f_dentry->d_inode)->i_ino; reg_entry_t* current_reg=NULL; int i; unsigned long newRegValue; char *endp; for (i=0;iflag == (int *)Recent_indicator)) return -EINVAL; newRegValue = simple_strtoul(buffer,&endp,0); *(current_reg->flag)=(int)newRegValue; return (count+endp-buffer); } ////////////////makeCMV(Opcode, Group, Address, Index, Size, Data), CMV in u16 TxMessage[MSG_LENGTH]/////////////////////////// void makeCMV(u8 opcode, u8 group, u16 address, u16 index, int size, u16 * data) { memset(TxMessage, 0, MSG_LENGTH*2); TxMessage[0]= (opcode<<4) + (size&0xf); TxMessage[1]= (((index==0)?0:1)<<7) + (group&0x7f); TxMessage[2]= address; TxMessage[3]= index; if(opcode == H2D_CMV_WRITE) memcpy(TxMessage+4, data, size*2); return; } ////////////////makeCMV(Opcode, Group, Address, Index, Size, Data), CMV in u16 TxMessage[MSG_LENGTH]/////////////////////////// void makeCMV_local(u8 opcode, u8 group, u16 address, u16 index, int size, u16 * data,u16 *CMVMSG) { memset(CMVMSG, 0, MSG_LENGTH*2); CMVMSG[0]= (opcode<<4) + (size&0xf); CMVMSG[1]= (((index==0)?0:1)<<7) + (group&0x7f); CMVMSG[2]= address; CMVMSG[3]= index; if(opcode == H2D_CMV_WRITE) memcpy(CMVMSG+4, data, size*2); return; } //////////////// Driver Structure ///////////////////////////////////////////////////////////////////////////// static ssize_t mei_write(struct file *, const char *, size_t, loff_t *); static int mei_ioctl(struct inode *, struct file *, unsigned int, unsigned long); static struct file_operations mei_operations = { write: mei_write, ioctl: mei_ioctl, }; static ssize_t mei_write(struct file * filp, const char * buf, size_t size, loff_t * loff) { // printk("\n\n mei_write entered"); // image_buffer = (u32 *)kmalloc(size, GFP_KERNEL); image_buffer = (u32 *)vmalloc(size); // printk("\n\n image_buffer kmalloc done"); if(image_buffer == NULL){ #ifdef AMAZON_MEI_DEBUG_ON // printk("\n\n kmalloc for firmware image fail"); printk("\n\n vmalloc for firmware image fail"); #endif return -1; } copy_from_user((char *)image_buffer, buf, size); // printk("\n\n copy_from_user done"); return size; } ////////// ISR GPTU Timer 6 for high resolution timer ///////////// void amazon_timer6_interrupt_MEI(int irq, void *dev_id, struct pt_regs *regs) { int i,j; u32 temp; u16 temp16; u16 rdindex, wrindex; u16 num_rd=0; //num of byte can be read u16 bytes_to_wr=0; // printk("\n\nenter timer\n\n"); irqtimes++; // printk("\n%d\n",irqtimes); /* #ifdef PCM_ACCESS_DEBUG meiDebugRead_8(0x30f20, &temp, 1); #else meiDMARead_8(0x30f20, &temp, 1); #endif if((temp&0x4000)!=0){ printk("\nER_ERR"); #ifdef PCM_ACCESS_DEBUG meiDebugWrite_8(0x30f20, &temp, 1); #else meiDMAWrite_8(0x30f20, &temp, 1); #endif #ifdef PCM_ACCESS_DEBUG meiDebugRead_8(0x30f20, &temp, 1); #else meiDMARead_8(0x30f20, &temp, 1); #endif if((temp&0x4000)!=0) printk("\nER_ERR not cleared"); } */ for(i=PCM_CHANNEL_NUM-1;i>=0;i--){// start from last channel, which is rx #ifdef PCM_ACCESS_DEBUG meiDebugRead_16(pcm_start_addr+i*16+12, &temp, 1); #else meiDMARead_16(pcm_start_addr+i*16+12, &temp, 1); #endif wrindex = (u16)((temp & 0xffff0000)>>16); // printk(" %d",wrindex); #ifdef PCM_ACCESS_DEBUG meiDebugRead_16(pcm_start_addr+i*16+8, &temp, 1); #else meiDMARead_16(pcm_start_addr+i*16+8, &temp, 1); #endif rdindex = (u16)(temp & 0xffff); // printk(" %d",rdindex); if(rdindex<=wrindex) num_rd=((wrindex-rdindex)/4)*4; //read multiply of 4 bytes else num_rd=((pcm_data[i].len-(rdindex-wrindex))/4)*4; //read multiply of 4 bytes if(i%2!=0){//rx channel pcm_data[i].point=0; for(j=0;j=pcm_data[i].len) temp16=(rdindex+j*4) - pcm_data[i].len; else temp16=rdindex+j*4; #ifdef PCM_ACCESS_DEBUG meiDebugRead_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16))+temp16, (u32*)(pcm_data[i].buff+pcm_data[i].point), 1); #else meiDMARead_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16))+temp16, (u32*)(pcm_data[i].buff+pcm_data[i].point), 1); #endif // printk(" %8x", *((u32*)(pcm_data[i].buff+pcm_data[i].point))); /* if(pcm_data[i].point==0){ if(pcm_data[i].buff[0]==0xA5){// start of loopback data pcm_data[i].point+=4; printk("\nstart receive data"); } } else*/ pcm_data[i].point+=4; /* if(pcm_data[i].point==PCM_BUFF_SIZE){ //finish rx pcm_data[i].finish=1; printk("\nchannel[%d] finished", i); } */ } } if(firsttime[i]==1){ for(j=0;j=256) pcm_start_loc[i]=pcm_start_loc[i]-256; } } rdindex +=num_rd; if(rdindex>=pcm_data[i].len) rdindex=rdindex-pcm_data[i].len; #ifdef PCM_ACCESS_DEBUG meiDebugRead_16(pcm_start_addr+i*16+8, &temp, 1); #else meiDMARead_16(pcm_start_addr+i*16+8, &temp, 1); #endif temp= (temp & 0xffff0000) + rdindex; #ifdef PCM_ACCESS_DEBUG meiDebugWrite_16(pcm_start_addr+i*16+8, &temp, 1); // update rdindex #else meiDMAWrite_16(pcm_start_addr+i*16+8, &temp, 1); // update rdindex #endif bytes_to_wr = num_rd; // if(bytes_to_wr>0){ // printk(" %d", num_rd); // printk(" %d", rdindex); // printk("\n\nrdindex = %d", rdindex); //} } else{ //tx channel // if((bytes_to_wr + num_rd) < pcm_data[i].len){ for(j=0;j=pcm_data[i].len) temp16=(wrindex+j*4) - pcm_data[i].len; else temp16=wrindex + j*4; /* #ifdef PCM_ACCESS_DEBUG meiDebugWrite_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16))+temp16,(u32*)(pcm_data[i+1].buff+j*4), 1); #else meiDMAWrite_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16))+temp16,(u32*)(pcm_data[i+1].buff+j*4), 1); #endif*/ #ifdef PCM_ACCESS_DEBUG meiDebugWrite_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16))+temp16,(u32*)(pcm_data[i].buff+pcm_data[i].point), 1); // meiDebugWrite_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16))+temp16,(u32*)(pcm_data[i].buff), 1); #else meiDMAWrite_8((((u32)(pcm_data[i].LSW))+(((u32)(pcm_data[i].MSW))<<16))+temp16,(u32*)(pcm_data[i].buff+pcm_data[i].point), 1); #endif pcm_data[i].point+=4; if(pcm_data[i].point==PCM_BUFF_SIZE){ // pcm_data[i].finish=1; // printk("\nchannel[%d] finished", i); pcm_data[i].point=0; } } } wrindex+=bytes_to_wr; if(wrindex>=pcm_data[i].len) wrindex=wrindex-pcm_data[i].len; #ifdef PCM_ACCESS_DEBUG meiDebugRead_16(pcm_start_addr+i*16+12, &temp, 1); #else meiDMARead_16(pcm_start_addr+i*16+12, &temp, 1); #endif temp=(temp&0xffff) + (wrindex<<16); #ifdef PCM_ACCESS_DEBUG meiDebugWrite_16(pcm_start_addr+i*16+12, &temp, 1); // update wrindex #else meiDMAWrite_16(pcm_start_addr+i*16+12, &temp, 1); // update wrindex #endif //if(bytes_to_wr>0){ // printk(" %d", bytes_to_wr); // printk(" %d", wrindex); // printk("\n\nwrindex = %d", wrindex); //} // } } } return; } //000002:fchang Start static int meiResetArc(void) { u32 auxreg0; u32 auxreg5; int flshcnt=0; int flshcnt1=0; int flshcnt2=0; meiLongwordWrite(MEI_CONTROL, 1); meiLongwordWrite(MEI_DEBUG_DEC, 3); meiLongwordWrite(MEI_DEBUG_WAD, 0x3c); meiLongwordWrite(MEI_DEBUG_DATA, 0x10); meiPollForDbgDone(); meiLongwordWrite(MEI_DEBUG_DEC, 0x0); meiLongwordWrite(MEI_DEBUG_WAD, 0x2); meiLongwordWrite(MEI_DEBUG_DATA, 0x0); meiPollForDbgDone(); meiLongwordWrite(MEI_DEBUG_WAD, 0x3); meiLongwordWrite(MEI_DEBUG_DATA, 0x0); meiPollForDbgDone(); meiLongwordWrite(MEI_DEBUG_DEC, 0x0); meiLongwordWrite(MEI_DEBUG_RAD, 0x0); meiPollForDbgDone(); meiLongwordRead(MEI_DEBUG_DATA, &auxreg0); auxreg0 = auxreg0 & 0x03ffffff; meiLongwordWrite(MEI_DEBUG_WAD, 0x0); meiLongwordWrite(MEI_DEBUG_DATA, auxreg0); meiPollForDbgDone(); meiLongwordWrite(MEI_DEBUG_WAD, 0x10a); meiLongwordWrite(MEI_DEBUG_DATA, 0x0); meiPollForDbgDone(); meiLongwordWrite(MEI_DEBUG_DEC, 0x2); meiLongwordWrite(MEI_DEBUG_WAD, 0xfffc); meiLongwordWrite(MEI_DEBUG_DATA, 0x1fffffff); meiPollForDbgDone(); while(flshcnt<3){ meiLongwordWrite(MEI_DEBUG_DEC, 0x0); meiLongwordWrite(MEI_DEBUG_RAD, 0x0); meiPollForDbgDone(); meiLongwordRead(MEI_DEBUG_DATA, &auxreg0); auxreg0 = auxreg0 & 0xff000000; auxreg0 = auxreg0 | 0x3fff; meiLongwordWrite(MEI_DEBUG_WAD, 0x0); meiLongwordWrite(MEI_DEBUG_DATA, auxreg0); meiPollForDbgDone(); meiLongwordWrite(MEI_DEBUG_DEC, 0x0); meiLongwordWrite(MEI_DEBUG_RAD, 0x5); meiPollForDbgDone(); meiLongwordRead(MEI_DEBUG_DATA, &auxreg5); auxreg5 = auxreg5 | 0x801; meiLongwordWrite(MEI_DEBUG_WAD, 0x5); meiLongwordWrite(MEI_DEBUG_DATA, auxreg5); meiPollForDbgDone(); meiLongwordWrite(MEI_DEBUG_RAD, 0x0); meiPollForDbgDone(); meiLongwordRead(MEI_DEBUG_DATA, &auxreg0); auxreg0 = auxreg0 & 0x00ffffff; if(auxreg0 == 0x4000) flshcnt = flshcnt+1; else{ if(flshcnt == 0) flshcnt1 = flshcnt1 +1; else flshcnt2 = flshcnt2 +1; } } return 1; } static int meiResetCore(void) { meiLongwordWrite(MEI_CONTROL, 0x1); meiLongwordWrite(MEI_DEBUG_DEC, 0x2); meiLongwordWrite(MEI_DEBUG_WAD, 0x31f10); meiLongwordWrite(MEI_DEBUG_DATA, 0xf); meiPollForDbgDone(); meiLongwordWrite(MEI_DEBUG_WAD, 0x31f10); meiLongwordWrite(MEI_DEBUG_DATA, 0x0); meiPollForDbgDone(); meiLongwordWrite(MEI_DEBUG_WAD, 0x31f00); meiLongwordWrite(MEI_DEBUG_DATA, 0x55); meiPollForDbgDone(); return 1; } static int meiEnalbeMailboxInt(void) { u32 arc2meiintmsk; meiLongwordRead(ARC_TO_MEI_INT_MASK, &arc2meiintmsk); arc2meiintmsk = arc2meiintmsk | 0x1; meiLongwordWrite(ARC_TO_MEI_INT_MASK, arc2meiintmsk); meiLongwordWrite(MEI_CONTROL, 0x0); return 1; } //000002:fchang End static int mei_ioctl(struct inode * ino, struct file * fil, unsigned int command, unsigned long lon) { int i,k; u32 boot_loop; u32 page_size; u32 dest_addr; u32 j; u32 temp; u32 temp2; u16 trapsflag=0; amazon_clreoc_pkt * current_clreoc; struct timeval time_now; struct timeval time_fini; struct list_head * ptr; amazon_mei_mib * mib_ptr; // u16 buff[MSG_LENGTH]__attribute__ ((aligned(4))); structpts pts; int meierr=MEI_SUCCESS; u16 data[12]; //used in makeCMV, to pass in payload when CMV set, ignored when CMV read. meireg regrdwr; meidebug debugrdwr; amazon_mei_mib * temp_intvl; struct sk_buff * eoc_skb; // 603221:tc.chen start u16 hdlc_cmd[2]; u16 hdlc_rx_buffer[32]; int hdlc_rx_len=0; // 603221:tc.chen end int from_kernel = 0;//joelin if (ino == (struct inode *)0) from_kernel = 1;//joelin // printk("\n switch.command = %i\n", command); switch(command){ case GET_ADSL_LINE_CODE: pts.adslLineTableEntry_pt = (adslLineTableEntry *)kmalloc(sizeof(adslLineTableEntry), GFP_KERNEL); copy_from_user((char *)pts.adslLineTableEntry_pt, (char *)lon, sizeof(adslLineTableEntry)); if(IS_FLAG_SET((&(pts.adslLineTableEntry_pt->flags)), LINE_CODE_FLAG)){ pts.adslLineTableEntry_pt->adslLineCode = 2; } copy_to_user((char *)lon, (char *)pts.adslLineTableEntry_pt, sizeof(adslLineTableEntry)); kfree(pts.adslLineTableEntry_pt); break; #ifdef AMAZON_MEI_MIB_RFC3440 case GET_ADSL_ATUC_LINE_EXT: if(down_interruptible(&mei_sema)) return -ERESTARTSYS; pts.adslLineExtTableEntry_pt = (adslLineExtTableEntry *)kmalloc(sizeof(adslLineExtTableEntry), GFP_KERNEL); copy_from_user((char *)pts.adslLineExtTableEntry_pt, (char *)lon, sizeof(adslLineExtTableEntry)); if(IS_FLAG_SET((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_CAP_FLAG)){ ATUC_LINE_TRANS_CAP_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 67 Index 0"); #endif CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_CAP_FLAG); } else{ memcpy((&(pts.adslLineExtTableEntry_pt->adslLineTransAtucCap)), RxMessage+4, ((RxMessage[0]&0xf)*2)); } } if(IS_FLAG_SET((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_CONFIG_FLAG)){ ATUC_LINE_TRANS_CONFIG_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 67 Index 0"); #endif CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_CONFIG_FLAG); } else{ memcpy((&(pts.adslLineExtTableEntry_pt->adslLineTransAtucConfig)), RxMessage+4, ((RxMessage[0]&0xf)*2)); } } if(IS_FLAG_SET((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_ACTUAL_FLAG)){ ATUC_LINE_TRANS_ACTUAL_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 2 Address 1 Index 0"); #endif CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_ACTUAL_FLAG); } else{ memcpy((&(pts.adslLineExtTableEntry_pt->adslLineTransAtucActual)), RxMessage+4, ((RxMessage[0]&0xf)*2)); } } if(IS_FLAG_SET((&(pts.adslLineExtTableEntry_pt->flags)), LINE_GLITE_POWER_STATE_FLAG)){ // not supported currently /* LINE_GLITE_POWER_STATE_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 2 Address 0 Index 0"); #endif CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), LINE_GLITE_POWER_STATE_FLAG); } else{ memcpy((&(pts.adslLineExtTableEntry_pt->adslLineGlitePowerState)), RxMessage+4, ((RxMessage[0]&0xf)*2)); } */ CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), LINE_GLITE_POWER_STATE_FLAG); } copy_to_user((char *)lon, (char *)pts.adslLineExtTableEntry_pt, sizeof(adslLineExtTableEntry)); kfree(pts.adslLineTableEntry_pt); up(&mei_sema); break; #endif #ifdef AMAZON_MEI_MIB_RFC3440 case SET_ADSL_ATUC_LINE_EXT: if(down_interruptible(&mei_sema)) return -ERESTARTSYS; pts.adslLineExtTableEntry_pt = (adslLineExtTableEntry *)kmalloc(sizeof(adslLineExtTableEntry), GFP_KERNEL); copy_from_user((char *)pts.adslLineExtTableEntry_pt, (char *)lon, sizeof(adslLineExtTableEntry)); //only adslLineTransAtucConfig can be set. CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_CAP_FLAG); if(IS_FLAG_SET((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_CONFIG_FLAG)){ memcpy(data,(&(pts.adslLineExtTableEntry_pt->adslLineTransAtucConfig)), 2); ATUC_LINE_TRANS_CONFIG_FLAG_MAKECMV_WR; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 67 Index 0"); #endif CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_CONFIG_FLAG); } } CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), ATUC_LINE_TRANS_ACTUAL_FLAG); CLR_FLAG((&(pts.adslLineExtTableEntry_pt->flags)), LINE_GLITE_POWER_STATE_FLAG); copy_to_user((char *)lon, (char *)pts.adslLineExtTableEntry_pt, sizeof(adslLineExtTableEntry)); kfree(pts.adslLineTableEntry_pt); up(&mei_sema); break; #endif case GET_ADSL_ATUC_PHY: if(down_interruptible(&mei_sema)) return -ERESTARTSYS; pts.adslAtucPhysEntry_pt = (adslAtucPhysEntry *)kmalloc(sizeof(adslAtucPhysEntry), GFP_KERNEL); copy_from_user((char *)pts.adslAtucPhysEntry_pt, (char *)lon, sizeof(adslAtucPhysEntry)); if(IS_FLAG_SET((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_PHY_SER_NUM_FLAG)){ ATUC_PHY_SER_NUM_FLAG_MAKECMV1; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 57 Index 0"); #endif CLR_FLAG((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_PHY_SER_NUM_FLAG); } else{ memcpy(pts.adslAtucPhysEntry_pt->serial_no, RxMessage+4, ((RxMessage[0]&0xf)*2)); } ATUC_PHY_SER_NUM_FLAG_MAKECMV2; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 57 Index 12"); #endif CLR_FLAG((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_PHY_SER_NUM_FLAG); } else{ memcpy((pts.adslAtucPhysEntry_pt->serial_no+24), RxMessage+4, ((RxMessage[0]&0xf)*2)); } } if(IS_FLAG_SET((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_PHY_VENDOR_ID_FLAG)){ ATUC_PHY_VENDOR_ID_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 64 Index 0"); #endif CLR_FLAG((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_PHY_VENDOR_ID_FLAG); } else{ memcpy(pts.adslAtucPhysEntry_pt->vendor_id.vendor_id, RxMessage+4, ((RxMessage[0]&0xf)*2)); } } if(IS_FLAG_SET((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_PHY_VER_NUM_FLAG)){ ATUC_PHY_VER_NUM_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 58 Index 0"); #endif CLR_FLAG((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_PHY_VER_NUM_FLAG); } else{ memcpy(pts.adslAtucPhysEntry_pt->version_no, RxMessage+4, ((RxMessage[0]&0xf)*2)); } } if(IS_FLAG_SET((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_CURR_STAT_FLAG)){ pts.adslAtucPhysEntry_pt->status = CurrStatus.adslAtucCurrStatus; } if(IS_FLAG_SET((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_CURR_OUT_PWR_FLAG)){ ATUC_CURR_OUT_PWR_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 68 Index 5"); #endif CLR_FLAG((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_CURR_OUT_PWR_FLAG); } else{ memcpy((&(pts.adslAtucPhysEntry_pt->outputPwr)), RxMessage+4, ((RxMessage[0]&0xf)*2)); } } if(IS_FLAG_SET((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_CURR_ATTR_FLAG)){ ATUC_CURR_ATTR_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 69 Index 0"); #endif CLR_FLAG((&(pts.adslAtucPhysEntry_pt->flags)), ATUC_CURR_ATTR_FLAG); } else{ memcpy((&(pts.adslAtucPhysEntry_pt->attainableRate)), RxMessage+4, ((RxMessage[0]&0xf)*2)); } } copy_to_user((char *)lon, (char *)pts.adslAtucPhysEntry_pt, sizeof(adslAtucPhysEntry)); kfree(pts.adslAtucPhysEntry_pt); up(&mei_sema); break; case GET_ADSL_ATUR_PHY: if(down_interruptible(&mei_sema)) return -ERESTARTSYS; pts.adslAturPhysEntry_pt = (adslAturPhysEntry *)kmalloc(sizeof(adslAturPhysEntry), GFP_KERNEL); copy_from_user((char *)pts.adslAturPhysEntry_pt, (char *)lon, sizeof(adslAturPhysEntry)); if(IS_FLAG_SET((&(pts.adslAturPhysEntry_pt->flags)), ATUR_PHY_SER_NUM_FLAG)){ ATUR_PHY_SER_NUM_FLAG_MAKECMV1; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 62 Index 0"); #endif CLR_FLAG((&(pts.adslAturPhysEntry_pt->flags)), ATUR_PHY_SER_NUM_FLAG); } else{ memcpy(pts.adslAturPhysEntry_pt->serial_no, RxMessage+4, ((RxMessage[0]&0xf)*2)); } ATUR_PHY_SER_NUM_FLAG_MAKECMV2; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 62 Index 12"); #endif CLR_FLAG((&(pts.adslAturPhysEntry_pt->flags)), ATUR_PHY_SER_NUM_FLAG); } else{ memcpy((pts.adslAturPhysEntry_pt->serial_no+24), RxMessage+4, ((RxMessage[0]&0xf)*2)); } } if(IS_FLAG_SET((&(pts.adslAturPhysEntry_pt->flags)), ATUR_PHY_VENDOR_ID_FLAG)){ ATUR_PHY_VENDOR_ID_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 65 Index 0"); #endif CLR_FLAG((&(pts.adslAturPhysEntry_pt->flags)), ATUR_PHY_VENDOR_ID_FLAG); } else{ memcpy(pts.adslAturPhysEntry_pt->vendor_id.vendor_id, RxMessage+4, ((RxMessage[0]&0xf)*2)); } } if(IS_FLAG_SET((&(pts.adslAturPhysEntry_pt->flags)), ATUR_PHY_VER_NUM_FLAG)){ ATUR_PHY_VER_NUM_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 61 Index 0"); #endif CLR_FLAG((&(pts.adslAturPhysEntry_pt->flags)), ATUR_PHY_VER_NUM_FLAG); } else{ memcpy(pts.adslAturPhysEntry_pt->version_no, RxMessage+4, ((RxMessage[0]&0xf)*2)); } } if(IS_FLAG_SET((&(pts.adslAturPhysEntry_pt->flags)), ATUR_SNRMGN_FLAG)){ ATUR_SNRMGN_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 68 Index 4"); #endif CLR_FLAG((&(pts.adslAturPhysEntry_pt->flags)), ATUR_SNRMGN_FLAG); } else{ memcpy((&(pts.adslAturPhysEntry_pt->SnrMgn)), RxMessage+4, ((RxMessage[0]&0xf)*2)); } } if(IS_FLAG_SET((&(pts.adslAturPhysEntry_pt->flags)), ATUR_ATTN_FLAG)){ ATUR_ATTN_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 68 Index 2"); #endif CLR_FLAG((&(pts.adslAturPhysEntry_pt->flags)), ATUR_ATTN_FLAG); } else{ memcpy((&(pts.adslAturPhysEntry_pt->Attn)), RxMessage+4, ((RxMessage[0]&0xf)*2)); } } if(IS_FLAG_SET((&(pts.adslAturPhysEntry_pt->flags)), ATUR_CURR_STAT_FLAG)){ pts.adslAturPhysEntry_pt->status = CurrStatus.adslAturCurrStatus; } if(IS_FLAG_SET((&(pts.adslAturPhysEntry_pt->flags)), ATUR_CURR_OUT_PWR_FLAG)){ ATUR_CURR_OUT_PWR_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 69 Index 5"); #endif CLR_FLAG((&(pts.adslAturPhysEntry_pt->flags)), ATUR_CURR_OUT_PWR_FLAG); } else{ memcpy((&(pts.adslAturPhysEntry_pt->outputPwr)), RxMessage+4, ((RxMessage[0]&0xf)*2)); } } if(IS_FLAG_SET((&(pts.adslAturPhysEntry_pt->flags)), ATUR_CURR_ATTR_FLAG)){ ATUR_CURR_ATTR_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 68 Index 0"); #endif CLR_FLAG((&(pts.adslAturPhysEntry_pt->flags)), ATUR_CURR_ATTR_FLAG); } else{ memcpy((&(pts.adslAturPhysEntry_pt->attainableRate)), RxMessage+4, ((RxMessage[0]&0xf)*2)); } } copy_to_user((char *)lon, (char *)pts.adslAturPhysEntry_pt, sizeof(adslAturPhysEntry)); kfree(pts.adslAturPhysEntry_pt); up(&mei_sema); break; case GET_ADSL_ATUC_CHAN_INFO: if(down_interruptible(&mei_sema)) return -ERESTARTSYS; pts.adslAtucChanInfo_pt = (adslAtucChanInfo *)kmalloc(sizeof(adslAtucChanInfo), GFP_KERNEL); copy_from_user((char *)pts.adslAtucChanInfo_pt, (char *)lon, sizeof(adslAtucChanInfo)); if(IS_FLAG_SET((&(pts.adslAtucChanInfo_pt->flags)), ATUC_CHAN_INTLV_DELAY_FLAG)){ if((chantype.interleave!=1) || (chantype.fast==1)){ CLR_FLAG((&(pts.adslAtucChanInfo_pt->flags)), ATUC_CHAN_INTLV_DELAY_FLAG); } else{ ATUC_CHAN_INTLV_DELAY_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 6 Address 3 Index 1"); #endif CLR_FLAG((&(pts.adslAtucChanInfo_pt->flags)), ATUC_CHAN_INTLV_DELAY_FLAG); } else{ memcpy((&(pts.adslAtucChanInfo_pt->interleaveDelay)), RxMessage+4, ((RxMessage[0]&0xf)*2)); } } } if(IS_FLAG_SET((&(pts.adslAtucChanInfo_pt->flags)), ATUC_CHAN_CURR_TX_RATE_FLAG)){ ATUC_CHAN_CURR_TX_RATE_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 6 Address 1 Index 0"); #endif CLR_FLAG((&(pts.adslAtucChanInfo_pt->flags)), ATUC_CHAN_CURR_TX_RATE_FLAG); } else{ pts.adslAtucChanInfo_pt->currTxRate = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16); } } if(IS_FLAG_SET((&(pts.adslAtucChanInfo_pt->flags)), ATUC_CHAN_PREV_TX_RATE_FLAG)){ pts.adslAtucChanInfo_pt->prevTxRate = PrevTxRate.adslAtucChanPrevTxRate; } copy_to_user((char *)lon, (char *)pts.adslAtucChanInfo_pt, sizeof(adslAtucChanInfo)); kfree(pts.adslAtucChanInfo_pt); up(&mei_sema); break; case GET_ADSL_ATUR_CHAN_INFO: if(down_interruptible(&mei_sema)) return -ERESTARTSYS; pts.adslAturChanInfo_pt = (adslAturChanInfo *)kmalloc(sizeof(adslAturChanInfo), GFP_KERNEL); copy_from_user((char *)pts.adslAturChanInfo_pt, (char *)lon, sizeof(adslAturChanInfo)); if(IS_FLAG_SET((&(pts.adslAturChanInfo_pt->flags)), ATUR_CHAN_INTLV_DELAY_FLAG)){ if((chantype.interleave!=1) || (chantype.fast==1)){ CLR_FLAG((&(pts.adslAturChanInfo_pt->flags)), ATUR_CHAN_INTLV_DELAY_FLAG); } else{ ATUR_CHAN_INTLV_DELAY_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 6 Address 2 Index 1"); #endif CLR_FLAG((&(pts.adslAturChanInfo_pt->flags)), ATUR_CHAN_INTLV_DELAY_FLAG); } else{ memcpy((&(pts.adslAturChanInfo_pt->interleaveDelay)), RxMessage+4, ((RxMessage[0]&0xf)*2)); } } } if(IS_FLAG_SET((&(pts.adslAturChanInfo_pt->flags)), ATUR_CHAN_CURR_TX_RATE_FLAG)){ ATUR_CHAN_CURR_TX_RATE_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 6 Address 0 Index 0"); #endif CLR_FLAG((&(pts.adslAturChanInfo_pt->flags)), ATUR_CHAN_CURR_TX_RATE_FLAG); } else{ pts.adslAturChanInfo_pt->currTxRate = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16); } } if(IS_FLAG_SET((&(pts.adslAturChanInfo_pt->flags)), ATUR_CHAN_PREV_TX_RATE_FLAG)){ pts.adslAturChanInfo_pt->prevTxRate = PrevTxRate.adslAturChanPrevTxRate; } if(IS_FLAG_SET((&(pts.adslAturChanInfo_pt->flags)), ATUR_CHAN_CRC_BLK_LEN_FLAG)){ // ? no CMV to update this CLR_FLAG((&(pts.adslAturChanInfo_pt->flags)), ATUR_CHAN_CRC_BLK_LEN_FLAG); } copy_to_user((char *)lon, (char *)pts.adslAturChanInfo_pt, sizeof(adslAturChanInfo)); kfree(pts.adslAturChanInfo_pt); up(&mei_sema); break; case GET_ADSL_ATUC_PERF_DATA: pts.atucPerfDataEntry_pt = (atucPerfDataEntry *)kmalloc(sizeof(atucPerfDataEntry), GFP_KERNEL); copy_from_user((char *)pts.atucPerfDataEntry_pt, (char *)lon, sizeof(atucPerfDataEntry)); if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_LOFS_FLAG)){ pts.atucPerfDataEntry_pt->adslAtucPerfLofs=ATUC_PERF_LOFS; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_LOSS_FLAG)){ pts.atucPerfDataEntry_pt->adslAtucPerfLoss=ATUC_PERF_LOSS; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_ESS_FLAG)){ pts.atucPerfDataEntry_pt->adslAtucPerfESs=ATUC_PERF_ESS; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_INITS_FLAG)){ pts.atucPerfDataEntry_pt->adslAtucPerfInits=ATUC_PERF_INITS; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_VALID_INTVLS_FLAG)){ i=0; for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){ i++; if(i==96) break; } pts.atucPerfDataEntry_pt->adslAtucPerfValidIntervals=i; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_INVALID_INTVLS_FLAG)){ pts.atucPerfDataEntry_pt->adslAtucPerfInvalidIntervals=0; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_15MIN_TIME_ELAPSED_FLAG)){ do_gettimeofday(&time_now); pts.atucPerfDataEntry_pt->adslAtucPerfCurr15MinTimeElapsed=time_now.tv_sec - (current_intvl->start_time).tv_sec; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_15MIN_LOFS_FLAG)){ pts.atucPerfDataEntry_pt->adslAtucPerfCurr15MinLofs=current_intvl->AtucPerfLof; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_15MIN_LOSS_FLAG)){ pts.atucPerfDataEntry_pt->adslAtucPerfCurr15MinLoss=current_intvl->AtucPerfLos; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_15MIN_ESS_FLAG)){ pts.atucPerfDataEntry_pt->adslAtucPerfCurr15MinESs=current_intvl->AtucPerfEs; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_15MIN_INIT_FLAG)){ pts.atucPerfDataEntry_pt->adslAtucPerfCurr15MinInits=current_intvl->AtucPerfInit; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_1DAY_TIME_ELAPSED_FLAG)){ i=0; for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){ i+=900; } do_gettimeofday(&time_now); i+=time_now.tv_sec - (current_intvl->start_time).tv_sec; if(i>=86400) pts.atucPerfDataEntry_pt->adslAtucPerfCurr1DayTimeElapsed=i-86400; else pts.atucPerfDataEntry_pt->adslAtucPerfCurr1DayTimeElapsed=i; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_1DAY_LOFS_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AtucPerfLof; i++; if(i==96) j=0; } j+=current_intvl->AtucPerfLof; pts.atucPerfDataEntry_pt->adslAtucPerfCurr1DayLofs=j; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_1DAY_LOSS_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AtucPerfLos; i++; if(i==96) j=0; } j+=current_intvl->AtucPerfLos; pts.atucPerfDataEntry_pt->adslAtucPerfCurr1DayLoss=j; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_1DAY_ESS_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AtucPerfEs; i++; if(i==96) j=0; } j+=current_intvl->AtucPerfEs; pts.atucPerfDataEntry_pt->adslAtucPerfCurr1DayESs=j; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_CURR_1DAY_INIT_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AtucPerfInit; i++; if(i==96) j=0; } j+=current_intvl->AtucPerfInit; pts.atucPerfDataEntry_pt->adslAtucPerfCurr1DayInits=j; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_PREV_1DAY_MON_SEC_FLAG)){ i=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ i++; } if(i>=96) pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayMoniSecs=86400; else pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayMoniSecs=0; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_PREV_1DAY_LOFS_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AtucPerfLof; i++; if(i==96) break; } if(i==96) pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayLofs=j; else pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayLofs=0; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_PREV_1DAY_LOSS_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AtucPerfLos; i++; if(i==96) break; } if(i==96) pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayLoss=j; else pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayLoss=0; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_PREV_1DAY_ESS_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AtucPerfEs; i++; if(i==96) break; } if(i==96) pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayESs=j; else pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayESs=0; } if(IS_FLAG_SET((&(pts.atucPerfDataEntry_pt->flags)), ATUC_PERF_PREV_1DAY_INITS_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AtucPerfInit; i++; if(i==96) break; } if(i==96) pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayInits=j; else pts.atucPerfDataEntry_pt->adslAtucPerfPrev1DayInits=0; } copy_to_user((char *)lon, (char *)pts.atucPerfDataEntry_pt, sizeof(atucPerfDataEntry)); kfree(pts.atucPerfDataEntry_pt); break; #ifdef AMAZON_MEI_MIB_RFC3440 case GET_ADSL_ATUC_PERF_DATA_EXT: //??? CMV mapping not available pts.atucPerfDataExtEntry_pt = (atucPerfDataExtEntry *)kmalloc(sizeof(atucPerfDataExtEntry), GFP_KERNEL); copy_from_user((char *)pts.atucPerfDataExtEntry_pt, (char *)lon, sizeof(atucPerfDataExtEntry)); if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_STAT_FASTR_FLAG)){ pts.atucPerfDataExtEntry_pt->adslAtucPerfStatFastR=ATUC_PERF_STAT_FASTR; } if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_STAT_FAILED_FASTR_FLAG)){ pts.atucPerfDataExtEntry_pt->adslAtucPerfStatFailedFastR=ATUC_PERF_STAT_FAILED_FASTR; } if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_STAT_SESL_FLAG)){ pts.atucPerfDataExtEntry_pt->adslAtucPerfStatSesL=ATUC_PERF_STAT_SESL; } if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_STAT_UASL_FLAG)){ pts.atucPerfDataExtEntry_pt->adslAtucPerfStatUasL=ATUC_PERF_STAT_UASL; } if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_CURR_15MIN_FASTR_FLAG)){ pts.atucPerfDataExtEntry_pt->adslAtucPerfCurr15MinFastR=current_intvl->AtucPerfStatFastR; } if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_CURR_15MIN_FAILED_FASTR_FLAG)){ pts.atucPerfDataExtEntry_pt->adslAtucPerfCurr15MinFailedFastR=current_intvl->AtucPerfStatFailedFastR; } if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_CURR_15MIN_SESL_FLAG)){ pts.atucPerfDataExtEntry_pt->adslAtucPerfCurr15MinSesL=current_intvl->AtucPerfStatSesL; } if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_CURR_15MIN_UASL_FLAG)){ pts.atucPerfDataExtEntry_pt->adslAtucPerfCurr15MinUasL=current_intvl->AtucPerfStatUasL; } if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_CURR_1DAY_FASTR_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AtucPerfStatFastR; i++; if(i==96) j=0; } j+=current_intvl->AtucPerfStatFastR; pts.atucPerfDataExtEntry_pt->adslAtucPerfCurr1DayFastR=j; } if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_CURR_1DAY_FAILED_FASTR_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AtucPerfStatFailedFastR; i++; if(i==96) j=0; } j+=current_intvl->AtucPerfStatFailedFastR; pts.atucPerfDataExtEntry_pt->adslAtucPerfCurr1DayFailedFastR=j; } if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_CURR_1DAY_SESL_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AtucPerfStatSesL; i++; if(i==96) j=0; } j+=current_intvl->AtucPerfStatSesL; pts.atucPerfDataExtEntry_pt->adslAtucPerfCurr1DaySesL=j; } if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_CURR_1DAY_UASL_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AtucPerfStatUasL; i++; if(i==96) j=0; } j+=current_intvl->AtucPerfStatUasL; pts.atucPerfDataExtEntry_pt->adslAtucPerfCurr1DayUasL=j; } if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_PREV_1DAY_FASTR_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AtucPerfStatFastR; i++; if(i==96) break; } if(i==96) pts.atucPerfDataExtEntry_pt->adslAtucPerfPrev1DayFastR=j; else pts.atucPerfDataExtEntry_pt->adslAtucPerfPrev1DayFastR=0; } if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_PREV_1DAY_FAILED_FASTR_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AtucPerfStatFailedFastR; i++; if(i==96) break; } if(i==96) pts.atucPerfDataExtEntry_pt->adslAtucPerfPrev1DayFailedFastR=j; else pts.atucPerfDataExtEntry_pt->adslAtucPerfPrev1DayFailedFastR=0; } if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_PREV_1DAY_SESL_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AtucPerfStatSesL; i++; if(i==96) break; } if(i==96) pts.atucPerfDataExtEntry_pt->adslAtucPerfPrev1DaySesL=j; else pts.atucPerfDataExtEntry_pt->adslAtucPerfPrev1DaySesL=0; } if(IS_FLAG_SET((&(pts.atucPerfDataExtEntry_pt->flags)), ATUC_PERF_PREV_1DAY_UASL_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AtucPerfStatUasL; i++; if(i==96) break; } if(i==96) pts.atucPerfDataExtEntry_pt->adslAtucPerfPrev1DayUasL=j; else pts.atucPerfDataExtEntry_pt->adslAtucPerfPrev1DayUasL=0; } copy_to_user((char *)lon, (char *)pts.atucPerfDataExtEntry_pt, sizeof(atucPerfDataExtEntry)); kfree(pts.atucPerfDataExtEntry_pt); break; #endif case GET_ADSL_ATUR_PERF_DATA: pts.aturPerfDataEntry_pt = (aturPerfDataEntry *)kmalloc(sizeof(aturPerfDataEntry), GFP_KERNEL); copy_from_user((char *)pts.aturPerfDataEntry_pt, (char *)lon, sizeof(aturPerfDataEntry)); if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_LOFS_FLAG)){ pts.aturPerfDataEntry_pt->adslAturPerfLofs=ATUR_PERF_LOFS; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_LOSS_FLAG)){ pts.aturPerfDataEntry_pt->adslAturPerfLoss=ATUR_PERF_LOSS; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_LPR_FLAG)){ pts.aturPerfDataEntry_pt->adslAturPerfLprs=ATUR_PERF_LPR; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_ESS_FLAG)){ pts.aturPerfDataEntry_pt->adslAturPerfESs=ATUR_PERF_ESS; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_VALID_INTVLS_FLAG)){ i=0; for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){ i++; if(i==96) break; } pts.aturPerfDataEntry_pt->adslAturPerfValidIntervals=i; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_INVALID_INTVLS_FLAG)){ pts.aturPerfDataEntry_pt->adslAturPerfInvalidIntervals=0; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_15MIN_TIME_ELAPSED_FLAG)){ do_gettimeofday(&time_now); pts.aturPerfDataEntry_pt->adslAturPerfCurr15MinTimeElapsed=time_now.tv_sec - (current_intvl->start_time).tv_sec; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_15MIN_LOFS_FLAG)){ pts.aturPerfDataEntry_pt->adslAturPerfCurr15MinLofs=current_intvl->AturPerfLof; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_15MIN_LOSS_FLAG)){ pts.aturPerfDataEntry_pt->adslAturPerfCurr15MinLoss=current_intvl->AturPerfLos; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_15MIN_LPR_FLAG)){ pts.aturPerfDataEntry_pt->adslAturPerfCurr15MinLprs=current_intvl->AturPerfLpr; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_15MIN_ESS_FLAG)){ pts.aturPerfDataEntry_pt->adslAturPerfCurr15MinESs=current_intvl->AturPerfEs; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_1DAY_TIME_ELAPSED_FLAG)){ i=0; for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){ i+=900; } do_gettimeofday(&time_now); i+=time_now.tv_sec - (current_intvl->start_time).tv_sec; if(i>=86400) pts.aturPerfDataEntry_pt->adslAturPerfCurr1DayTimeElapsed=i-86400; else pts.aturPerfDataEntry_pt->adslAturPerfCurr1DayTimeElapsed=i; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_1DAY_LOFS_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturPerfLof; i++; if(i==96) j=0; } j+=current_intvl->AturPerfLof; pts.aturPerfDataEntry_pt->adslAturPerfCurr1DayLofs=j; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_1DAY_LOSS_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturPerfLos; i++; if(i==96) j=0; } j+=current_intvl->AturPerfLos; pts.aturPerfDataEntry_pt->adslAturPerfCurr1DayLoss=j; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_1DAY_LPR_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturPerfLpr; i++; if(i==96) j=0; } j+=current_intvl->AturPerfLpr; pts.aturPerfDataEntry_pt->adslAturPerfCurr1DayLprs=j; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_CURR_1DAY_ESS_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturPerfEs; i++; if(i==96) j=0; } j+=current_intvl->AturPerfEs; pts.aturPerfDataEntry_pt->adslAturPerfCurr1DayESs=j; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_PREV_1DAY_MON_SEC_FLAG)){ i=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ i++; } if(i>=96) pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayMoniSecs=86400; else pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayMoniSecs=0; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_PREV_1DAY_LOFS_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturPerfLof; i++; if(i==96) break; } if(i==96) pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayLofs=j; else pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayLofs=0; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_PREV_1DAY_LOSS_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturPerfLos; i++; if(i==96) break; } if(i==96) pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayLoss=j; else pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayLoss=0; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_PREV_1DAY_LPR_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturPerfLpr; i++; if(i==96) break; } if(i==96) pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayLprs=j; else pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayLprs=0; } if(IS_FLAG_SET((&(pts.aturPerfDataEntry_pt->flags)), ATUR_PERF_PREV_1DAY_ESS_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturPerfEs; i++; if(i==96) break; } if(i==96) pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayESs=j; else pts.aturPerfDataEntry_pt->adslAturPerfPrev1DayESs=0; } copy_to_user((char *)lon, (char *)pts.aturPerfDataEntry_pt, sizeof(aturPerfDataEntry)); kfree(pts.aturPerfDataEntry_pt); break; #ifdef AMAZON_MEI_MIB_RFC3440 case GET_ADSL_ATUR_PERF_DATA_EXT: pts.aturPerfDataExtEntry_pt = (aturPerfDataExtEntry *)kmalloc(sizeof(aturPerfDataExtEntry), GFP_KERNEL); copy_from_user((char *)pts.aturPerfDataExtEntry_pt, (char *)lon, sizeof(aturPerfDataExtEntry)); if(IS_FLAG_SET((&(pts.aturPerfDataExtEntry_pt->flags)), ATUR_PERF_STAT_SESL_FLAG)){ pts.aturPerfDataExtEntry_pt->adslAturPerfStatSesL=ATUR_PERF_STAT_SESL; } if(IS_FLAG_SET((&(pts.aturPerfDataExtEntry_pt->flags)), ATUR_PERF_STAT_UASL_FLAG)){ pts.aturPerfDataExtEntry_pt->adslAturPerfStatUasL=ATUR_PERF_STAT_UASL; } if(IS_FLAG_SET((&(pts.aturPerfDataExtEntry_pt->flags)), ATUR_PERF_CURR_15MIN_SESL_FLAG)){ pts.aturPerfDataExtEntry_pt->adslAturPerfCurr15MinSesL=current_intvl->AturPerfStatSesL; } if(IS_FLAG_SET((&(pts.aturPerfDataExtEntry_pt->flags)), ATUR_PERF_CURR_15MIN_UASL_FLAG)){ pts.aturPerfDataExtEntry_pt->adslAturPerfCurr15MinUasL=current_intvl->AturPerfStatUasL; } if(IS_FLAG_SET((&(pts.aturPerfDataExtEntry_pt->flags)), ATUR_PERF_CURR_1DAY_SESL_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturPerfStatSesL; i++; if(i==96) j=0; } j+=current_intvl->AturPerfStatSesL; pts.aturPerfDataExtEntry_pt->adslAturPerfCurr1DaySesL=j; } if(IS_FLAG_SET((&(pts.aturPerfDataExtEntry_pt->flags)), ATUR_PERF_CURR_1DAY_UASL_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturPerfStatUasL; i++; if(i==96) j=0; } j+=current_intvl->AturPerfStatUasL; pts.aturPerfDataExtEntry_pt->adslAturPerfCurr1DayUasL=j; } if(IS_FLAG_SET((&(pts.aturPerfDataExtEntry_pt->flags)), ATUR_PERF_PREV_1DAY_SESL_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturPerfStatSesL; i++; if(i==96) break; } if(i==96) pts.aturPerfDataExtEntry_pt->adslAturPerfPrev1DaySesL=j; else pts.aturPerfDataExtEntry_pt->adslAturPerfPrev1DaySesL=0; } if(IS_FLAG_SET((&(pts.aturPerfDataExtEntry_pt->flags)), ATUR_PERF_PREV_1DAY_UASL_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturPerfStatUasL; i++; if(i==96) break; } if(i==96) pts.aturPerfDataExtEntry_pt->adslAturPerfPrev1DayUasL=j; else pts.aturPerfDataExtEntry_pt->adslAturPerfPrev1DayUasL=0; } copy_to_user((char *)lon, (char *)pts.aturPerfDataExtEntry_pt, sizeof(aturPerfDataExtEntry)); kfree(pts.aturPerfDataExtEntry_pt); break; #endif case GET_ADSL_ATUC_INTVL_INFO: pts.adslAtucIntvlInfo_pt = (adslAtucIntvlInfo *)kmalloc(sizeof(adslAtucIntvlInfo), GFP_KERNEL); copy_from_user((char *)pts.adslAtucIntvlInfo_pt, (char *)lon, sizeof(adslAtucIntvlInfo)); if(pts.adslAtucIntvlInfo_pt->IntervalNumber <1){ pts.adslAtucIntvlInfo_pt->intervalLOF = ATUC_PERF_LOFS; pts.adslAtucIntvlInfo_pt->intervalLOS = ATUC_PERF_LOSS; pts.adslAtucIntvlInfo_pt->intervalES = ATUC_PERF_ESS; pts.adslAtucIntvlInfo_pt->intervalInits = ATUC_PERF_INITS; pts.adslAtucIntvlInfo_pt->intervalValidData = 1; } else{ i=0; for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){ i++; if(i==pts.adslAtucIntvlInfo_pt->IntervalNumber){ temp_intvl = list_entry(ptr, amazon_mei_mib, list); pts.adslAtucIntvlInfo_pt->intervalLOF = temp_intvl->AtucPerfLof; pts.adslAtucIntvlInfo_pt->intervalLOS = temp_intvl->AtucPerfLos; pts.adslAtucIntvlInfo_pt->intervalES = temp_intvl->AtucPerfEs; pts.adslAtucIntvlInfo_pt->intervalInits = temp_intvl->AtucPerfInit; pts.adslAtucIntvlInfo_pt->intervalValidData = 1; break; } } if(ptr==&interval_list){ pts.adslAtucIntvlInfo_pt->intervalValidData = 0; pts.adslAtucIntvlInfo_pt->flags = 0; pts.adslAtucIntvlInfo_pt->intervalLOF = 0; pts.adslAtucIntvlInfo_pt->intervalLOS = 0; pts.adslAtucIntvlInfo_pt->intervalES = 0; pts.adslAtucIntvlInfo_pt->intervalInits = 0; } } copy_to_user((char *)lon, (char *)pts.adslAtucIntvlInfo_pt, sizeof(adslAtucIntvlInfo)); kfree(pts.adslAtucIntvlInfo_pt); break; #ifdef AMAZON_MEI_MIB_RFC3440 case GET_ADSL_ATUC_INTVL_EXT_INFO: pts.adslAtucInvtlExtInfo_pt = (adslAtucInvtlExtInfo *)kmalloc(sizeof(adslAtucInvtlExtInfo), GFP_KERNEL); copy_from_user((char *)pts.adslAtucInvtlExtInfo_pt, (char *)lon, sizeof(adslAtucInvtlExtInfo)); if(pts.adslAtucInvtlExtInfo_pt->IntervalNumber <1){ pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalFastR = ATUC_PERF_STAT_FASTR; pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalFailedFastR = ATUC_PERF_STAT_FAILED_FASTR; pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalSesL = ATUC_PERF_STAT_SESL; pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalUasL = ATUC_PERF_STAT_UASL; // pts.adslAtucInvtlExtInfo_pt->intervalValidData = 1; } else{ i=0; for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){ i++; if(i==pts.adslAtucInvtlExtInfo_pt->IntervalNumber){ temp_intvl = list_entry(ptr, amazon_mei_mib, list); pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalFastR = temp_intvl->AtucPerfStatFastR; pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalFailedFastR = temp_intvl->AtucPerfStatFailedFastR; pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalSesL = temp_intvl->AtucPerfStatSesL; pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalUasL = temp_intvl->AtucPerfStatUasL; // pts.adslAtucInvtlExtInfo_pt->intervalValidData = 1; break; } } if(ptr==&interval_list){ // pts.adslAtucInvtlExtInfo_pt->intervalValidData = 0; pts.adslAtucInvtlExtInfo_pt->flags = 0; pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalFastR = 0; pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalFailedFastR = 0; pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalSesL = 0; pts.adslAtucInvtlExtInfo_pt->adslAtucIntervalUasL = 0; } } copy_to_user((char *)lon, (char *)pts.adslAtucInvtlExtInfo_pt, sizeof(adslAtucInvtlExtInfo)); kfree(pts.adslAtucInvtlExtInfo_pt); break; #endif case GET_ADSL_ATUR_INTVL_INFO: pts.adslAturIntvlInfo_pt = (adslAturIntvlInfo *)kmalloc(sizeof(adslAturIntvlInfo), GFP_KERNEL); copy_from_user((char *)pts.adslAturIntvlInfo_pt, (char *)lon, sizeof(adslAturIntvlInfo)); if(pts.adslAturIntvlInfo_pt->IntervalNumber <1){ pts.adslAturIntvlInfo_pt->intervalLOF = ATUR_PERF_LOFS; pts.adslAturIntvlInfo_pt->intervalLOS = ATUR_PERF_LOSS; pts.adslAturIntvlInfo_pt->intervalES = ATUR_PERF_ESS; pts.adslAturIntvlInfo_pt->intervalLPR = ATUR_PERF_LPR; pts.adslAturIntvlInfo_pt->intervalValidData = 1; } else{ i=0; for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){ i++; if(i==pts.adslAturIntvlInfo_pt->IntervalNumber){ temp_intvl = list_entry(ptr, amazon_mei_mib, list); pts.adslAturIntvlInfo_pt->intervalLOF = temp_intvl->AturPerfLof; pts.adslAturIntvlInfo_pt->intervalLOS = temp_intvl->AturPerfLos; pts.adslAturIntvlInfo_pt->intervalES = temp_intvl->AturPerfEs; pts.adslAturIntvlInfo_pt->intervalLPR = temp_intvl->AturPerfLpr; pts.adslAturIntvlInfo_pt->intervalValidData = 1; break; } } if(ptr==&interval_list){ pts.adslAturIntvlInfo_pt->intervalValidData = 0; pts.adslAturIntvlInfo_pt->flags = 0; pts.adslAturIntvlInfo_pt->intervalLOF = 0; pts.adslAturIntvlInfo_pt->intervalLOS = 0; pts.adslAturIntvlInfo_pt->intervalES = 0; pts.adslAturIntvlInfo_pt->intervalLPR = 0; } } copy_to_user((char *)lon, (char *)pts.adslAturIntvlInfo_pt, sizeof(adslAturIntvlInfo)); kfree(pts.adslAturIntvlInfo_pt); break; #ifdef AMAZON_MEI_MIB_RFC3440 case GET_ADSL_ATUR_INTVL_EXT_INFO: pts.adslAturInvtlExtInfo_pt = (adslAturInvtlExtInfo *)kmalloc(sizeof(adslAturInvtlExtInfo), GFP_KERNEL); copy_from_user((char *)pts.adslAturInvtlExtInfo_pt, (char *)lon, sizeof(adslAturInvtlExtInfo)); if(pts.adslAturInvtlExtInfo_pt->IntervalNumber <1){ pts.adslAturInvtlExtInfo_pt->adslAturIntervalSesL = ATUR_PERF_STAT_SESL; pts.adslAturInvtlExtInfo_pt->adslAturIntervalUasL = ATUR_PERF_STAT_UASL; // pts.adslAturInvtlExtInfo_pt->intervalValidData = 1; } else{ i=0; for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){ i++; if(i==pts.adslAturInvtlExtInfo_pt->IntervalNumber){ temp_intvl = list_entry(ptr, amazon_mei_mib, list); pts.adslAturInvtlExtInfo_pt->adslAturIntervalSesL = temp_intvl->AturPerfStatSesL; pts.adslAturInvtlExtInfo_pt->adslAturIntervalUasL = temp_intvl->AturPerfStatUasL; // pts.adslAturInvtlExtInfo_pt->intervalValidData = 1; break; } } if(ptr==&interval_list){ // pts.adslAturInvtlExtInfo_pt->intervalValidData = 0; pts.adslAturInvtlExtInfo_pt->flags = 0; pts.adslAturInvtlExtInfo_pt->adslAturIntervalSesL = 0; pts.adslAturInvtlExtInfo_pt->adslAturIntervalUasL = 0; } } copy_to_user((char *)lon, (char *)pts.adslAturInvtlExtInfo_pt, sizeof(adslAturInvtlExtInfo)); kfree(pts.adslAturInvtlExtInfo_pt); break; #endif case GET_ADSL_ATUC_CHAN_PERF_DATA: pts.atucChannelPerfDataEntry_pt = (atucChannelPerfDataEntry *)kmalloc(sizeof(atucChannelPerfDataEntry), GFP_KERNEL); copy_from_user((char *)pts.atucChannelPerfDataEntry_pt, (char *)lon, sizeof(atucChannelPerfDataEntry)); pts.atucChannelPerfDataEntry_pt->flags = 0; copy_to_user((char *)lon, (char *)pts.atucChannelPerfDataEntry_pt, sizeof(atucChannelPerfDataEntry)); kfree(pts.atucChannelPerfDataEntry_pt); break; case GET_ADSL_ATUR_CHAN_PERF_DATA: pts.aturChannelPerfDataEntry_pt = (aturChannelPerfDataEntry *)kmalloc(sizeof(aturChannelPerfDataEntry), GFP_KERNEL); copy_from_user((char *)pts.aturChannelPerfDataEntry_pt, (char *)lon, sizeof(aturChannelPerfDataEntry)); if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_RECV_BLK_FLAG)){ pts.aturChannelPerfDataEntry_pt->adslAturChanReceivedBlks=ATUR_CHAN_RECV_BLK; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_TX_BLK_FLAG)){ pts.aturChannelPerfDataEntry_pt->adslAturChanTransmittedBlks=ATUR_CHAN_TX_BLK; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_CORR_BLK_FLAG)){ pts.aturChannelPerfDataEntry_pt->adslAturChanCorrectedBlks=ATUR_CHAN_CORR_BLK; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_UNCORR_BLK_FLAG)){ pts.aturChannelPerfDataEntry_pt->adslAturChanUncorrectBlks=ATUR_CHAN_UNCORR_BLK; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_VALID_INTVL_FLAG)){ i=0; for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){ i++; if(i==96) break; } pts.aturChannelPerfDataEntry_pt->adslAturChanPerfValidIntervals=i; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_INVALID_INTVL_FLAG)){ pts.aturChannelPerfDataEntry_pt->adslAturChanPerfInvalidIntervals=0; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_15MIN_TIME_ELAPSED_FLAG)){ do_gettimeofday(&time_now); pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr15MinTimeElapsed=time_now.tv_sec - (current_intvl->start_time).tv_sec; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_15MIN_RECV_BLK_FLAG)){ pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr15MinReceivedBlks=current_intvl->AturChanPerfRxBlk; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_15MIN_TX_BLK_FLAG)){ pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr15MinTransmittedBlks=current_intvl->AturChanPerfTxBlk; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_15MIN_CORR_BLK_FLAG)){ pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr15MinCorrectedBlks=current_intvl->AturChanPerfCorrBlk; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_15MIN_UNCORR_BLK_FLAG)){ pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr15MinUncorrectBlks=current_intvl->AturChanPerfUncorrBlk; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_1DAY_TIME_ELAPSED_FLAG)){ i=0; for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){ i+=900; } do_gettimeofday(&time_now); i+=time_now.tv_sec - (current_intvl->start_time).tv_sec; if(i>=86400) pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr1DayTimeElapsed=i-86400; else pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr1DayTimeElapsed=i; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_1DAY_RECV_BLK_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturChanPerfRxBlk; i++; if(i==96) j=0; } j+=current_intvl->AturChanPerfRxBlk; pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr1DayReceivedBlks=j; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_1DAY_TX_BLK_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturChanPerfTxBlk; i++; if(i==96) j=0; } j+=current_intvl->AturChanPerfTxBlk; pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr1DayTransmittedBlks=j; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_1DAY_CORR_BLK_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturChanPerfCorrBlk; i++; if(i==96) j=0; } j+=current_intvl->AturChanPerfCorrBlk; pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr1DayCorrectedBlks=j; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_CURR_1DAY_UNCORR_BLK_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturChanPerfUncorrBlk; i++; if(i==96) j=0; } j+=current_intvl->AturChanPerfUncorrBlk; pts.aturChannelPerfDataEntry_pt->adslAturChanPerfCurr1DayUncorrectBlks=j; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_PREV_1DAY_MONI_SEC_FLAG)){ i=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ i++; } if(i>=96) pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayMoniSecs=86400; else pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayMoniSecs=0; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_PREV_1DAY_RECV_BLK_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturChanPerfRxBlk; i++; if(i==96) break; } if(i==96) pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayReceivedBlks=j; else pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayReceivedBlks=0; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_PREV_1DAY_TRANS_BLK_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturChanPerfTxBlk; i++; if(i==96) break; } if(i==96) pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayTransmittedBlks=j; else pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayTransmittedBlks=0; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_PREV_1DAY_CORR_BLK_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturChanPerfCorrBlk; i++; if(i==96) break; } if(i==96) pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayCorrectedBlks=j; else pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayCorrectedBlks=0; } if(IS_FLAG_SET((&(pts.aturChannelPerfDataEntry_pt->flags)), ATUR_CHAN_PERF_PREV_1DAY_UNCORR_BLK_FLAG)){ i=0; j=0; for(ptr=interval_list.next; ptr!=&(current_intvl->list); ptr=ptr->next){ mib_ptr = list_entry(ptr, amazon_mei_mib, list); j+=mib_ptr->AturChanPerfUncorrBlk; i++; if(i==96) break; } if(i==96) pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayUncorrectBlks=j; else pts.aturChannelPerfDataEntry_pt->adslAturChanPerfPrev1DayUncorrectBlks=0; } copy_to_user((char *)lon, (char *)pts.aturChannelPerfDataEntry_pt, sizeof(aturChannelPerfDataEntry)); kfree(pts.aturChannelPerfDataEntry_pt); break; case GET_ADSL_ATUC_CHAN_INTVL_INFO: pts.adslAtucChanIntvlInfo_pt = (adslAtucChanIntvlInfo *)kmalloc(sizeof(adslAtucChanIntvlInfo), GFP_KERNEL); copy_from_user((char *)pts.adslAtucChanIntvlInfo_pt, (char *)lon, sizeof(adslAtucChanIntvlInfo)); pts.adslAtucChanIntvlInfo_pt->flags = 0; copy_to_user((char *)lon, (char *)pts.adslAtucChanIntvlInfo_pt, sizeof(adslAtucChanIntvlInfo)); kfree(pts.adslAtucChanIntvlInfo_pt); break; case GET_ADSL_ATUR_CHAN_INTVL_INFO: pts.adslAturChanIntvlInfo_pt = (adslAturChanIntvlInfo *)kmalloc(sizeof(adslAturChanIntvlInfo), GFP_KERNEL); copy_from_user((char *)pts.adslAturChanIntvlInfo_pt, (char *)lon, sizeof(adslAturChanIntvlInfo)); if(pts.adslAturChanIntvlInfo_pt->IntervalNumber <1){ pts.adslAturChanIntvlInfo_pt->chanIntervalRecvdBlks = ATUR_CHAN_RECV_BLK; pts.adslAturChanIntvlInfo_pt->chanIntervalXmitBlks = ATUR_CHAN_TX_BLK; pts.adslAturChanIntvlInfo_pt->chanIntervalCorrectedBlks = ATUR_CHAN_CORR_BLK; pts.adslAturChanIntvlInfo_pt->chanIntervalUncorrectBlks = ATUR_CHAN_UNCORR_BLK; pts.adslAturChanIntvlInfo_pt->intervalValidData = 1; } else{ i=0; for(ptr=(current_intvl->list).prev; ptr!=&interval_list; ptr=ptr->prev){ i++; if(i==pts.adslAturChanIntvlInfo_pt->IntervalNumber){ temp_intvl = list_entry(ptr, amazon_mei_mib, list); pts.adslAturChanIntvlInfo_pt->chanIntervalRecvdBlks = temp_intvl->AturChanPerfRxBlk; pts.adslAturChanIntvlInfo_pt->chanIntervalXmitBlks = temp_intvl->AturChanPerfTxBlk; pts.adslAturChanIntvlInfo_pt->chanIntervalCorrectedBlks = temp_intvl->AturChanPerfCorrBlk; pts.adslAturChanIntvlInfo_pt->chanIntervalUncorrectBlks = temp_intvl->AturChanPerfUncorrBlk; pts.adslAturChanIntvlInfo_pt->intervalValidData = 1; break; } } if(ptr==&interval_list){ pts.adslAturChanIntvlInfo_pt->intervalValidData = 0; pts.adslAturChanIntvlInfo_pt->flags = 0; } } copy_to_user((char *)lon, (char *)pts.adslAturChanIntvlInfo_pt, sizeof(adslAturChanIntvlInfo)); kfree(pts.adslAturChanIntvlInfo_pt); break; case GET_ADSL_ALRM_CONF_PROF: pts.adslLineAlarmConfProfileEntry_pt = (adslLineAlarmConfProfileEntry *)kmalloc(sizeof(adslLineAlarmConfProfileEntry), GFP_KERNEL); copy_from_user((char *)pts.adslLineAlarmConfProfileEntry_pt, (char *)lon, sizeof(adslLineAlarmConfProfileEntry)); strncpy(pts.adslLineAlarmConfProfileEntry_pt->adslLineAlarmConfProfileName, AlarmConfProfile.adslLineAlarmConfProfileName, 32); if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_15MIN_LOFS_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslAtucThresh15MinLofs=AlarmConfProfile.adslAtucThresh15MinLofs; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_15MIN_LOSS_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslAtucThresh15MinLoss=AlarmConfProfile.adslAtucThresh15MinLoss; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_15MIN_ESS_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslAtucThresh15MinESs=AlarmConfProfile.adslAtucThresh15MinESs; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_FAST_RATEUP_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslAtucThreshFastRateUp=AlarmConfProfile.adslAtucThreshFastRateUp; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_INTERLEAVE_RATEUP_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslAtucThreshInterleaveRateUp=AlarmConfProfile.adslAtucThreshInterleaveRateUp; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_FAST_RATEDOWN_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslAtucThreshFastRateDown=AlarmConfProfile.adslAtucThreshFastRateDown; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_INTERLEAVE_RATEDOWN_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslAtucThreshInterleaveRateDown=AlarmConfProfile.adslAtucThreshInterleaveRateDown; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_INIT_FAILURE_TRAP_ENABLE_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslAtucInitFailureTrapEnable=AlarmConfProfile.adslAtucInitFailureTrapEnable; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_15MIN_LOFS_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslAturThresh15MinLofs=AlarmConfProfile.adslAturThresh15MinLofs; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_15MIN_LOSS_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslAturThresh15MinLoss=AlarmConfProfile.adslAturThresh15MinLoss; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_15MIN_LPRS_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslAturThresh15MinLprs=AlarmConfProfile.adslAturThresh15MinLprs; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_15MIN_ESS_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslAturThresh15MinESs=AlarmConfProfile.adslAturThresh15MinESs; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_FAST_RATEUP_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslAturThreshFastRateUp=AlarmConfProfile.adslAturThreshFastRateUp; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_INTERLEAVE_RATEUP_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslAturThreshInterleaveRateUp=AlarmConfProfile.adslAturThreshInterleaveRateUp; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_FAST_RATEDOWN_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslAturThreshFastRateDown=AlarmConfProfile.adslAturThreshFastRateDown; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_INTERLEAVE_RATEDOWN_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslAturThreshInterleaveRateDown=AlarmConfProfile.adslAturThreshInterleaveRateDown; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), LINE_ALARM_CONF_PROFILE_ROWSTATUS_FLAG)){ pts.adslLineAlarmConfProfileEntry_pt->adslLineAlarmConfProfileRowStatus=AlarmConfProfile.adslLineAlarmConfProfileRowStatus; } copy_to_user((char *)lon, (char *)pts.adslLineAlarmConfProfileEntry_pt, sizeof(adslLineAlarmConfProfileEntry)); kfree(pts.adslLineAlarmConfProfileEntry_pt); break; #ifdef AMAZON_MEI_MIB_RFC3440 case GET_ADSL_ALRM_CONF_PROF_EXT: pts.adslLineAlarmConfProfileExtEntry_pt = (adslLineAlarmConfProfileExtEntry *)kmalloc(sizeof(adslLineAlarmConfProfileExtEntry), GFP_KERNEL); copy_from_user((char *)pts.adslLineAlarmConfProfileExtEntry_pt, (char *)lon, sizeof(adslLineAlarmConfProfileExtEntry)); if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUC_THRESH_15MIN_FAILED_FASTR_FLAG)){ pts.adslLineAlarmConfProfileExtEntry_pt->adslAtucThreshold15MinFailedFastR=AlarmConfProfileExt.adslAtucThreshold15MinFailedFastR; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUC_THRESH_15MIN_SESL_FLAG)){ pts.adslLineAlarmConfProfileExtEntry_pt->adslAtucThreshold15MinSesL=AlarmConfProfileExt.adslAtucThreshold15MinSesL; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUC_THRESH_15MIN_UASL_FLAG)){ pts.adslLineAlarmConfProfileExtEntry_pt->adslAtucThreshold15MinUasL=AlarmConfProfileExt.adslAtucThreshold15MinUasL; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUR_THRESH_15MIN_SESL_FLAG)){ pts.adslLineAlarmConfProfileExtEntry_pt->adslAturThreshold15MinSesL=AlarmConfProfileExt.adslAturThreshold15MinSesL; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUR_THRESH_15MIN_UASL_FLAG)){ pts.adslLineAlarmConfProfileExtEntry_pt->adslAturThreshold15MinUasL=AlarmConfProfileExt.adslAturThreshold15MinUasL; } copy_to_user((char *)lon, (char *)pts.adslLineAlarmConfProfileExtEntry_pt, sizeof(adslLineAlarmConfProfileExtEntry)); kfree(pts.adslLineAlarmConfProfileExtEntry_pt); break; #endif case SET_ADSL_ALRM_CONF_PROF: pts.adslLineAlarmConfProfileEntry_pt = (adslLineAlarmConfProfileEntry *)kmalloc(sizeof(adslLineAlarmConfProfileEntry), GFP_KERNEL); copy_from_user((char *)pts.adslLineAlarmConfProfileEntry_pt, (char *)lon, sizeof(adslLineAlarmConfProfileEntry)); strncpy(AlarmConfProfile.adslLineAlarmConfProfileName, pts.adslLineAlarmConfProfileEntry_pt->adslLineAlarmConfProfileName, 32); if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_15MIN_LOFS_FLAG)){ AlarmConfProfile.adslAtucThresh15MinLofs=pts.adslLineAlarmConfProfileEntry_pt->adslAtucThresh15MinLofs; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_15MIN_LOSS_FLAG)){ AlarmConfProfile.adslAtucThresh15MinLoss=pts.adslLineAlarmConfProfileEntry_pt->adslAtucThresh15MinLoss; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_15MIN_ESS_FLAG)){ AlarmConfProfile.adslAtucThresh15MinESs=pts.adslLineAlarmConfProfileEntry_pt->adslAtucThresh15MinESs; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_FAST_RATEUP_FLAG)){ AlarmConfProfile.adslAtucThreshFastRateUp=pts.adslLineAlarmConfProfileEntry_pt->adslAtucThreshFastRateUp; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_INTERLEAVE_RATEUP_FLAG)){ AlarmConfProfile.adslAtucThreshInterleaveRateUp=pts.adslLineAlarmConfProfileEntry_pt->adslAtucThreshInterleaveRateUp; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_FAST_RATEDOWN_FLAG)){ AlarmConfProfile.adslAtucThreshFastRateDown=pts.adslLineAlarmConfProfileEntry_pt->adslAtucThreshFastRateDown; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_THRESH_INTERLEAVE_RATEDOWN_FLAG)){ AlarmConfProfile.adslAtucThreshInterleaveRateDown=pts.adslLineAlarmConfProfileEntry_pt->adslAtucThreshInterleaveRateDown; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUC_INIT_FAILURE_TRAP_ENABLE_FLAG)){ AlarmConfProfile.adslAtucInitFailureTrapEnable=pts.adslLineAlarmConfProfileEntry_pt->adslAtucInitFailureTrapEnable; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_15MIN_LOFS_FLAG)){ AlarmConfProfile.adslAturThresh15MinLofs=pts.adslLineAlarmConfProfileEntry_pt->adslAturThresh15MinLofs; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_15MIN_LOSS_FLAG)){ AlarmConfProfile.adslAturThresh15MinLoss=pts.adslLineAlarmConfProfileEntry_pt->adslAturThresh15MinLoss; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_15MIN_LPRS_FLAG)){ AlarmConfProfile.adslAturThresh15MinLprs=pts.adslLineAlarmConfProfileEntry_pt->adslAturThresh15MinLprs; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_15MIN_ESS_FLAG)){ AlarmConfProfile.adslAturThresh15MinESs=pts.adslLineAlarmConfProfileEntry_pt->adslAturThresh15MinESs; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_FAST_RATEUP_FLAG)){ AlarmConfProfile.adslAturThreshFastRateUp=pts.adslLineAlarmConfProfileEntry_pt->adslAturThreshFastRateUp; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_INTERLEAVE_RATEUP_FLAG)){ AlarmConfProfile.adslAturThreshInterleaveRateUp=pts.adslLineAlarmConfProfileEntry_pt->adslAturThreshInterleaveRateUp; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_FAST_RATEDOWN_FLAG)){ AlarmConfProfile.adslAturThreshFastRateDown=pts.adslLineAlarmConfProfileEntry_pt->adslAturThreshFastRateDown; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), ATUR_THRESH_INTERLEAVE_RATEDOWN_FLAG)){ AlarmConfProfile.adslAturThreshInterleaveRateDown=pts.adslLineAlarmConfProfileEntry_pt->adslAturThreshInterleaveRateDown; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileEntry_pt->flags)), LINE_ALARM_CONF_PROFILE_ROWSTATUS_FLAG)){ AlarmConfProfile.adslLineAlarmConfProfileRowStatus=pts.adslLineAlarmConfProfileEntry_pt->adslLineAlarmConfProfileRowStatus; } copy_to_user((char *)lon, (char *)pts.adslLineAlarmConfProfileEntry_pt, sizeof(adslLineAlarmConfProfileEntry)); kfree(pts.adslLineAlarmConfProfileEntry_pt); break; #ifdef AMAZON_MEI_MIB_RFC3440 case SET_ADSL_ALRM_CONF_PROF_EXT: pts.adslLineAlarmConfProfileExtEntry_pt = (adslLineAlarmConfProfileExtEntry *)kmalloc(sizeof(adslLineAlarmConfProfileExtEntry), GFP_KERNEL); copy_from_user((char *)pts.adslLineAlarmConfProfileExtEntry_pt, (char *)lon, sizeof(adslLineAlarmConfProfileExtEntry)); if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUC_THRESH_15MIN_FAILED_FASTR_FLAG)){ AlarmConfProfileExt.adslAtucThreshold15MinFailedFastR=pts.adslLineAlarmConfProfileExtEntry_pt->adslAtucThreshold15MinFailedFastR; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUC_THRESH_15MIN_SESL_FLAG)){ AlarmConfProfileExt.adslAtucThreshold15MinSesL=pts.adslLineAlarmConfProfileExtEntry_pt->adslAtucThreshold15MinSesL; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUC_THRESH_15MIN_UASL_FLAG)){ AlarmConfProfileExt.adslAtucThreshold15MinUasL=pts.adslLineAlarmConfProfileExtEntry_pt->adslAtucThreshold15MinUasL; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUR_THRESH_15MIN_SESL_FLAG)){ AlarmConfProfileExt.adslAturThreshold15MinSesL=pts.adslLineAlarmConfProfileExtEntry_pt->adslAturThreshold15MinSesL; } if(IS_FLAG_SET((&(pts.adslLineAlarmConfProfileExtEntry_pt->flags)), ATUR_THRESH_15MIN_UASL_FLAG)){ AlarmConfProfileExt.adslAturThreshold15MinUasL=pts.adslLineAlarmConfProfileExtEntry_pt->adslAturThreshold15MinUasL; } copy_to_user((char *)lon, (char *)pts.adslLineAlarmConfProfileExtEntry_pt, sizeof(adslLineAlarmConfProfileExtEntry)); kfree(pts.adslLineAlarmConfProfileExtEntry_pt); break; #endif case ADSL_ATUR_TRAPS: if(down_interruptible(&mei_sema)) return -ERESTARTSYS; trapsflag=0; if(AlarmConfProfile.adslAtucThresh15MinLofs!=0 && current_intvl->AtucPerfLof>=AlarmConfProfile.adslAtucThresh15MinLofs) trapsflag|=ATUC_PERF_LOFS_THRESH_FLAG; if(AlarmConfProfile.adslAtucThresh15MinLoss!=0 && current_intvl->AtucPerfLos>=AlarmConfProfile.adslAtucThresh15MinLoss) trapsflag|=ATUC_PERF_LOSS_THRESH_FLAG; if(AlarmConfProfile.adslAtucThresh15MinESs!=0 && current_intvl->AtucPerfEs>=AlarmConfProfile.adslAtucThresh15MinESs) trapsflag|=ATUC_PERF_ESS_THRESH_FLAG; if(chantype.fast==1){ if(AlarmConfProfile.adslAtucThreshFastRateUp!=0 || AlarmConfProfile.adslAtucThreshFastRateDown!=0){ ATUC_CHAN_CURR_TX_RATE_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 6 Address 1 Index 0"); #endif } else{ temp = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16); if((AlarmConfProfile.adslAtucThreshFastRateUp!=0) && (temp>=PrevTxRate.adslAtucChanPrevTxRate+AlarmConfProfile.adslAtucThreshFastRateUp)){ trapsflag|=ATUC_RATE_CHANGE_FLAG; PrevTxRate.adslAtucChanPrevTxRate = temp; } if((AlarmConfProfile.adslAtucThreshFastRateDown!=0) && (temp<=PrevTxRate.adslAtucChanPrevTxRate-AlarmConfProfile.adslAtucThreshFastRateDown)){ trapsflag|=ATUC_RATE_CHANGE_FLAG; PrevTxRate.adslAtucChanPrevTxRate = temp; } } } } if(chantype.interleave==1){ if(AlarmConfProfile.adslAtucThreshInterleaveRateUp!=0 || AlarmConfProfile.adslAtucThreshInterleaveRateDown!=0){ ATUC_CHAN_CURR_TX_RATE_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 6 Address 1 Index 0"); #endif } else{ temp = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16); if((AlarmConfProfile.adslAtucThreshInterleaveRateUp!=0) && (temp>=PrevTxRate.adslAtucChanPrevTxRate+AlarmConfProfile.adslAtucThreshInterleaveRateUp)){ trapsflag|=ATUC_RATE_CHANGE_FLAG; PrevTxRate.adslAtucChanPrevTxRate = temp; } if((AlarmConfProfile.adslAtucThreshInterleaveRateDown!=0) && (temp<=PrevTxRate.adslAtucChanPrevTxRate-AlarmConfProfile.adslAtucThreshInterleaveRateDown)){ trapsflag|=ATUC_RATE_CHANGE_FLAG; PrevTxRate.adslAtucChanPrevTxRate = temp; } } } } if(AlarmConfProfile.adslAturThresh15MinLofs!=0 && current_intvl->AturPerfLof>=AlarmConfProfile.adslAturThresh15MinLofs) trapsflag|=ATUR_PERF_LOFS_THRESH_FLAG; if(AlarmConfProfile.adslAturThresh15MinLoss!=0 && current_intvl->AturPerfLos>=AlarmConfProfile.adslAturThresh15MinLoss) trapsflag|=ATUR_PERF_LOSS_THRESH_FLAG; if(AlarmConfProfile.adslAturThresh15MinLprs!=0 && current_intvl->AturPerfLpr>=AlarmConfProfile.adslAturThresh15MinLprs) trapsflag|=ATUR_PERF_LPRS_THRESH_FLAG; if(AlarmConfProfile.adslAturThresh15MinESs!=0 && current_intvl->AturPerfEs>=AlarmConfProfile.adslAturThresh15MinESs) trapsflag|=ATUR_PERF_ESS_THRESH_FLAG; if(chantype.fast==1){ if(AlarmConfProfile.adslAturThreshFastRateUp!=0 || AlarmConfProfile.adslAturThreshFastRateDown!=0){ ATUR_CHAN_CURR_TX_RATE_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 6 Address 0 Index 0"); #endif } else{ temp = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16); if((AlarmConfProfile.adslAturThreshFastRateUp!=0) && (temp>=PrevTxRate.adslAturChanPrevTxRate+AlarmConfProfile.adslAturThreshFastRateUp)){ trapsflag|=ATUR_RATE_CHANGE_FLAG; PrevTxRate.adslAturChanPrevTxRate = temp; } if((AlarmConfProfile.adslAturThreshFastRateDown!=0) && (temp<=PrevTxRate.adslAturChanPrevTxRate-AlarmConfProfile.adslAturThreshFastRateDown)){ trapsflag|=ATUR_RATE_CHANGE_FLAG; PrevTxRate.adslAturChanPrevTxRate = temp; } } } } if(chantype.interleave==1){ if(AlarmConfProfile.adslAturThreshInterleaveRateUp!=0 || AlarmConfProfile.adslAturThreshInterleaveRateDown!=0){ ATUR_CHAN_CURR_TX_RATE_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 6 Address 0 Index 0"); #endif } else{ temp = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16); if((AlarmConfProfile.adslAturThreshInterleaveRateUp!=0) && (temp>=PrevTxRate.adslAturChanPrevTxRate+AlarmConfProfile.adslAturThreshInterleaveRateUp)){ trapsflag|=ATUR_RATE_CHANGE_FLAG; PrevTxRate.adslAturChanPrevTxRate = temp; } if((AlarmConfProfile.adslAturThreshInterleaveRateDown!=0) && (temp<=PrevTxRate.adslAturChanPrevTxRate-AlarmConfProfile.adslAturThreshInterleaveRateDown)){ trapsflag|=ATUR_RATE_CHANGE_FLAG; PrevTxRate.adslAturChanPrevTxRate = temp; } } } } copy_to_user((char *)lon, (char *)(&trapsflag), 2); up(&mei_sema); break; #ifdef AMAZON_MEI_MIB_RFC3440 case ADSL_ATUR_EXT_TRAPS: trapsflag=0; if(AlarmConfProfileExt.adslAtucThreshold15MinFailedFastR!=0 && current_intvl->AtucPerfStatFailedFastR>=AlarmConfProfileExt.adslAtucThreshold15MinFailedFastR) trapsflag|=ATUC_15MIN_FAILED_FASTR_TRAP_FLAG; if(AlarmConfProfileExt.adslAtucThreshold15MinSesL!=0 && current_intvl->AtucPerfStatSesL>=AlarmConfProfileExt.adslAtucThreshold15MinSesL) trapsflag|=ATUC_15MIN_SESL_TRAP_FLAG; if(AlarmConfProfileExt.adslAtucThreshold15MinUasL!=0 && current_intvl->AtucPerfStatUasL>=AlarmConfProfileExt.adslAtucThreshold15MinUasL) trapsflag|=ATUC_15MIN_UASL_TRAP_FLAG; if(AlarmConfProfileExt.adslAturThreshold15MinSesL!=0 && current_intvl->AturPerfStatSesL>=AlarmConfProfileExt.adslAturThreshold15MinSesL) trapsflag|=ATUR_15MIN_SESL_TRAP_FLAG; if(AlarmConfProfileExt.adslAturThreshold15MinUasL!=0 && current_intvl->AturPerfStatUasL>=AlarmConfProfileExt.adslAturThreshold15MinUasL) trapsflag|=ATUR_15MIN_UASL_TRAP_FLAG; copy_to_user((char *)lon, (char *)(&trapsflag), 2); break; #endif // 603221:tc.chen start case GET_ADSL_LINE_STATUS: if(down_interruptible(&mei_sema)) return -ERESTARTSYS; pts.adslLineStatusInfo_pt = (adslLineStatusInfo *)kmalloc(sizeof(adslLineStatusInfo), GFP_KERNEL); copy_from_user((char *)pts.adslLineStatusInfo_pt, (char *)lon, sizeof(adslLineStatusInfo)); if(IS_FLAG_SET((&(pts.adslLineStatusInfo_pt->flags)), LINE_STAT_MODEM_STATUS_FLAG)){ LINE_STAT_MODEM_STATUS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group STAT Address 0 Index 0"); #endif pts.adslLineStatusInfo_pt->adslModemStatus = 0; } else{ pts.adslLineStatusInfo_pt->adslModemStatus = RxMessage[4]; } } if(IS_FLAG_SET((&(pts.adslLineStatusInfo_pt->flags)), LINE_STAT_MODE_SEL_FLAG)){ LINE_STAT_MODE_SEL_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group STAT Address 1 Index 0"); #endif pts.adslLineStatusInfo_pt->adslModeSelected = 0; } else{ pts.adslLineStatusInfo_pt->adslModeSelected = RxMessage[4]; } } if(IS_FLAG_SET((&(pts.adslLineStatusInfo_pt->flags)), LINE_STAT_TRELLCOD_ENABLE_FLAG)){ LINE_STAT_TRELLCOD_ENABLE_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group OPTN Address 2 Index 0"); #endif pts.adslLineStatusInfo_pt->adslTrellisCodeEnable = 0; } else{ pts.adslLineStatusInfo_pt->adslTrellisCodeEnable = (RxMessage[4]>>13)&0x1==0x1?0:1; } } if(IS_FLAG_SET((&(pts.adslLineStatusInfo_pt->flags)), LINE_STAT_LATENCY_FLAG)){ LINE_STAT_LATENCY_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group STAT Address 12 Index 0"); #endif pts.adslLineStatusInfo_pt->adslLatency = 0; } else{ pts.adslLineStatusInfo_pt->adslLatency = RxMessage[4]; } } copy_to_user((char *)lon, (char *)pts.adslLineStatusInfo_pt, sizeof(adslLineStatusInfo)); kfree(pts.adslLineStatusInfo_pt); up(&mei_sema); break; case GET_ADSL_LINE_RATE: if (showtime!=1) return -ERESTARTSYS; if(down_interruptible(&mei_sema)) return -ERESTARTSYS; pts.adslLineRateInfo_pt = (adslLineRateInfo *)kmalloc(sizeof(adslLineRateInfo), GFP_KERNEL); copy_from_user((char *)pts.adslLineRateInfo_pt, (char *)lon, sizeof(adslLineRateInfo)); if(IS_FLAG_SET((&(pts.adslLineRateInfo_pt->flags)), LINE_RATE_DATA_RATEDS_FLAG)){ if (adsl_mode <=8 && adsl_mode_extend==0) // adsl mode { if (chantype.interleave) LINE_RATE_DATA_RATEDS_FLAG_ADSL1_LP0_MAKECMV; else LINE_RATE_DATA_RATEDS_FLAG_ADSL1_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group RATE Address 1 Index 0"); #endif pts.adslLineRateInfo_pt->adslDataRateds = 0; } else{ pts.adslLineRateInfo_pt->adslDataRateds = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16); } }else // adsl 2/2+ { unsigned long Mp,Lp,Tp,Rp,Kp,Bpn,DataRate,DataRate_remain; Mp=Lp=Tp=Rp=Kp=Bpn=DataRate=DataRate_remain=0; //// up stream data rate if (chantype.interleave) { LINE_RATE_DATA_RATEUS_FLAG_ADSL2_LP_LP0_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 25 Index 0"); #endif Lp = 0; }else Lp=RxMessage[4]; LINE_RATE_DATA_RATEUS_FLAG_ADSL2_RP_LP0_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 23 Index 0"); #endif Rp = 0; }else Rp=RxMessage[4]; LINE_RATE_DATA_RATEUS_FLAG_ADSL2_MP_LP0_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 24 Index 0"); #endif Mp = 0; }else Mp=RxMessage[4]; LINE_RATE_DATA_RATEUS_FLAG_ADSL2_TP_LP0_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 26 Index 0"); #endif Tp = 0; }else Tp=RxMessage[4]; LINE_RATE_DATA_RATEUS_FLAG_ADSL2_KP_LP0_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 28 Index 0"); #endif Kp = 0; }else { Kp=RxMessage[4]+ RxMessage[5]+1; Bpn=RxMessage[4]+ RxMessage[5]; } }else { LINE_RATE_DATA_RATEUS_FLAG_ADSL2_LP_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 25 Index 1"); #endif Lp = 0; }else Lp=RxMessage[4]; LINE_RATE_DATA_RATEUS_FLAG_ADSL2_RP_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 23 Index 1"); #endif Rp = 0; }else Rp=RxMessage[4]; LINE_RATE_DATA_RATEUS_FLAG_ADSL2_MP_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 24 Index 1"); #endif Mp = 0; }else Mp=RxMessage[4]; LINE_RATE_DATA_RATEUS_FLAG_ADSL2_TP_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 26 Index 1"); #endif Tp = 0; }else Tp=RxMessage[4]; LINE_RATE_DATA_RATEUS_FLAG_ADSL2_KP_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 28 Index 2"); #endif Kp = 0; }else { Kp=RxMessage[4]+ RxMessage[5]+1; Bpn=RxMessage[4]+ RxMessage[5]; } } DataRate=((Tp*(Bpn+1)-1)*Mp*Lp*4)/(Tp*(Kp*Mp+Rp)); //DataRate_remain=((((Tp*(Bpn+1)-1)*Mp*Lp*4)%(Tp*(Kp*Mp+Rp)))*1000)/(Tp*(Kp*Mp+Rp)); //pts.adslLineRateInfo_pt->adslDataRateds = DataRate * 1000 + DataRate_remain; pts.adslLineRateInfo_pt->adslDataRateds = DataRate; } } if(IS_FLAG_SET((&(pts.adslLineRateInfo_pt->flags)), LINE_RATE_DATA_RATEUS_FLAG)){ if (adsl_mode <=8 && adsl_mode_extend==0) // adsl mode { if (chantype.interleave) LINE_RATE_DATA_RATEUS_FLAG_ADSL1_LP0_MAKECMV; else LINE_RATE_DATA_RATEUS_FLAG_ADSL1_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group RATE Address 0 Index 0"); #endif pts.adslLineRateInfo_pt->adslDataRateus = 0; } else{ pts.adslLineRateInfo_pt->adslDataRateus = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16); } }else // adsl 2/2+ { unsigned long Mp,Lp,Tp,Rp,Kp,Bpn,DataRate,DataRate_remain; Mp=Lp=Tp=Rp=Kp=Bpn=DataRate=DataRate_remain=0; //// down stream data rate if (chantype.interleave) { LINE_RATE_DATA_RATEDS_FLAG_ADSL2_LP_LP0_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 14 Index 0"); #endif Lp = 0; }else Lp=RxMessage[4]; LINE_RATE_DATA_RATEDS_FLAG_ADSL2_RP_LP0_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 12 Index 0"); #endif Rp = 0; }else Rp=RxMessage[4]; LINE_RATE_DATA_RATEDS_FLAG_ADSL2_MP_LP0_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 13 Index 0"); #endif Mp = 0; }else Mp=RxMessage[4]; LINE_RATE_DATA_RATEDS_FLAG_ADSL2_TP_LP0_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 15 Index 0"); #endif Tp = 0; }else Tp=RxMessage[4]; LINE_RATE_DATA_RATEDS_FLAG_ADSL2_KP_LP0_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 17 Index 0"); #endif Kp = 0; }else { Kp=RxMessage[4]+ RxMessage[5]+1; Bpn=RxMessage[4]+ RxMessage[5]; } }else { LINE_RATE_DATA_RATEDS_FLAG_ADSL2_LP_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 14 Index 1"); #endif Lp = 0; }else Lp=RxMessage[4]; LINE_RATE_DATA_RATEDS_FLAG_ADSL2_RP_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 12 Index 1"); #endif Rp = 0; }else Rp=RxMessage[4]; LINE_RATE_DATA_RATEDS_FLAG_ADSL2_MP_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 13 Index 1"); #endif Mp = 0; }else Mp=RxMessage[4]; LINE_RATE_DATA_RATEDS_FLAG_ADSL2_TP_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 15 Index 1"); #endif Tp = 0; }else Tp=RxMessage[4]; LINE_RATE_DATA_RATEDS_FLAG_ADSL2_KP_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 17 Index 2"); #endif Kp = 0; }else { Kp=RxMessage[4]+ RxMessage[5]+1; Bpn=RxMessage[4]+ RxMessage[5]; } } DataRate=((Tp*(Bpn+1)-1)*Mp*Lp*4)/(Tp*(Kp*Mp+Rp)); //DataRate_remain=((((Tp*(Bpn+1)-1)*Mp*Lp*4)%(Tp*(Kp*Mp+Rp)))*1000)/(Tp*(Kp*Mp+Rp)); //pts.adslLineRateInfo_pt->adslDataRateus = DataRate * 1000 + DataRate_remain; pts.adslLineRateInfo_pt->adslDataRateus = DataRate; } } if(IS_FLAG_SET((&(pts.adslLineRateInfo_pt->flags)), LINE_RATE_ATTNDRDS_FLAG)){ LINE_RATE_ATTNDRDS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 68 Index 4"); #endif pts.adslLineRateInfo_pt->adslATTNDRds = 0; } else{ pts.adslLineRateInfo_pt->adslATTNDRds = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16); } } if(IS_FLAG_SET((&(pts.adslLineRateInfo_pt->flags)), LINE_RATE_ATTNDRUS_FLAG)){ if (adsl_mode <=8 && adsl_mode_extend==0) // adsl mode { LINE_RATE_ATTNDRUS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 69 Index 4"); #endif pts.adslLineRateInfo_pt->adslATTNDRus = 0; } else{ pts.adslLineRateInfo_pt->adslATTNDRus = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16); } }else { hdlc_cmd[0]=0x0181; hdlc_cmd[1]=0x24; up(&mei_sema); if (ifx_me_hdlc_send((unsigned char *)&hdlc_cmd[0],4)!= -EBUSY) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1); hdlc_rx_len=0; hdlc_rx_len = ifx_mei_hdlc_read(&hdlc_rx_buffer,32*2); if (hdlc_rx_len <=0) { meierr = -ERESTARTSYS; goto GET_ADSL_LINE_RATE_END; } pts.adslLineRateInfo_pt->adslATTNDRus = (u32)le16_to_cpu(hdlc_rx_buffer[1])<<16 | (u32)le16_to_cpu(hdlc_rx_buffer[2]); } if(down_interruptible(&mei_sema)) { meierr = -ERESTARTSYS; goto GET_ADSL_LINE_RATE_END; } } } copy_to_user((char *)lon, (char *)pts.adslLineRateInfo_pt, sizeof(adslLineRateInfo)); up(&mei_sema); GET_ADSL_LINE_RATE_END: kfree(pts.adslLineRateInfo_pt); break; case GET_ADSL_LINE_INFO: if (showtime!=1) return -ERESTARTSYS; if(down_interruptible(&mei_sema)) return -ERESTARTSYS; pts.adslLineInfo_pt = (adslLineInfo *)kmalloc(sizeof(adslLineInfo), GFP_KERNEL); copy_from_user((char *)pts.adslLineInfo_pt, (char *)lon, sizeof(adslLineInfo)); if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_INTLV_DEPTHDS_FLAG)){ if (chantype.interleave) LINE_INFO_INTLV_DEPTHDS_FLAG_LP0_MAKECMV; else LINE_INFO_INTLV_DEPTHDS_FLAG_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 27 Index 0"); #endif pts.adslLineInfo_pt->adslInterleaveDepthds = 0; } else{ pts.adslLineInfo_pt->adslInterleaveDepthds = RxMessage[4]; } } if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_INTLV_DEPTHUS_FLAG)){ if (chantype.interleave) LINE_INFO_INTLV_DEPTHUS_FLAG_LP0_MAKECMV; else LINE_INFO_INTLV_DEPTHUS_FLAG_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group CNFG Address 16 Index 0"); #endif pts.adslLineInfo_pt->adslInterleaveDepthus = 0; } else{ pts.adslLineInfo_pt->adslInterleaveDepthus = RxMessage[4]; } } if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_LATNDS_FLAG)){ LINE_INFO_LATNDS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 68 Index 1"); #endif pts.adslLineInfo_pt->adslLATNds = 0; } else{ pts.adslLineInfo_pt->adslLATNds = RxMessage[4]; } } if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_LATNUS_FLAG)){ if (adsl_mode <=8 && adsl_mode_extend==0) // adsl mode { LINE_INFO_LATNUS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 69 Index 1"); #endif pts.adslLineInfo_pt->adslLATNus = 0; } else{ pts.adslLineInfo_pt->adslLATNus = RxMessage[4]; } }else { hdlc_cmd[0]=0x0181; hdlc_cmd[1]=0x21; up(&mei_sema); if (ifx_me_hdlc_send((unsigned char *)&hdlc_cmd[0],4)!= -EBUSY) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1); hdlc_rx_len=0; hdlc_rx_len = ifx_mei_hdlc_read(&hdlc_rx_buffer,32*2); if (hdlc_rx_len <=0) { meierr = -ERESTARTSYS; goto GET_ADSL_LINE_INFO_END; } pts.adslLineInfo_pt->adslLATNus = le16_to_cpu(hdlc_rx_buffer[1]); } if(down_interruptible(&mei_sema)) { meierr = -ERESTARTSYS; goto GET_ADSL_LINE_INFO_END; } } } if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_SATNDS_FLAG)){ LINE_INFO_SATNDS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 68 Index 2"); #endif pts.adslLineInfo_pt->adslSATNds = 0; } else{ pts.adslLineInfo_pt->adslSATNds = RxMessage[4]; } } if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_SATNUS_FLAG)){ if (adsl_mode <=8 && adsl_mode_extend==0) // adsl mode { LINE_INFO_SATNUS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 69 Index 2"); #endif pts.adslLineInfo_pt->adslSATNus = 0; } else{ pts.adslLineInfo_pt->adslSATNus = RxMessage[4]; } }else { hdlc_cmd[0]=0x0181; hdlc_cmd[1]=0x22; up(&mei_sema); if (ifx_me_hdlc_send((unsigned char *)&hdlc_cmd[0],4)!= -EBUSY) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1); hdlc_rx_len=0; hdlc_rx_len = ifx_mei_hdlc_read(&hdlc_rx_buffer,32*2); if (hdlc_rx_len <=0) { meierr = -ERESTARTSYS; goto GET_ADSL_LINE_INFO_END; } pts.adslLineInfo_pt->adslSATNus = le16_to_cpu(hdlc_rx_buffer[1]); } if(down_interruptible(&mei_sema)) { meierr = -ERESTARTSYS; goto GET_ADSL_LINE_INFO_END; } } } if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_SNRMNDS_FLAG)){ if (adsl_mode <=8 && adsl_mode_extend==0) // adsl mode { LINE_INFO_SNRMNDS_FLAG_ADSL1_MAKECMV; } else if ((adsl_mode == 0x4000) || (adsl_mode == 0x8000) || adsl_mode_extend > 0) { LINE_INFO_SNRMNDS_FLAG_ADSL2PLUS_MAKECMV; } else { LINE_INFO_SNRMNDS_FLAG_ADSL2_MAKECMV; } if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 68 Index 3"); #endif pts.adslLineInfo_pt->adslSNRMds = 0; } else{ if (adsl_mode>8 || adsl_mode_extend>0) { int SNRMds,SNRMds_remain; SNRMds=RxMessage[4]; SNRMds_remain=((SNRMds&0xff)*1000)/256; SNRMds=(SNRMds>>8)&0xff; if ((SNRMds_remain%100)>=50) SNRMds_remain=(SNRMds_remain/100)+1; else SNRMds_remain=(SNRMds_remain/100); pts.adslLineInfo_pt->adslSNRMds = SNRMds*10 + SNRMds_remain; }else { pts.adslLineInfo_pt->adslSNRMds = RxMessage[4]; } } } if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_SNRMNUS_FLAG)){ if (adsl_mode <=8 && adsl_mode_extend == 0) { LINE_INFO_SNRMNUS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 69 Index 3"); #endif pts.adslLineInfo_pt->adslSNRMus = 0; } else{ pts.adslLineInfo_pt->adslSNRMus = RxMessage[4]; } }else { hdlc_cmd[0]=0x0181; hdlc_cmd[1]=0x23; up(&mei_sema); if (ifx_me_hdlc_send((unsigned char *)&hdlc_cmd[0],4)!= -EBUSY) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1); hdlc_rx_len=0; hdlc_rx_len = ifx_mei_hdlc_read(&hdlc_rx_buffer,32*2); if (hdlc_rx_len <=0) { meierr = -ERESTARTSYS; goto GET_ADSL_LINE_INFO_END; } pts.adslLineInfo_pt->adslSNRMus = le16_to_cpu(hdlc_rx_buffer[1]); } if(down_interruptible(&mei_sema)) { meierr = -ERESTARTSYS; goto GET_ADSL_LINE_INFO_END; } } } if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_ACATPDS_FLAG)){ if (adsl_mode <=8 && adsl_mode_extend == 0) { LINE_INFO_ACATPDS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 68 Index 6"); #endif pts.adslLineInfo_pt->adslACATPds = 0; } else{ pts.adslLineInfo_pt->adslACATPds = RxMessage[4]; } }else { hdlc_cmd[0]=0x0181; hdlc_cmd[1]=0x25; up(&mei_sema); if (ifx_me_hdlc_send((unsigned char *)&hdlc_cmd[0],4)!= -EBUSY) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1); hdlc_rx_len=0; hdlc_rx_len = ifx_mei_hdlc_read(&hdlc_rx_buffer,32*2); if (hdlc_rx_len <=0) { meierr = -ERESTARTSYS; goto GET_ADSL_LINE_INFO_END; } pts.adslLineInfo_pt->adslACATPds = le16_to_cpu(hdlc_rx_buffer[1]); } if(down_interruptible(&mei_sema)) { meierr = -ERESTARTSYS; goto GET_ADSL_LINE_INFO_END; } } } if(IS_FLAG_SET((&(pts.adslLineInfo_pt->flags)), LINE_INFO_ACATPUS_FLAG)){ if (adsl_mode <=8 && adsl_mode_extend == 0) { LINE_INFO_ACATPUS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 69 Index 6"); #endif pts.adslLineInfo_pt->adslACATPus = 0; } else{ pts.adslLineInfo_pt->adslACATPus = RxMessage[4]; } }else { hdlc_cmd[0]=0x0181; hdlc_cmd[1]=0x26; up(&mei_sema); if (ifx_me_hdlc_send((unsigned char *)&hdlc_cmd[0],4)!= -EBUSY) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1); hdlc_rx_len=0; hdlc_rx_len = ifx_mei_hdlc_read(&hdlc_rx_buffer,32*2); if (hdlc_rx_len <=0) { meierr = -ERESTARTSYS; goto GET_ADSL_LINE_INFO_END; } pts.adslLineInfo_pt->adslACATPus = le16_to_cpu(hdlc_rx_buffer[1]); } if(down_interruptible(&mei_sema)) { meierr = -ERESTARTSYS; goto GET_ADSL_LINE_INFO_END; } } } copy_to_user((char *)lon, (char *)pts.adslLineInfo_pt, sizeof(adslLineInfo)); up(&mei_sema); GET_ADSL_LINE_INFO_END: kfree(pts.adslLineInfo_pt); break; case GET_ADSL_NEAREND_STATS: if (showtime!=1) return -ERESTARTSYS; if(down_interruptible(&mei_sema)) return -ERESTARTSYS; pts.adslNearEndPerfStats_pt = (adslNearEndPerfStats *)kmalloc(sizeof(adslNearEndPerfStats), GFP_KERNEL); copy_from_user((char *)pts.adslNearEndPerfStats_pt, (char *)lon, sizeof(adslNearEndPerfStats)); if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_SUPERFRAME_FLAG)){ NEAREND_PERF_SUPERFRAME_FLAG_LSW_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 20 Index 0"); #endif pts.adslNearEndPerfStats_pt->adslSuperFrames = 0; } else{ pts.adslNearEndPerfStats_pt->adslSuperFrames = (u32)(RxMessage[4]); } NEAREND_PERF_SUPERFRAME_FLAG_MSW_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 21 Index 0"); #endif pts.adslNearEndPerfStats_pt->adslSuperFrames = 0; } else{ pts.adslNearEndPerfStats_pt->adslSuperFrames += (((u32)(RxMessage[4]))<<16); } } if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LOS_FLAG) || IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LOF_FLAG) || IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LPR_FLAG) || IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_NCD_FLAG) || IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LCD_FLAG) ){ NEAREND_PERF_LOS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 0 Index 0"); #endif RxMessage[4] = 0; } if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LOS_FLAG)){ if( (RxMessage[4]&0x1) == 0x1) pts.adslNearEndPerfStats_pt->adslneLOS = 1; else pts.adslNearEndPerfStats_pt->adslneLOS = 0; } if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LOF_FLAG)){ if( (RxMessage[4]&0x2) == 0x2) pts.adslNearEndPerfStats_pt->adslneLOF = 1; else pts.adslNearEndPerfStats_pt->adslneLOF = 0; } if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LPR_FLAG)){ if( (RxMessage[4]&0x4) == 0x4) pts.adslNearEndPerfStats_pt->adslneLPR = 1; else pts.adslNearEndPerfStats_pt->adslneLPR = 0; } if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_NCD_FLAG)){ pts.adslNearEndPerfStats_pt->adslneNCD = (RxMessage[4]>>4)&0x3; } if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LCD_FLAG)){ pts.adslNearEndPerfStats_pt->adslneLCD = (RxMessage[4]>>6)&0x3; } } if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_CRC_FLAG)){ if (chantype.interleave) NEAREND_PERF_CRC_FLAG_LP0_MAKECMV; else NEAREND_PERF_CRC_FLAG_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 2 Index 0"); #endif pts.adslNearEndPerfStats_pt->adslneCRC = 0; } else{ pts.adslNearEndPerfStats_pt->adslneCRC = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16); } } if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_RSCORR_FLAG)){ if (chantype.interleave) NEAREND_PERF_RSCORR_FLAG_LP0_MAKECMV; else NEAREND_PERF_RSCORR_FLAG_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 3 Index 0"); #endif pts.adslNearEndPerfStats_pt->adslneRSCorr = 0; } else{ pts.adslNearEndPerfStats_pt->adslneRSCorr = RxMessage[4]; } } if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_FECS_FLAG)){ NEAREND_PERF_FECS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 6 Index 0"); #endif pts.adslNearEndPerfStats_pt->adslneFECS = 0; } else{ pts.adslNearEndPerfStats_pt->adslneFECS = RxMessage[4]; } } if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_ES_FLAG)){ NEAREND_PERF_ES_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 7 Index 0"); #endif pts.adslNearEndPerfStats_pt->adslneES = 0; } else{ pts.adslNearEndPerfStats_pt->adslneES = RxMessage[4]; } } if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_SES_FLAG)){ NEAREND_PERF_SES_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 8 Index 0"); #endif pts.adslNearEndPerfStats_pt->adslneSES = 0; } else{ pts.adslNearEndPerfStats_pt->adslneSES = RxMessage[4]; } } if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_LOSS_FLAG)){ NEAREND_PERF_LOSS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 9 Index 0"); #endif pts.adslNearEndPerfStats_pt->adslneLOSS = 0; } else{ pts.adslNearEndPerfStats_pt->adslneLOSS = RxMessage[4]; } } if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_UAS_FLAG)){ NEAREND_PERF_UAS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 10 Index 0"); #endif pts.adslNearEndPerfStats_pt->adslneUAS = 0; } else{ pts.adslNearEndPerfStats_pt->adslneUAS = RxMessage[4]; } } if(IS_FLAG_SET((&(pts.adslNearEndPerfStats_pt->flags)), NEAREND_PERF_HECERR_FLAG)){ if (chantype.bearchannel0) { NEAREND_PERF_HECERR_FLAG_BC0_MAKECMV; }else if (chantype.bearchannel1) { NEAREND_PERF_HECERR_FLAG_BC1_MAKECMV; } if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 11 Index 0"); #endif pts.adslNearEndPerfStats_pt->adslneHECErrors = 0; } else{ pts.adslNearEndPerfStats_pt->adslneHECErrors = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16); } } copy_to_user((char *)lon, (char *)pts.adslNearEndPerfStats_pt, sizeof(adslNearEndPerfStats)); kfree(pts.adslNearEndPerfStats_pt); up(&mei_sema); break; case GET_ADSL_FAREND_STATS: if (showtime!=1) return -ERESTARTSYS; if (adsl_mode>8 || adsl_mode_extend > 0) { do_gettimeofday(&time_now); if( FarendData_acquire_time.tv_sec==0 || time_now.tv_sec - FarendData_acquire_time.tv_sec>=1) { hdlc_cmd[0]=0x105; if (ifx_me_hdlc_send((unsigned char *)&hdlc_cmd[0],2)!= -EBUSY) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1); hdlc_rx_len=0; hdlc_rx_len = ifx_mei_hdlc_read(&hdlc_rx_buffer,32*2); if (hdlc_rx_len <=0) { return -ERESTARTSYS; } FarendStatsData.adslfeRSCorr = ((u32)le16_to_cpu(hdlc_rx_buffer[1]) << 16) + (u32)le16_to_cpu(hdlc_rx_buffer[2]); FarendStatsData.adslfeCRC = ((u32)le16_to_cpu(hdlc_rx_buffer[3]) << 16) + (u32)le16_to_cpu(hdlc_rx_buffer[4]); FarendStatsData.adslfeFECS = ((u32)le16_to_cpu(hdlc_rx_buffer[5]) << 16) + (u32)le16_to_cpu(hdlc_rx_buffer[6]); FarendStatsData.adslfeES = ((u32)le16_to_cpu(hdlc_rx_buffer[7]) << 16) + (u32)le16_to_cpu(hdlc_rx_buffer[8]); FarendStatsData.adslfeSES = ((u32)le16_to_cpu(hdlc_rx_buffer[9]) << 16) + (u32)le16_to_cpu(hdlc_rx_buffer[10]); FarendStatsData.adslfeLOSS = ((u32)le16_to_cpu(hdlc_rx_buffer[11]) << 16) + (u32)le16_to_cpu(hdlc_rx_buffer[12]); FarendStatsData.adslfeUAS = ((u32)le16_to_cpu(hdlc_rx_buffer[13]) << 16) + (u32)le16_to_cpu(hdlc_rx_buffer[14]); do_gettimeofday(&FarendData_acquire_time); } } } if(down_interruptible(&mei_sema)) return -ERESTARTSYS; pts.adslFarEndPerfStats_pt = (adslFarEndPerfStats *)kmalloc(sizeof(adslFarEndPerfStats), GFP_KERNEL); copy_from_user((char *)pts.adslFarEndPerfStats_pt, (char *)lon, sizeof(adslFarEndPerfStats)); if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LOS_FLAG) || IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LOF_FLAG) || IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LPR_FLAG) || IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_NCD_FLAG) || IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LCD_FLAG) ){ FAREND_PERF_LOS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 1 Index 0"); #endif RxMessage[4] = 0; } if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LOS_FLAG)){ if((RxMessage[4]&0x1) == 0x1) pts.adslFarEndPerfStats_pt->adslfeLOS = 1; else pts.adslFarEndPerfStats_pt->adslfeLOS = 0; } if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LOF_FLAG)){ if((RxMessage[4]&0x2) == 0x2) pts.adslFarEndPerfStats_pt->adslfeLOF = 1; else pts.adslFarEndPerfStats_pt->adslfeLOF = 0; } if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LPR_FLAG)){ if((RxMessage[4]&0x4) == 0x4) pts.adslFarEndPerfStats_pt->adslfeLPR = 1; else pts.adslFarEndPerfStats_pt->adslfeLPR = 0; } if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_NCD_FLAG)){ pts.adslFarEndPerfStats_pt->adslfeNCD = (RxMessage[4]>>4)&0x3; } if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LCD_FLAG)){ pts.adslFarEndPerfStats_pt->adslfeLCD = (RxMessage[4]>>6)&0x3; } } if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_CRC_FLAG)){ if (adsl_mode<=8 && adsl_mode_extend == 0) { if (chantype.interleave) { FAREND_PERF_CRC_FLAG_LP0_MAKECMV; } else { FAREND_PERF_CRC_FLAG_LP1_MAKECMV; } if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 24 Index 0"); #endif pts.adslFarEndPerfStats_pt->adslfeCRC = 0; } else{ pts.adslFarEndPerfStats_pt->adslfeCRC = RxMessage[4]; } }else { pts.adslFarEndPerfStats_pt->adslfeCRC = FarendStatsData.adslfeCRC; } } if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_RSCORR_FLAG)){ if (adsl_mode<=8 && adsl_mode_extend == 0) { if (chantype.interleave) FAREND_PERF_RSCORR_FLAG_LP0_MAKECMV; else FAREND_PERF_RSCORR_FLAG_LP1_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 28 Index 0"); #endif pts.adslFarEndPerfStats_pt->adslfeRSCorr = 0; } else{ pts.adslFarEndPerfStats_pt->adslfeRSCorr = RxMessage[4]; } } else { pts.adslFarEndPerfStats_pt->adslfeRSCorr = FarendStatsData.adslfeRSCorr; } } if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_FECS_FLAG)){ if (adsl_mode<=8 && adsl_mode_extend == 0) { FAREND_PERF_FECS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 32 Index 0"); #endif pts.adslFarEndPerfStats_pt->adslfeFECS = 0; } else{ pts.adslFarEndPerfStats_pt->adslfeFECS = RxMessage[4]; } }else { pts.adslFarEndPerfStats_pt->adslfeFECS = FarendStatsData.adslfeFECS; } } if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_ES_FLAG)){ if (adsl_mode<=8 && adsl_mode_extend == 0) { FAREND_PERF_ES_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 33 Index 0"); #endif pts.adslFarEndPerfStats_pt->adslfeES = 0; } else{ pts.adslFarEndPerfStats_pt->adslfeES = RxMessage[4]; } }else { pts.adslFarEndPerfStats_pt->adslfeES = FarendStatsData.adslfeES; } } if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_SES_FLAG)){ if (adsl_mode<=8 && adsl_mode_extend == 0) { FAREND_PERF_SES_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 34 Index 0"); #endif pts.adslFarEndPerfStats_pt->adslfeSES = 0; } else{ pts.adslFarEndPerfStats_pt->adslfeSES = RxMessage[4]; } }else { pts.adslFarEndPerfStats_pt->adslfeSES = FarendStatsData.adslfeSES; } } if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_LOSS_FLAG)){ if (adsl_mode<=8 && adsl_mode_extend == 0) { FAREND_PERF_LOSS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 35 Index 0"); #endif pts.adslFarEndPerfStats_pt->adslfeLOSS = 0; } else{ pts.adslFarEndPerfStats_pt->adslfeLOSS = RxMessage[4]; } }else { pts.adslFarEndPerfStats_pt->adslfeLOSS = FarendStatsData.adslfeLOSS; } } if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_UAS_FLAG)){ if (adsl_mode<=8 && adsl_mode_extend == 0) { FAREND_PERF_UAS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 36 Index 0"); #endif pts.adslFarEndPerfStats_pt->adslfeUAS = 0; } else{ pts.adslFarEndPerfStats_pt->adslfeUAS = RxMessage[4]; } }else { pts.adslFarEndPerfStats_pt->adslfeUAS = FarendStatsData.adslfeUAS; } } if(IS_FLAG_SET((&(pts.adslFarEndPerfStats_pt->flags)), FAREND_PERF_HECERR_FLAG)){ if (chantype.bearchannel0) { FAREND_PERF_HECERR_FLAG_BC0_MAKECMV; }else if (chantype.bearchannel1) { FAREND_PERF_HECERR_FLAG_BC1_MAKECMV; } if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 37 Index 0"); #endif pts.adslFarEndPerfStats_pt->adslfeHECErrors = 0; } else{ pts.adslFarEndPerfStats_pt->adslfeHECErrors = (u32)(RxMessage[4]) + (((u32)(RxMessage[5]))<<16); } } copy_to_user((char *)lon, (char *)pts.adslFarEndPerfStats_pt, sizeof(adslFarEndPerfStats)); kfree(pts.adslFarEndPerfStats_pt); up(&mei_sema); break; // 603221:tc.chen end case GET_ADSL_LOOP_DIAGNOSTICS_MODE: //lon = loop_diagnostics_mode; copy_to_user((char *)lon, (char *)&loop_diagnostics_mode, sizeof(int)); break; //>> SHC case IS_ADSL_LOOP_DIAGNOSTICS_MODE_COMPLETE: copy_to_user((char *)lon, (char *)&loop_diagnostics_completed, sizeof(int)); break; //<< end SHC case LOOP_DIAGNOSTIC_MODE_COMPLETE: loop_diagnostics_completed = 1; // read adsl mode makeCMV(H2D_CMV_READ, STAT, 1, 0, 1, data); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group STAT Address 1 Index 0"); #endif } adsl_mode = RxMessage[4]; makeCMV(H2D_CMV_READ, STAT, 17, 0, 1, data); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group STAT Address 1 Index 0"); #endif } adsl_mode_extend = RxMessage[4]; wake_up_interruptible(&wait_queue_loop_diagnostic); break; case SET_ADSL_LOOP_DIAGNOSTICS_MODE: if (lon != loop_diagnostics_mode) { loop_diagnostics_completed = 0; loop_diagnostics_mode = lon; mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_REBOOT, NULL); } break; case GET_ADSL_ATUR_SUBCARRIER_STATS: if (loop_diagnostics_completed == 0) { interruptible_sleep_on_timeout(&wait_queue_loop_diagnostic,300*HZ); if (loop_diagnostics_completed==0) { return -ERESTARTSYS; } } if(down_interruptible(&mei_sema)) return -ERESTARTSYS; pts.adslATURSubcarrierInfo_pt = (adslATURSubcarrierInfo *)kmalloc(sizeof(adslATURSubcarrierInfo), GFP_KERNEL); copy_from_user((char *)pts.adslATURSubcarrierInfo_pt, (char *)lon, sizeof(adslATURSubcarrierInfo)); if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)), FAREND_HLINSC)){ FAREND_HLINSC_MAKECMV(H2D_CMV_READ); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 35 Index 0"); #endif pts.adslATURSubcarrierInfo_pt->HLINSCds = 0; } else{ pts.adslATURSubcarrierInfo_pt->HLINSCds = RxMessage[4]; } } if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)), FAREND_HLINPS)){ int index=0,size=12; //printk("FAREND_HLINPS\n"); for (index=0;index<1024;index+=size) { if (index+size>=1024) size = 1024-index; FAREND_HLINPS_MAKECMV(H2D_CMV_READ,index,size); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 35 Index 0"); #endif } else{ memcpy(&pts.adslATURSubcarrierInfo_pt->HLINpsds[index],&RxMessage[4],size*2); #if 0 int msg_idx; for(msg_idx=0;msg_idxflags)), FAREND_HLOGMT)){ FAREND_HLOGMT_MAKECMV(H2D_CMV_READ); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 35 Index 0"); #endif pts.adslATURSubcarrierInfo_pt->HLOGMTds = 0; } else{ pts.adslATURSubcarrierInfo_pt->HLOGMTds = RxMessage[4]; } } ///////////////////////////////////////////////////////////////////////// if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)), FAREND_HLOGPS)){ //printk("FAREND_HLOGPS\n"); int index=0,size=12; for (index=0;index<256;index+=size) { if (index+size>=256) size = 256-index; FAREND_HLOGPS_MAKECMV(H2D_CMV_READ,index,size); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 35 Index 0"); #endif } else{ if (adsl_mode < 0x4000 && adsl_mode_extend==0)//adsl2 mode { memcpy(&pts.adslATURSubcarrierInfo_pt->HLOGpsds[index],&RxMessage[4],size*2); }else { int msg_idx=0; for (msg_idx=0;msg_idxHLOGpsds[(index+msg_idx)*2+1] = RxMessage[4+msg_idx]; //printk("index:%d ,cmv_result: %04X\n",index+msg_idx,RxMessage[4+msg_idx]); } } } } if (adsl_mode >= 0x4000 || adsl_mode_extend >0)//adsl2+ mode { pts.adslATURSubcarrierInfo_pt->HLOGpsds[0] = pts.adslATURSubcarrierInfo_pt->HLOGpsds[1]; for (index=1;index<256;index++) { pts.adslATURSubcarrierInfo_pt->HLOGpsds[index*2] = (pts.adslATURSubcarrierInfo_pt->HLOGpsds[(index)*2-1] + pts.adslATURSubcarrierInfo_pt->HLOGpsds[(index)*2+1] +1) >>1; } } } if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)), FAREND_QLNMT)){ FAREND_QLNMT_MAKECMV(H2D_CMV_READ); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 35 Index 0"); #endif pts.adslATURSubcarrierInfo_pt->QLNMTds = 0; } else{ pts.adslATURSubcarrierInfo_pt->QLNMTds = RxMessage[4]; } } ///////////////////////////////////////////////////////////////////////// if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)), FAREND_QLNPS)){ int index=0,size=12; //printk("FAREND_QLNPS\n"); for (index=0;index<128;index+=size) { if (index+size>=128) size = 128-index; FAREND_QLNPS_MAKECMV(H2D_CMV_READ,index,size); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 35 Index 0"); #endif } else{ int msg_idx=0; for (msg_idx=0;msg_idxQLNpsds[index],&RxMessage[4],size*2); if (adsl_mode < 0x4000 && adsl_mode_extend==0)//adsl2 mode { pts.adslATURSubcarrierInfo_pt->QLNpsds[(index+msg_idx)*2] = (u16)(RxMessage[4+msg_idx]&0xFF); pts.adslATURSubcarrierInfo_pt->QLNpsds[(index+msg_idx)*2+1] = (u16)((RxMessage[4+msg_idx]>>8)&0xFF); }else { pts.adslATURSubcarrierInfo_pt->QLNpsds[(index+msg_idx)*4+1] = (u16)(RxMessage[4+msg_idx]&0xFF); pts.adslATURSubcarrierInfo_pt->QLNpsds[(index+msg_idx)*4+3] = (u16)((RxMessage[4+msg_idx]>>8)&0xFF); //printk("index:%d ,cmv_result: %04X\n",index+msg_idx,RxMessage[4+msg_idx]); } } } } if (adsl_mode >= 0x4000 || adsl_mode_extend >0)//adsl2+ mode { pts.adslATURSubcarrierInfo_pt->QLNpsds[0] = pts.adslATURSubcarrierInfo_pt->QLNpsds[1]; for (index=1;index<256;index++) { pts.adslATURSubcarrierInfo_pt->QLNpsds[index*2] = (pts.adslATURSubcarrierInfo_pt->QLNpsds[(index)*2-1] + pts.adslATURSubcarrierInfo_pt->QLNpsds[(index)*2+1]) >>1; } } } if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)), FAREND_SNRMT)){ FAREND_SNRMT_MAKECMV(H2D_CMV_READ); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 35 Index 0"); #endif pts.adslATURSubcarrierInfo_pt->SNRMTds = 0; } else{ pts.adslATURSubcarrierInfo_pt->SNRMTds = RxMessage[4]; } } if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)), FAREND_SNRPS)){ int index=0,size=12; //printk("FAREND_SNRPS\n"); for (index=0;index<512;index+=size) { if (index+size>=512) size = 512-index; FAREND_SNRPS_MAKECMV(H2D_CMV_READ,index,size); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 35 Index 0"); #endif } else{ //memcpy(&pts.adslATURSubcarrierInfo_pt->SNRpsds[index],&RxMessage[4],size*2); int msg_idx=0; for (msg_idx=0;msg_idxSNRpsds[index+msg_idx] = (u16)(RxMessage[4+msg_idx]&0xFF); //printk("index:%d ,cmv_result: %04X\n",index+msg_idx,RxMessage[4+msg_idx]); } } } } if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)), FAREND_BITPS)){ int index=0,size=12; //printk("FAREND_BITPS\n"); for (index=0;index<256;index+=size) { if (index+size>=256) size = 256-index; FAREND_BITPS_MAKECMV(H2D_CMV_READ,index,size); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 35 Index 0"); #endif } else{ int msg_idx=0; for (msg_idx=0;msg_idxBITpsds[(index+msg_idx)*2] = (u16)(RxMessage[4+msg_idx]&0xFF); pts.adslATURSubcarrierInfo_pt->BITpsds[(index+msg_idx)*2+1] = (u16)((RxMessage[4+msg_idx]>>8)&0xFF); //printk("index:%d ,cmv_result: %04X, %d\n",index+msg_idx,RxMessage[4+msg_idx],RxMessage[4+msg_idx]); } } } } if(IS_FLAG_SET((&(pts.adslATURSubcarrierInfo_pt->flags)), FAREND_GAINPS)){ int index=0,size=12; //printk("FAREND_GAINPS\n"); for (index=0;index<512;index+=size) { FAREND_GAINPS_MAKECMV(H2D_CMV_READ,index,size); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 35 Index 0"); #endif } else{ /* int msg_idx=0; for (msg_idx=0;msg_idxGAINpsds[(index+msg_idx)*2] = RxMessage[4+msg_idx]&0xFF; pts.adslATURSubcarrierInfo_pt->GAINpsds[(index+msg_idx)*2+1] = (RxMessage[4+msg_idx]>>8)&0xFF; } */ memcpy(&pts.adslATURSubcarrierInfo_pt->GAINpsds[index],&RxMessage[4],size*2); #if 0 int msg_idx=0; for (msg_idx=0;msg_idxflags)), NEAREND_HLINSC)){ NEAREND_HLINSC_MAKECMV(H2D_CMV_READ); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 71 Index 2"); #endif pts.adslATUCSubcarrierInfo_pt->HLINSCus = 0; } else{ pts.adslATUCSubcarrierInfo_pt->HLINSCus = RxMessage[4]; } } if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)), NEAREND_HLINPS)){ int index=0,size=12; //printk("NEAREND_HLINPS\n"); for (index=0;index<128;index+=size) { if (index+size>=128) size = 128-index; NEAREND_HLINPS_MAKECMV(H2D_CMV_READ,index,size); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 73 Index 0"); #endif } else{ memcpy(&pts.adslATUCSubcarrierInfo_pt->HLINpsus[index],&RxMessage[4],size*2); #if 0 int msg_idx; for (msg_idx=0;msg_idxflags)), NEAREND_HLOGMT)){ NEAREND_HLOGMT_MAKECMV(H2D_CMV_READ); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 80 Index 0"); #endif pts.adslATUCSubcarrierInfo_pt->HLOGMTus = 0; } else{ pts.adslATUCSubcarrierInfo_pt->HLOGMTus = RxMessage[4]; } } ///////////////////////////////////////////////////////////////////////// if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)), NEAREND_HLOGPS)){ int index=0,size=12; //printk("NEAREND_HLOGPS\n"); for (index=0;index<64;index+=size) { if (index+size>=64) size = 64-index; NEAREND_HLOGPS_MAKECMV(H2D_CMV_READ,index,size); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 75 Index 0"); #endif } else{ #if 0 if (adsl_mode <0x4000)//adsl /adsl2 mode { #endif memcpy(&pts.adslATUCSubcarrierInfo_pt->HLOGpsus[index],&RxMessage[4],size*2); #if 0 }else { int msg_idx=0; for (msg_idx=0;msg_idxHLOGpsus[(index+msg_idx)*2+1] = RxMessage[4+msg_idx]; pts.adslATUCSubcarrierInfo_pt->HLOGpsus[(index+msg_idx)] = RxMessage[4+msg_idx]; } } #endif } } #if 0 if (adsl_mode >= 0x4000)//adsl2 mode { pts.adslATUCSubcarrierInfo_pt->HLOGpsus[0] = pts.adslATUCSubcarrierInfo_pt->HLOGpsus[1]; for (index=1;index<64;index++) { pts.adslATUCSubcarrierInfo_pt->HLOGpsus[index*2] = (pts.adslATUCSubcarrierInfo_pt->HLOGpsus[(index)*2-1] + pts.adslATUCSubcarrierInfo_pt->HLOGpsus[(index)*2+1]) >>1; } } #endif } if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)), NEAREND_QLNMT)){ NEAREND_QLNMT_MAKECMV(H2D_CMV_READ); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 80 Index 1"); #endif pts.adslATUCSubcarrierInfo_pt->QLNMTus = 0; } else{ pts.adslATUCSubcarrierInfo_pt->QLNMTus = RxMessage[4]; } } ///////////////////////////////////////////////////////////////////////// if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)), NEAREND_QLNPS)){ int index=0,size=12; //printk("NEAREND_QLNPS\n"); for (index=0;index<32;index+=size) { if (index+size>=32) size = 32-index; NEAREND_QLNPS_MAKECMV(H2D_CMV_READ,index,size); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 77 Index 0"); #endif } else{ int msg_idx=0; for (msg_idx=0;msg_idxQLNpsds[index],&RxMessage[4],size*2); 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 if (adsl_mode < 0x4000 && adsl_mode_extend==0)//adsl2 mode { pts.adslATUCSubcarrierInfo_pt->QLNpsus[(index+msg_idx)*4+1] = (u16)(RxMessage[4+msg_idx]&0xFF); pts.adslATUCSubcarrierInfo_pt->QLNpsus[(index+msg_idx)*4+3] = (u16)((RxMessage[4+msg_idx]>>8)&0xFF); }else #endif { pts.adslATUCSubcarrierInfo_pt->QLNpsus[(index+msg_idx)*2] = (u16)(RxMessage[4+msg_idx]&0xFF); pts.adslATUCSubcarrierInfo_pt->QLNpsus[(index+msg_idx)*2+1] = (u16)((RxMessage[4+msg_idx]>>8)&0xFF); //printk("index:%d ,cmv_result: %04X\n",index+msg_idx,RxMessage[4+msg_idx]); } } } } #if 0 //if (adsl_mode <0x4000)//Annex I/J/L/M 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 { pts.adslATUCSubcarrierInfo_pt->QLNpsus[0] = pts.adslATUCSubcarrierInfo_pt->QLNpsus[1]; for (index=1;index<64;index++) { pts.adslATUCSubcarrierInfo_pt->QLNpsus[index*2] = (pts.adslATUCSubcarrierInfo_pt->QLNpsus[(index)*2-1] + pts.adslATUCSubcarrierInfo_pt->QLNpsus[(index)*2+1]) >>1; } } #endif } if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)), NEAREND_SNRMT)){ NEAREND_SNRMT_MAKECMV(H2D_CMV_READ); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 80 Index 2"); #endif pts.adslATUCSubcarrierInfo_pt->SNRMTus = 0; } else{ pts.adslATUCSubcarrierInfo_pt->SNRMTus = RxMessage[4]; } } if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)), NEAREND_SNRPS)){ int index=0,size=12; //printk("NEAREND_SNRPS\n"); for (index=0;index<64;index+=size) { if (index+size>=64) size = 64-index; NEAREND_SNRPS_MAKECMV(H2D_CMV_READ,index,size); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 78 Index 0"); #endif } else{ //memcpy(&pts.adslATUCSubcarrierInfo_pt->SNRpsus[index],&RxMessage[4],size*2); int msg_idx=0; for (msg_idx=0;msg_idxSNRpsus[index+msg_idx] = (u16)(RxMessage[4+msg_idx]&0xFF); //printk("index:%d ,cmv_result: %04X\n",index+msg_idx,RxMessage[4+msg_idx]); } } } } if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)), NEAREND_BITPS)){ int index=0,size=12; //printk("NEAREND_BITPS\n"); for (index=0;index<32;index+=size) { if (index+size>=32) size = 32-index; NEAREND_BITPS_MAKECMV(H2D_CMV_READ,index,size); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 22 Index 0"); #endif } else{ int msg_idx=0; for (msg_idx=0;msg_idxBITpsus[(index+msg_idx)*2] = (u16)(RxMessage[4+msg_idx]&0xFF); pts.adslATUCSubcarrierInfo_pt->BITpsus[(index+msg_idx)*2+1] = (u16)((RxMessage[4+msg_idx]>>8)&0xFF); //printk("index:%d ,cmv_result: %04X\n",index+msg_idx,RxMessage[4+msg_idx]); } } } } if(IS_FLAG_SET((&(pts.adslATUCSubcarrierInfo_pt->flags)), NEAREND_GAINPS)){ int index=0,size=12; //printk("NEAREND_GAINPS\n"); for (index=0;index<64;index+=size) { if (index+size>=64) size = 64-index; NEAREND_GAINPS_MAKECMV(H2D_CMV_READ,index,size); if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group INFO Address 24 Index 0"); #endif } else{ /* int msg_idx=0; for (msg_idx=0;msg_idxGAINpsds[(index+msg_idx)*2] = RxMessage[4+msg_idx]&0xFF; pts.adslATUCSubcarrierInfo_pt->GAINpsds[(index+msg_idx)*2+1] = (RxMessage[4+msg_idx]>>8)&0xFF; } */ memcpy(&pts.adslATUCSubcarrierInfo_pt->GAINpsus[index],&RxMessage[4],size*2); #if 0 int msg_idx; for (msg_idx=0;msg_idxACTPSDus = ((int )(j*256 - temp*10*256 + k*10)) /256; } // DS i=0; j=temp=temp2=0; NOMPSD_DS_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 35 Index 0"); #endif i=-1; } else{ j=RxMessage[4]; } PCB_DS_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 35 Index 0"); #endif i=-1; } else{ temp=RxMessage[4]; } RMSGI_DS_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group PLAM Address 35 Index 0"); #endif i=-1; } else{ //temp2=RxMessage[4]; k=(int16_t)RxMessage[4]; } if (i==0) { pts.adslPowerSpectralDensity_pt->ACTPSDds = ((int )(j*256 - temp*10*256 + k*10)) /256; } copy_to_user((char *)lon, (char *)pts.adslPowerSpectralDensity_pt, sizeof(adslPowerSpectralDensity)); kfree(pts.adslPowerSpectralDensity_pt); up(&mei_sema); break; case AMAZON_MEI_START: showtime=0; loop_diagnostics_completed = 0; #ifdef ARC_READY_ACK #ifdef LOCK_RETRY i=0; lock_retry: if(down_trylock(&mei_sema)!=0) { reboot_lock = 1; printk("lock fail\n"); i++; if (i <=5) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(10); goto lock_retry; }else { printk("Force to Reboot ADSL!\n"); up(&mei_sema); set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1000); sema_init(&mei_sema, 1); // semaphore initialization, mutex } }else { reboot_lock = 1; } #else if(down_interruptible(&mei_sema)) //disable CMV access until ARC ready { return -ERESTARTSYS; } #endif #endif //CLEAR_BIT((*((volatile u32 *)0xB0100B40)), 0x40); //Warning LED GPIO ON if(chantype.interleave==1){ kfree(interleave_mei_net.priv); unregister_netdev(&interleave_mei_net); } else if(chantype.fast==1){ kfree(fast_mei_net.priv); unregister_netdev(&fast_mei_net); } chantype.interleave=0; chantype.fast=0; meiMailboxInterruptsDisable(); //disable all MEI interrupts if(mei_arc_swap_buff == NULL){ mei_arc_swap_buff = (u32 *)kmalloc(MAXSWAPSIZE*4, GFP_KERNEL); if(mei_arc_swap_buff==NULL){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\n malloc fail for codeswap buff"); #endif meierr=MEI_FAILURE; } } if(meiForceRebootAdslModem() != MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\n meiForceRebootAdslModem() error..."); #endif meierr=MEI_FAILURE; } interruptible_sleep_on(&wait_queue_codeswap); // reset is called break; case AMAZON_MEI_MIB_DAEMON: #ifdef IFX_SMALL_FOOTPRINT /* [ */ return -1; #else /* ][ !IFX_SMALL_FOOTPRINT */ i=0; while(1){ if(istart_time.tv_sec>=900){ if(current_intvl->list.next!=&interval_list){ current_intvl = list_entry(current_intvl->list.next, amazon_mei_mib, list); do_gettimeofday(&(current_intvl->start_time)); } else{ mib_ptr = list_entry(interval_list.next, amazon_mei_mib, list); list_del(interval_list.next); memset(mib_ptr, 0, sizeof(amazon_mei_mib)); list_add_tail(&(mib_ptr->list), &interval_list); if(current_intvl->list.next==&interval_list) #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nlink list error"); #endif current_intvl = list_entry(current_intvl->list.next, amazon_mei_mib, list); do_gettimeofday(&(current_intvl->start_time)); } } if(down_interruptible(&mei_sema)) return -ERESTARTSYS; /* ATUC_PERF_LO_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 0 Index 0"); #endif } else{ if(RxMessage[4]&PLAM_LOS_FailureBit){ current_intvl->AtucPerfLos++; ATUC_PERF_LOSS++; CurrStatus.adslAtucCurrStatus = 2; } if(RxMessage[4]&PLAM_LOF_FailureBit){ current_intvl->AtucPerfLof++; ATUC_PERF_LOFS++; CurrStatus.adslAtucCurrStatus = 1; } if(!(RxMessage[4]&(PLAM_LOS_FailureBit|PLAM_LOF_FailureBit))) CurrStatus.adslAtucCurrStatus = 0; } */ ATUC_PERF_ESS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 7 Index 0"); #endif } else{ temp = RxMessage[4]-mib_pread.ATUC_PERF_ESS; if(temp>=0){ current_intvl->AtucPerfEs+=temp; ATUC_PERF_ESS+=temp; mib_pread.ATUC_PERF_ESS = RxMessage[4]; } else{ current_intvl->AtucPerfEs+=0xffff-mib_pread.ATUC_PERF_ESS+RxMessage[4]; ATUC_PERF_ESS+=0xffff-mib_pread.ATUC_PERF_ESS+RxMessage[4]; mib_pread.ATUC_PERF_ESS = RxMessage[4]; } } /* ATUR_PERF_LO_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 1 Index 0"); #endif } else{ if(RxMessage[4]&PLAM_LOS_FailureBit){ current_intvl->AturPerfLos++; ATUR_PERF_LOSS++; CurrStatus.adslAturCurrStatus = 2; } if(RxMessage[4]&PLAM_LOF_FailureBit){ current_intvl->AturPerfLof++; ATUR_PERF_LOFS++; CurrStatus.adslAturCurrStatus = 1; } if(RxMessage[4]&PLAM_LPR_FailureBit){ current_intvl->AturPerfLpr++; ATUR_PERF_LPR++; CurrStatus.adslAturCurrStatus = 3; } if(!(RxMessage[4]&(PLAM_LOS_FailureBit|PLAM_LOF_FailureBit|PLAM_LPR_FailureBit))) CurrStatus.adslAturCurrStatus = 0; } */ ATUR_PERF_ESS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 33 Index 0"); #endif } else{ temp = RxMessage[4]-mib_pread.ATUR_PERF_ESS; if(temp>=0){ current_intvl->AturPerfEs+=temp; ATUR_PERF_ESS+=temp; mib_pread.ATUR_PERF_ESS = RxMessage[4]; } else{ current_intvl->AturPerfEs+=0xffff-mib_pread.ATUR_PERF_ESS+RxMessage[4]; ATUR_PERF_ESS+= 0xffff-mib_pread.ATUR_PERF_ESS+RxMessage[4]; mib_pread.ATUR_PERF_ESS=RxMessage[4]; } } // to update rx/tx blocks ATUR_CHAN_RECV_BLK_FLAG_MAKECMV_LSW; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 20 Index 0"); #endif } else{ temp = RxMessage[4]; } ATUR_CHAN_RECV_BLK_FLAG_MAKECMV_MSW; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 21 Index 0"); #endif } else{ temp2 = RxMessage[4]; } if((temp + (temp2<<16) - mib_pread.ATUR_CHAN_RECV_BLK)>=0){ current_intvl->AturChanPerfRxBlk+=temp + (temp2<<16) - mib_pread.ATUR_CHAN_RECV_BLK; ATUR_CHAN_RECV_BLK+=temp + (temp2<<16) - mib_pread.ATUR_CHAN_RECV_BLK; mib_pread.ATUR_CHAN_RECV_BLK = temp + (temp2<<16); } else{ current_intvl->AturChanPerfRxBlk+=0xffffffff - mib_pread.ATUR_CHAN_RECV_BLK +(temp + (temp2<<16)); ATUR_CHAN_RECV_BLK+=0xffffffff - mib_pread.ATUR_CHAN_RECV_BLK +(temp + (temp2<<16)); mib_pread.ATUR_CHAN_RECV_BLK = temp + (temp2<<16); } current_intvl->AturChanPerfTxBlk = current_intvl->AturChanPerfRxBlk; ATUR_CHAN_TX_BLK = ATUR_CHAN_RECV_BLK; /* ATUR_CHAN_TX_BLK_FLAG_MAKECMV_LSW; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS) printk("\n\nCMV fail, Group 7 Address 20 Index 0"); else{ if(RxMessage[4]){ current_intvl->AturChanPerfTxBlk+=RxMessage[4]; ATUR_CHAN_TX_BLK+=RxMessage[4]; } } ATUR_CHAN_TX_BLK_FLAG_MAKECMV_MSW; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS) printk("\n\nCMV fail, Group 7 Address 21 Index 0"); else{ if(RxMessage[4]){ current_intvl->AturChanPerfTxBlk+=(int)((RxMessage[4])<<16); ATUR_CHAN_TX_BLK+=(int)((RxMessage[4])<<16); } } */ if(chantype.interleave == 1){ ATUR_CHAN_CORR_BLK_FLAG_MAKECMV_INTL; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 3 Index 0"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUR_CHAN_CORR_BLK_INTL; if(temp>=0){ current_intvl->AturChanPerfCorrBlk+=temp; ATUR_CHAN_CORR_BLK+=temp; mib_pread.ATUR_CHAN_CORR_BLK_INTL = RxMessage[4]; } else{ current_intvl->AturChanPerfCorrBlk+=0xffff - mib_pread.ATUR_CHAN_CORR_BLK_INTL +RxMessage[4]; ATUR_CHAN_CORR_BLK+=0xffff - mib_pread.ATUR_CHAN_CORR_BLK_INTL +RxMessage[4]; mib_pread.ATUR_CHAN_CORR_BLK_INTL = RxMessage[4]; } } } else if(chantype.fast == 1){ ATUR_CHAN_CORR_BLK_FLAG_MAKECMV_FAST; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 3 Index 1"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUR_CHAN_CORR_BLK_FAST; if(temp>=0){ current_intvl->AturChanPerfCorrBlk+=temp; ATUR_CHAN_CORR_BLK+=temp; mib_pread.ATUR_CHAN_CORR_BLK_FAST = RxMessage[4]; } else{ current_intvl->AturChanPerfCorrBlk+=0xffff - mib_pread.ATUR_CHAN_CORR_BLK_FAST + RxMessage[4]; ATUR_CHAN_CORR_BLK+=0xffff - mib_pread.ATUR_CHAN_CORR_BLK_FAST + RxMessage[4]; mib_pread.ATUR_CHAN_CORR_BLK_FAST = RxMessage[4]; } } } if(chantype.interleave == 1){ ATUR_CHAN_UNCORR_BLK_FLAG_MAKECMV_INTL; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 2 Index 0"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUR_CHAN_UNCORR_BLK_INTL; if(temp>=0){ current_intvl->AturChanPerfUncorrBlk+=temp; ATUR_CHAN_UNCORR_BLK+=temp; mib_pread.ATUR_CHAN_UNCORR_BLK_INTL = RxMessage[4]; } else{ current_intvl->AturChanPerfUncorrBlk+=0xffff - mib_pread.ATUR_CHAN_UNCORR_BLK_INTL + RxMessage[4]; ATUR_CHAN_UNCORR_BLK+=0xffff - mib_pread.ATUR_CHAN_UNCORR_BLK_INTL + RxMessage[4]; mib_pread.ATUR_CHAN_UNCORR_BLK_INTL = RxMessage[4]; } } } else if(chantype.fast == 1){ ATUR_CHAN_UNCORR_BLK_FLAG_MAKECMV_FAST; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 2 Index 1"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUR_CHAN_UNCORR_BLK_FAST; if(temp>=0){ current_intvl->AturChanPerfUncorrBlk+=temp; ATUR_CHAN_UNCORR_BLK+=temp; mib_pread.ATUR_CHAN_UNCORR_BLK_FAST = RxMessage[4]; } else{ current_intvl->AturChanPerfUncorrBlk+=0xffff - mib_pread.ATUR_CHAN_UNCORR_BLK_FAST + RxMessage[4]; ATUR_CHAN_UNCORR_BLK+=0xffff - mib_pread.ATUR_CHAN_UNCORR_BLK_FAST + RxMessage[4]; mib_pread.ATUR_CHAN_UNCORR_BLK_FAST = RxMessage[4]; } } } //RFC-3440 #ifdef AMAZON_MEI_MIB_RFC3440 ATUC_PERF_STAT_FASTR_FLAG_MAKECMV; //??? if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 0 Address 0 Index 0"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUC_PERF_STAT_FASTR; if(temp>=0){ current_intvl->AtucPerfStatFastR+=temp; ATUC_PERF_STAT_FASTR+=temp; mib_pread.ATUC_PERF_STAT_FASTR = RxMessage[4]; } else{ current_intvl->AtucPerfStatFastR+=0xffff - mib_pread.ATUC_PERF_STAT_FASTR + RxMessage[4]; ATUC_PERF_STAT_FASTR+=0xffff - mib_pread.ATUC_PERF_STAT_FASTR + RxMessage[4]; mib_pread.ATUC_PERF_STAT_FASTR = RxMessage[4]; } } ATUC_PERF_STAT_FAILED_FASTR_FLAG_MAKECMV; //??? if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 0 Address 0 Index 0"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUC_PERF_STAT_FAILED_FASTR; if(temp>=0){ current_intvl->AtucPerfStatFailedFastR+=temp; ATUC_PERF_STAT_FAILED_FASTR+=temp; mib_pread.ATUC_PERF_STAT_FAILED_FASTR = RxMessage[4]; } else{ current_intvl->AtucPerfStatFailedFastR+=0xffff - mib_pread.ATUC_PERF_STAT_FAILED_FASTR + RxMessage[4]; ATUC_PERF_STAT_FAILED_FASTR+=0xffff - mib_pread.ATUC_PERF_STAT_FAILED_FASTR + RxMessage[4]; mib_pread.ATUC_PERF_STAT_FAILED_FASTR = RxMessage[4]; } } ATUC_PERF_STAT_SESL_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 8 Index 0"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUC_PERF_STAT_SESL; if(temp>=0){ current_intvl->AtucPerfStatSesL+=temp; ATUC_PERF_STAT_SESL+=temp; mib_pread.ATUC_PERF_STAT_SESL = RxMessage[4]; } else{ current_intvl->AtucPerfStatSesL+=0xffff - mib_pread.ATUC_PERF_STAT_SESL + RxMessage[4]; ATUC_PERF_STAT_SESL+=0xffff - mib_pread.ATUC_PERF_STAT_SESL + RxMessage[4]; mib_pread.ATUC_PERF_STAT_SESL = RxMessage[4]; } } ATUC_PERF_STAT_UASL_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 10 Index 0"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUC_PERF_STAT_UASL; if(temp>=0){ current_intvl->AtucPerfStatUasL+=temp; ATUC_PERF_STAT_UASL+=temp; mib_pread.ATUC_PERF_STAT_UASL = RxMessage[4]; } else{ current_intvl->AtucPerfStatUasL+=0xffff - mib_pread.ATUC_PERF_STAT_UASL + RxMessage[4]; ATUC_PERF_STAT_UASL+=0xffff - mib_pread.ATUC_PERF_STAT_UASL + RxMessage[4]; mib_pread.ATUC_PERF_STAT_UASL = RxMessage[4]; } } ATUR_PERF_STAT_SESL_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 34 Index 0"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUR_PERF_STAT_SESL; if(temp>=0){ current_intvl->AtucPerfStatUasL+=temp; ATUC_PERF_STAT_UASL+=temp; mib_pread.ATUR_PERF_STAT_SESL = RxMessage[4]; } else{ current_intvl->AtucPerfStatUasL+=0xffff - mib_pread.ATUR_PERF_STAT_SESL + RxMessage[4]; ATUC_PERF_STAT_UASL+=0xffff - mib_pread.ATUR_PERF_STAT_SESL + RxMessage[4]; mib_pread.ATUR_PERF_STAT_SESL = RxMessage[4]; } } #endif up(&mei_sema); do_gettimeofday(&time_fini); i = ((int)((time_fini.tv_sec-time_now.tv_sec)*1000)) + ((int)((time_fini.tv_usec-time_now.tv_usec)/1000)) ; //msec }//showtime==1 } break; #endif /* ] !IFX_SMALL_FOOTPRINT */ case AMAZON_MEI_RESET: case AMAZON_MEI_REBOOT: case AMAZON_MEI_SHOWTIME: /* if(mei_arc_swap_buff !=NULL){ kfree(mei_arc_swap_buff); mei_arc_swap_buff=NULL; } if(image_buffer !=NULL){ // kfree(image_buffer); vfree(image_buffer); image_buffer =NULL; } */ if(clreoc_command_pkt !=NULL){ kfree(clreoc_command_pkt); clreoc_command_pkt =NULL; } for(i=0;istart_time)); ATUC_PERF_LOFS=0; ATUC_PERF_LOSS=0; ATUC_PERF_ESS=0; ATUC_PERF_INITS=0; ATUR_PERF_LOFS=0; ATUR_PERF_LOSS=0; ATUR_PERF_LPR=0; ATUR_PERF_ESS=0; ATUR_CHAN_RECV_BLK=0; ATUR_CHAN_TX_BLK=0; ATUR_CHAN_CORR_BLK=0; ATUR_CHAN_UNCORR_BLK=0; memset((((u8 *)&AlarmConfProfile)+32), 0, 16*4); AlarmConfProfile.adslLineAlarmConfProfileRowStatus=1; */ PrevTxRate.adslAtucChanPrevTxRate=0; PrevTxRate.adslAturChanPrevTxRate=0; CurrStatus.adslAtucCurrStatus=0; CurrStatus.adslAturCurrStatus=0; if((command==AMAZON_MEI_RESET) || (command==AMAZON_MEI_REBOOT)){ #ifdef AMAZON_CHECK_LINK if (adsl_link_notify){ (*adsl_link_notify)(0); } #endif showtime=0; //CLEAR_BIT((*((volatile u32 *)0xB0100B40)), 0x40); //Warning LED GPIO ON // disconnect net_dev if(chantype.interleave==1){ kfree(interleave_mei_net.priv); unregister_netdev(&interleave_mei_net); // if(unregister_netdev(&interleave_mei_net)!=0) // printk("\n unregister interleave fail"); } else if(chantype.fast==1){ kfree(fast_mei_net.priv); unregister_netdev(&fast_mei_net); // if(unregister_netdev(&fast_mei_net)!=0) // printk("\n unregister fast fail"); } chantype.interleave=0; chantype.fast=0; // 603221:tc.chen start chantype.bearchannel0 = 0; chantype.bearchannel1 = 0; adsl_mode = 0; // 603221:tc.chen end while(1){ makeCMV(H2D_CMV_READ, STAT, 0, 0, 1, NULL); //maximum allowed tx message length, in bytes if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ //printk("AdslInitStatsData.FullInitializationCount++\n"); AdslInitStatsData.FullInitializationCount++; //printk("AdslInitStatsData.FailedFullInitializationCount++\n"); AdslInitStatsData.FailedFullInitializationCount++; //printk("AdslInitStatsData.LINIT_Errors++\n"); AdslInitStatsData.LINIT_Errors++; }else { //printk("RxMessage=%X\n",RxMessage[4]); if ( RxMessage[4]!=0x1) { //printk("AdslInitStatsData.FullInitializationCount++\n"); AdslInitStatsData.FullInitializationCount++; if ( RxMessage[4] != 0x7) { //printk("AdslInitStatsData.LINIT_Errors++\n"); AdslInitStatsData.LINIT_Errors++; //printk("AdslInitStatsData.FailedFullInitializationCount++\n"); AdslInitStatsData.FailedFullInitializationCount++; } } } reboot_flag=0; wake_up_interruptible(&wait_queue_codeswap); //wake up codeswap daemon interruptible_sleep_on_timeout(&wait_queue_reboot, 1*HZ); // sleep until arc ready #ifdef ARC_READY_ACK if(reboot_flag!=0) break; else { up(&mei_sema); printk("\n reboot retry"); } #else break; #endif } } else{ //AMAZON_MEI_SHOWTIME if(down_interruptible(&mei_sema)) return -ERESTARTSYS; // clreoc stuff makeCMV(H2D_CMV_READ, INFO, 83, 0, 1, data); //maximum allowed tx message length, in bytes if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 3 Address 83 Index 0"); #endif } else{ clreoc_max_tx_len = (int)RxMessage[4]; clreoc_command_pkt = kmalloc((clreoc_max_tx_len*CLREOC_BUFF_SIZE), GFP_KERNEL); if(clreoc_command_pkt == NULL){ #ifdef AMAZON_MEI_DEBUG_ON printk("kmalloc error for clreoc_command_pkt\n\n"); #endif up(&mei_sema); return -1; } for(i=0;ilen)>0){ copy_to_user((char *)lon, (char*)(&(current_clreoc->len)), 4); break; } else//wait for eoc data from higher layer interruptible_sleep_on(&wait_queue_clreoc); } break; case AMAZON_MEI_GET_EOC_DATA: current_clreoc = list_entry(clreoc_list.next, amazon_clreoc_pkt, list); if((current_clreoc->len)>0){ copy_to_user((char*)lon, (char*)(current_clreoc->command), current_clreoc->len); meierr=1; list_del(clreoc_list.next); //remove and add to end of list current_clreoc->len = 0; list_add_tail(&(current_clreoc->list), &clreoc_list); } else meierr=-1; break; case AMAZON_MEI_EOC_SEND: copy_from_user((char *)(&debugrdwr), (char *)lon, sizeof(debugrdwr)); eoc_skb = dev_alloc_skb(debugrdwr.iCount*4); if(eoc_skb==NULL){ printk("\n\nskb alloc fail"); break; } eoc_skb->len=debugrdwr.iCount*4; memcpy(skb_put(eoc_skb, debugrdwr.iCount*4), (char *)debugrdwr.buffer, debugrdwr.iCount*4); ifx_push_eoc(eoc_skb); //pass data to higher layer break; #endif //#ifdef AMAZON_CLEAR_EOC case AMAZON_MIB_LO_ATUC: do_gettimeofday(&time_now); if(lon&0x1){ if((time_now.tv_sec-(mib_pflagtime.ATUC_PERF_LOSS_PTIME).tv_sec)>2){ current_intvl->AtucPerfLos++; ATUC_PERF_LOSS++; CurrStatus.adslAtucCurrStatus = 2; } (mib_pflagtime.ATUC_PERF_LOSS_PTIME).tv_sec = time_now.tv_sec; } if(lon&0x2){ if((time_now.tv_sec-(mib_pflagtime.ATUC_PERF_LOFS_PTIME).tv_sec)>2){ current_intvl->AtucPerfLof++; ATUC_PERF_LOFS++; CurrStatus.adslAtucCurrStatus = 1; } (mib_pflagtime.ATUC_PERF_LOFS_PTIME).tv_sec = time_now.tv_sec; } if(!(lon&0x3)) CurrStatus.adslAtucCurrStatus = 0; break; case AMAZON_MIB_LO_ATUR: do_gettimeofday(&time_now); if(lon&0x1){ if((time_now.tv_sec-(mib_pflagtime.ATUR_PERF_LOSS_PTIME).tv_sec)>2){ current_intvl->AturPerfLos++; ATUR_PERF_LOSS++; CurrStatus.adslAturCurrStatus = 2; } (mib_pflagtime.ATUR_PERF_LOSS_PTIME).tv_sec = time_now.tv_sec; } if(lon&0x2){ if((time_now.tv_sec-(mib_pflagtime.ATUR_PERF_LOFS_PTIME).tv_sec)>2){ current_intvl->AturPerfLof++; ATUR_PERF_LOFS++; CurrStatus.adslAturCurrStatus = 1; } (mib_pflagtime.ATUR_PERF_LOFS_PTIME).tv_sec = time_now.tv_sec; } if(lon&0x4){ if((time_now.tv_sec-(mib_pflagtime.ATUR_PERF_LPR_PTIME).tv_sec)>2){ current_intvl->AturPerfLpr++; ATUR_PERF_LPR++; CurrStatus.adslAturCurrStatus = 3; } (mib_pflagtime.ATUR_PERF_LPR_PTIME).tv_sec = time_now.tv_sec; } if(!(lon&0x7)) CurrStatus.adslAturCurrStatus = 0; break; case AMAZON_MEI_DOWNLOAD: // DMA the boot code page(s) #ifdef AMAZON_MEI_DEBUG_ON printk("\n\n start download pages"); #endif for( boot_loop = 0; boot_loop < img_hdr->count; boot_loop++){ if( img_hdr->page[boot_loop].p_size & BOOT_FLAG){ page_size = meiGetPage( boot_loop, GET_PROG, MAXSWAPSIZE, mei_arc_swap_buff, &dest_addr); if( page_size > 0){ meiDMAWrite(dest_addr, mei_arc_swap_buff, page_size); } } if( img_hdr->page[boot_loop].d_size & BOOT_FLAG){ page_size = meiGetPage( boot_loop, GET_DATA, MAXSWAPSIZE, mei_arc_swap_buff, &dest_addr); if( page_size > 0){ meiDMAWrite( dest_addr, mei_arc_swap_buff, page_size); } } } #ifdef AMAZON_MEI_DEBUG_ON printk("\n\n pages downloaded"); #endif break; //509221:tc.chen start case AMAZON_MEI_DEBUG_MODE: mei_debug_mode = lon; break; //509221:tc.chen end } return meierr; } ////////////////////// Interrupt handler ///////////////////////////////////////////////////// static void mei_interrupt_arcmsgav(int,void *,struct pt_regs *); static void mei_interrupt_arcmsgav(int int1, void * void0, struct pt_regs * regs) { u32 scratch; u32 fetchpage; u32 size; u32 dest_addr; u32 temp; int i; meiDebugRead(ARC_MEI_MAILBOXR, &scratch, 1); if(scratch & OMB_CODESWAP_MESSAGE_MSG_TYPE_MASK) { if(showtime==1){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\n Code Swap Request After ShowTime !!!"); #endif } else{ #ifdef AMAZON_MEI_DEBUG_ON // printk("\n\n Code Swap Request"); #endif fetchpage = scratch & ~OMB_CODESWAP_MESSAGE_MSG_TYPE_MASK; size = meiGetPage( fetchpage, GET_PROG, MAXSWAPSIZE, mei_arc_swap_buff, &dest_addr); if( size > 0) { #ifdef AMAZON_MEI_DEBUG_ON // printk(" : prom page num %d",fetchpage); #endif meiDMAWrite( dest_addr, mei_arc_swap_buff, size); } size = meiGetPage( fetchpage, GET_DATA, MAXSWAPSIZE, mei_arc_swap_buff, &dest_addr); if( size > 0) { #ifdef AMAZON_MEI_DEBUG_ON // printk(" : data page num %d",fetchpage); #endif meiDMAWrite( dest_addr, mei_arc_swap_buff, size); } } // Notify arc that mailbox read complete meiLongwordWrite(ARC_TO_MEI_INT, ARC_TO_MEI_MSGAV); // Tell ARC Codeswap is done meiLongwordWrite(MEI_TO_ARC_INT, MEI_TO_ARC_CS_DONE); asm("SYNC"); i=0; while(i>4)==D2H_AUTONOMOUS_MODEM_READY_MSG){ //check ARC ready message #ifdef LOCK_RETRY if (reboot_lock) { reboot_lock = 0; up(&mei_sema); // allow cmv access } #else up(&mei_sema); // allow cmv access #endif reboot_flag=1; //#ifdef ADSL_LED_SUPPORT #if 0 led_support_check=1;//adsl led for 1.1.2.7.1.1 adsl_led_flash();//adsl led for 1.1.2.7.1.1 #endif wake_up_interruptible(&wait_queue_reboot); // wait up ioctl reboot } #endif } } // meiLongwordWrite(ARC_TO_MEI_INT, ARC_TO_MEI_MSGAV); mask_and_ack_amazon_irq(AMAZON_MEI_INT); return; } // 603221:tc.chen start ////////////////////////hdlc //////////////// // get hdlc status static unsigned int ifx_me_hdlc_status(void) { u16 CMVMSG[MSG_LENGTH]; int ret; if (showtime!=1) return -ENETRESET; makeCMV_local(H2D_CMV_READ, STAT, 14, 0, 1, NULL,CMVMSG); //Get HDLC status ret = mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG); if (ret != 0) { return -EIO; } return CMVMSG[4]&0x0F; } int ifx_me_is_resloved(int status) { u16 CMVMSG[MSG_LENGTH]; int ret; if (status == ME_HDLC_MSG_QUEUED || status == ME_HDLC_MSG_SENT) return ME_HDLC_UNRESOLVED; if (status == ME_HDLC_IDLE) { makeCMV_local(H2D_CMV_READ, CNTL, 2, 0, 1, NULL,CMVMSG); //Get ME-HDLC Control ret = mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG); if (ret != 0) { return IFX_POP_EOC_FAIL; } if (CMVMSG[4]&(1<<0)) { return ME_HDLC_UNRESOLVED; } } return ME_HDLC_RESOLVED; } int _ifx_me_hdlc_send(unsigned char *hdlc_pkt,int len,int max_length) { int ret; u16 CMVMSG[MSG_LENGTH]; u16 data=0; u16 pkt_len=len; if (pkt_len > max_length) { printk("Exceed maximum eoc message length\n"); return -ENOBUFS; } //while(pkt_len > 0) { makeCMV_local(H2D_CMV_WRITE, INFO, 81, 0, (pkt_len+1)/2,(u16 *)hdlc_pkt,CMVMSG); //Write clear eoc message to ARC ret = mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG); if (ret != 0) { return -EIO; } makeCMV_local(H2D_CMV_WRITE, INFO, 83, 2, 1,&pkt_len,CMVMSG); //Update tx message length ret = mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG); if (ret != 0) { return -EIO; } data = (1<<0); makeCMV_local(H2D_CMV_WRITE, CNTL, 2, 0, 1,&data,CMVMSG); //Start to send ret = mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG); if (ret != 0) { return -EIO; } return 0; } } static int ifx_me_hdlc_send(unsigned char *hdlc_pkt,int hdlc_pkt_len) { int hdlc_status=0; u16 CMVMSG[MSG_LENGTH]; int max_hdlc_tx_length=0,ret=0,retry=0; while(retry<10) { hdlc_status = ifx_me_hdlc_status(); if (ifx_me_is_resloved(hdlc_status)==ME_HDLC_RESOLVED) // arc ready to send HDLC message { makeCMV_local(H2D_CMV_READ, INFO, 83, 0, 1, NULL,CMVMSG); //Get Maximum Allowed HDLC Tx Message Length ret = mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG); if (ret != 0) { return -EIO; } max_hdlc_tx_length = CMVMSG[4]; ret = _ifx_me_hdlc_send(hdlc_pkt,hdlc_pkt_len,max_hdlc_tx_length); return ret; } set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(10); } return -EBUSY; } int ifx_mei_hdlc_read(char *hdlc_pkt,int max_hdlc_pkt_len) { u16 CMVMSG[MSG_LENGTH]; int msg_read_len,ret=0,pkt_len=0,retry = 0; while(retry<10) { ret = ifx_me_hdlc_status(); if (ret == ME_HDLC_RESP_RCVD) { int current_size=0; makeCMV_local(H2D_CMV_READ, INFO, 83, 3, 1, NULL,CMVMSG); //Get EoC packet length ret = mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG); if (ret != 0) { return -EIO; } pkt_len = CMVMSG[4]; if (pkt_len > max_hdlc_pkt_len) { ret = -ENOMEM; goto error; } while( current_size < pkt_len) { if (pkt_len - current_size >(MSG_LENGTH*2-8)) msg_read_len = (MSG_LENGTH*2-8); else msg_read_len = pkt_len - (current_size); makeCMV_local(H2D_CMV_READ, INFO, 82, 0 + (current_size/2), (msg_read_len+1)/2, NULL,CMVMSG); //Get hdlc packet ret = mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG); if (ret != 0) { goto error; } memcpy(hdlc_pkt+current_size,&CMVMSG[4],msg_read_len); current_size +=msg_read_len; } ret = current_size; break; }else { ret = -ENODATA; } retry++; set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(10); } return ret; error: return ret; } ////////////////////////hdlc //////////////// // 603221:tc.chen end /////////////////////// clearEoC, int ifx_pop_eoc(sk_buff * pkt) ////////// int ifx_pop_eoc(struct sk_buff * pkt); int ifx_pop_eoc(struct sk_buff * pkt) { amazon_clreoc_pkt * current; if(showtime!=1){ dev_kfree_skb(pkt); return IFX_POP_EOC_FAIL; } if((pkt->len)>clreoc_max_tx_len){ dev_kfree_skb(pkt); return IFX_POP_EOC_FAIL; } current = list_entry(clreoc_list.next, amazon_clreoc_pkt, list); while(1){ if(current->len==0){ memcpy(current->command, pkt->data, pkt->len); current->len=pkt->len; break; } else{ if((current->list).next==&clreoc_list){ dev_kfree_skb(pkt); return IFX_POP_EOC_FAIL; //buffer full } current = list_entry((current->list).next,amazon_clreoc_pkt, list); } } wake_up_interruptible(&wait_queue_clreoc); dev_kfree_skb(pkt); return IFX_POP_EOC_DONE; } /* this is used in circular fifo mode */ /* int ifx_pop_eoc(sk_buff * pkt); int ifx_pop_eoc(sk_buff * pkt) { int buff_space,i; if(showtime!=1) return IFX_POP_EOC_FAIL; if(clreoc_wr>=clreoc_rd) buff_space = (MEI_CLREOC_BUFF_SIZE-1)-(clreoc_wr - clreoc_rd); else buff_space = clreoc_rd - clreoc_wr - 1; if((pkt->len)>buff_space) return IFX_POP_EOC_FAIL; if((clreoc_wr+pkt->len)>MEI_CLREOC_BUFF_SIZE){ memcpy((clreoc+clreoc_wr), pkt->data, ((clreoc_wr+pkt->len)-MEI_CLREOC_BUFF_SIZE+1)); memcpy(clreoc, (pkt->data)+((clreoc_wr+pkt->len)-MEI_CLREOC_BUFF_SIZE+1), (pkt->len)-((clreoc_wr+pkt->len)-MEI_CLREOC_BUFF_SIZE+1)); clreoc_wr=(clreoc_wr+pkt->len)-MEI_CLREOC_BUFF_SIZE; } else{ memcpy((clreoc+clreoc_wr), pkt->data, pkt->len); if((clreoc_wr+pkt->len)=MEI_CLREOC_BUFF_SIZE) clreoc_wr=0; else clreoc_wr+=pkt->len; } wake_up_interruptible(&wait_queue_clreoc); return IFX_POP_EOC_DONE; } */ //////////////////////////////////////////////////////////////////////////// //int amazon_mei_init_module (void); //void amazon_mei_cleanup_module (void); //int __init init_module (void); //void __exit cleanup_module (void); int __init amazon_mei_init_module(void) //int __init init_module(void) { struct proc_dir_entry *entry; int i; //dying gasp-start #ifdef IFX_DYING_GASP //000003:fchang Start #ifdef CONFIG_CPU_AMAZON_E //GPIO31 :dying gasp event indication // (1) logic high: dying gasp event is false (default) // (2) logic low: dying gasp event is true CLEAR_BIT((*((volatile u32 *)0xB0100B18)), 0x4); CLEAR_BIT((*((volatile u32 *)0xB0100B1c)), 0x4); CLEAR_BIT((*((volatile u32 *)0xB0100B20)), 0x4); SET_BIT((*((volatile u32 *)0xB0100B24)), 0x4); asm("SYNC"); #else //000003:fchang End //GPIO31 :dying gasp event indication // (1) logic high: dying gasp event is false (default) // (2) logic low: dying gasp event is true CLEAR_BIT((*((volatile u32 *)0xB0100B48)), 0x8000); CLEAR_BIT((*((volatile u32 *)0xB0100B4C)), 0x8000); CLEAR_BIT((*((volatile u32 *)0xB0100B50)), 0x8000); SET_BIT((*((volatile u32 *)0xB0100B54)), 0x8000); #if 0 //warning-led-start //GPIO 22 SET_BIT ((*((volatile u32 *)0xB0100B48)), 0x40); CLEAR_BIT((*((volatile u32 *)0xB0100B4C)), 0x40); CLEAR_BIT((*((volatile u32 *)0xB0100B50)), 0x40); SET_BIT((*((volatile u32 *)0xB0100B54)), 0x40); CLEAR_BIT((*((volatile u32 *)0xB0100B40)), 0x40); //GPIO ON printk("LED ON ON ON ON ON ON....."); //warning-led-end #endif asm("SYNC"); #endif //000003:fchang #endif //IFX_DYING_GASP //dying gasp -end reg_entry_t regs_temp[PROC_ITEMS] = // Items being debugged { /* { flag, name, description } */ { &arcmsgav, "arcmsgav", "arc to mei message ", 0 }, { &cmv_reply, "cmv_reply", "cmv needs reply", 0}, { &cmv_waiting, "cmv_waiting", "waiting for cmv reply from arc", 0}, { &indicator_count, "indicator_count", "ARC to MEI indicator count", 0}, { &cmv_count, "cmv_count", "MEI to ARC CMVs", 0}, { &reply_count, "reply_count", "ARC to MEI Reply", 0}, { (int *)Recent_indicator, "Recent_indicator", "most recent indicator", 0}, { (int *)8, "version", "version of firmware", 0}, }; memcpy((char *)regs, (char *)regs_temp, sizeof(regs_temp)); //sema_init(&mei_sema, 0); // semaphore initialization, mutex sema_init(&mei_sema, 1); // semaphore initialization, mutex init_waitqueue_head(&wait_queue_arcmsgav); // for ARCMSGAV init_waitqueue_head(&wait_queue_codeswap); // for codeswap daemon init_waitqueue_head(&wait_queue_mibdaemon); // for mib daemon init_waitqueue_head(&wait_queue_reboot); // for ioctl reboot init_waitqueue_head(&wait_queue_clreoc); // for clreoc_wr function init_waitqueue_head(&wait_queue_loop_diagnostic); // for loop diagnostic function #ifdef ADSL_LED_SUPPORT init_waitqueue_head(&wait_queue_led); // adsl led for led function init_waitqueue_head(&wait_queue_led_polling); // adsl led for led function led_task.routine = adsl_led_flash_task; // adsl led for led function led_poll_init(); // adsl led for led function #endif //ADSL_LED_SUPPORT #ifdef IFX_DYING_GASP init_waitqueue_head(&wait_queue_dying_gasp); // IFX_DYING_GASP lop_poll_init(); // IFX_DYING_GASP #endif //IFX_DYING_GASP init_waitqueue_head(&wait_queue_uas_poll);//joelin 04/16/2005 unavailable_seconds_poll_init();//joelin 04/16/2005 memset(&mib_pflagtime, 0, (sizeof(mib_flags_pretime))); // initialize link list for intervals mei_mib = (amazon_mei_mib *)kmalloc((sizeof(amazon_mei_mib)*INTERVAL_NUM), GFP_KERNEL); if(mei_mib == NULL){ #ifdef AMAZON_MEI_DEBUG_ON printk("kmalloc error for amazon_mei_mib\n\n"); #endif return -1; } memset(mei_mib, 0, (sizeof(amazon_mei_mib)*INTERVAL_NUM)); INIT_LIST_HEAD(&interval_list); for(i=0;istart_time)); // initialize clreoc list clreoc_pkt = (amazon_clreoc_pkt *)kmalloc((sizeof(amazon_clreoc_pkt)*CLREOC_BUFF_SIZE), GFP_KERNEL); if(clreoc_pkt == NULL){ #ifdef AMAZON_MEI_DEBUG_ON printk("kmalloc error for clreoc_pkt\n\n"); #endif return -1; } memset(clreoc_pkt, 0, (sizeof(amazon_clreoc_pkt)*CLREOC_BUFF_SIZE)); INIT_LIST_HEAD(&clreoc_list); for(i=0;ilow_ino; entry->proc_fops = &proc_operations; } else { #ifdef AMAZON_MEI_DEBUG_ON printk( KERN_ERR ": can't create /proc/" MEI_DIRNAME "/%s\n\n", regs[i].name); #endif return(-ENOMEM); } } ///////////////////////////////// register net device //////////////////////////// if(register_netdev(&phy_mei_net)!=0){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\n Register phy Device Failed."); #endif return -1; } /* if(register_netdev(&interleave_mei_net)!=0){ printk("\n\n Register interleave Device Failed."); return -1; } if(register_netdev(&fast_mei_net)!=0){ printk("\n\n Register fast Device Failed."); return -1; } */ #ifdef DFE_LOOPBACK mei_arc_swap_buff = (u32 *)kmalloc(MAXSWAPSIZE*4, GFP_KERNEL); if (mei_arc_swap_buff){ #ifdef ARC_READY_ACK if(down_interruptible(&mei_sema)) //disable CMV access until ARC ready { return -ERESTARTSYS; } #ifdef LOCK_RETRY reboot_lock = 1; #endif #endif meiForceRebootAdslModem(); kfree(mei_arc_swap_buff); }else{ #ifdef AMAZON_MEI_DEBUG_ON printk("cannot load image: no memory\n\n"); #endif } #endif #ifdef IFX_SMALL_FOOTPRINT mib_poll_init(); #endif return 0; } void __exit amazon_mei_cleanup_module(void) //void __exit cleanup_module(void) { int i; #ifdef ADSL_LED_SUPPORT stop_led_module=1; //wake up and clean led module led_support_check=0;//joelin , clear task showtime=0;//joelin,clear task //CLEAR_BIT((*((volatile u32 *)0xB0100B40)), 0x40); //Warning LED GPIO ON firmware_support_led=0;//joelin ,clear task wake_up_interruptible(&wait_queue_led); //wake up and clean led module wake_up_interruptible(&wait_queue_led_polling); //wake up and clean led module #endif for(i=0;icomm, "kmibpoll"); sigfillset(&tsk->blocked); printk("Inside mib poll loop ...\n"); i=0; while(1){ if(istart_time.tv_sec>=900){ if(current_intvl->list.next!=&interval_list){ current_intvl = list_entry(current_intvl->list.next, amazon_mei_mib, list); do_gettimeofday(&(current_intvl->start_time)); } else{ mib_ptr = list_entry(interval_list.next, amazon_mei_mib, list); list_del(interval_list.next); memset(mib_ptr, 0, sizeof(amazon_mei_mib)); list_add_tail(&(mib_ptr->list), &interval_list); if(current_intvl->list.next==&interval_list) #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nlink list error"); #endif current_intvl = list_entry(current_intvl->list.next, amazon_mei_mib, list); do_gettimeofday(&(current_intvl->start_time)); } } if(down_interruptible(&mei_sema)) return -ERESTARTSYS; /* ATUC_PERF_LO_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 0 Index 0"); #endif } else{ if(RxMessage[4]&PLAM_LOS_FailureBit){ current_intvl->AtucPerfLos++; ATUC_PERF_LOSS++; CurrStatus.adslAtucCurrStatus = 2; } if(RxMessage[4]&PLAM_LOF_FailureBit){ current_intvl->AtucPerfLof++; ATUC_PERF_LOFS++; CurrStatus.adslAtucCurrStatus = 1; } if(!(RxMessage[4]&(PLAM_LOS_FailureBit|PLAM_LOF_FailureBit))) CurrStatus.adslAtucCurrStatus = 0; } */ if(showtime!=1) goto mib_poll_end; ATUC_PERF_ESS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 7 Index 0"); #endif } else{ temp = RxMessage[4]-mib_pread.ATUC_PERF_ESS; if(temp>=0){ current_intvl->AtucPerfEs+=temp; ATUC_PERF_ESS+=temp; mib_pread.ATUC_PERF_ESS = RxMessage[4]; } else{ current_intvl->AtucPerfEs+=0xffff-mib_pread.ATUC_PERF_ESS+RxMessage[4]; ATUC_PERF_ESS+=0xffff-mib_pread.ATUC_PERF_ESS+RxMessage[4]; mib_pread.ATUC_PERF_ESS = RxMessage[4]; } } /* ATUR_PERF_LO_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 1 Index 0"); #endif } else{ if(RxMessage[4]&PLAM_LOS_FailureBit){ current_intvl->AturPerfLos++; ATUR_PERF_LOSS++; CurrStatus.adslAturCurrStatus = 2; } if(RxMessage[4]&PLAM_LOF_FailureBit){ current_intvl->AturPerfLof++; ATUR_PERF_LOFS++; CurrStatus.adslAturCurrStatus = 1; } if(RxMessage[4]&PLAM_LPR_FailureBit){ current_intvl->AturPerfLpr++; ATUR_PERF_LPR++; CurrStatus.adslAturCurrStatus = 3; } if(!(RxMessage[4]&(PLAM_LOS_FailureBit|PLAM_LOF_FailureBit|PLAM_LPR_FailureBit))) CurrStatus.adslAturCurrStatus = 0; } */ if(showtime!=1) goto mib_poll_end; ATUR_PERF_ESS_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 33 Index 0"); #endif } else{ temp = RxMessage[4]-mib_pread.ATUR_PERF_ESS; if(temp>=0){ current_intvl->AturPerfEs+=temp; ATUR_PERF_ESS+=temp; mib_pread.ATUR_PERF_ESS = RxMessage[4]; } else{ current_intvl->AturPerfEs+=0xffff-mib_pread.ATUR_PERF_ESS+RxMessage[4]; ATUR_PERF_ESS+= 0xffff-mib_pread.ATUR_PERF_ESS+RxMessage[4]; mib_pread.ATUR_PERF_ESS=RxMessage[4]; } } if(showtime!=1) goto mib_poll_end; // to update rx/tx blocks ATUR_CHAN_RECV_BLK_FLAG_MAKECMV_LSW; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 20 Index 0"); #endif } else{ temp = RxMessage[4]; } if(showtime!=1) goto mib_poll_end; ATUR_CHAN_RECV_BLK_FLAG_MAKECMV_MSW; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 21 Index 0"); #endif } else{ temp2 = RxMessage[4]; } if((temp + (temp2<<16) - mib_pread.ATUR_CHAN_RECV_BLK)>=0){ current_intvl->AturChanPerfRxBlk+=temp + (temp2<<16) - mib_pread.ATUR_CHAN_RECV_BLK; ATUR_CHAN_RECV_BLK+=temp + (temp2<<16) - mib_pread.ATUR_CHAN_RECV_BLK; mib_pread.ATUR_CHAN_RECV_BLK = temp + (temp2<<16); } else{ current_intvl->AturChanPerfRxBlk+=0xffffffff - mib_pread.ATUR_CHAN_RECV_BLK +(temp + (temp2<<16)); ATUR_CHAN_RECV_BLK+=0xffffffff - mib_pread.ATUR_CHAN_RECV_BLK +(temp + (temp2<<16)); mib_pread.ATUR_CHAN_RECV_BLK = temp + (temp2<<16); } current_intvl->AturChanPerfTxBlk = current_intvl->AturChanPerfRxBlk; ATUR_CHAN_TX_BLK = ATUR_CHAN_RECV_BLK; /* ATUR_CHAN_TX_BLK_FLAG_MAKECMV_LSW; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS) printk("\n\nCMV fail, Group 7 Address 20 Index 0"); else{ if(RxMessage[4]){ current_intvl->AturChanPerfTxBlk+=RxMessage[4]; ATUR_CHAN_TX_BLK+=RxMessage[4]; } } ATUR_CHAN_TX_BLK_FLAG_MAKECMV_MSW; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS) printk("\n\nCMV fail, Group 7 Address 21 Index 0"); else{ if(RxMessage[4]){ current_intvl->AturChanPerfTxBlk+=(int)((RxMessage[4])<<16); ATUR_CHAN_TX_BLK+=(int)((RxMessage[4])<<16); } } */ if(chantype.interleave == 1){ if(showtime!=1) goto mib_poll_end; ATUR_CHAN_CORR_BLK_FLAG_MAKECMV_INTL; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 3 Index 0"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUR_CHAN_CORR_BLK_INTL; if(temp>=0){ current_intvl->AturChanPerfCorrBlk+=temp; ATUR_CHAN_CORR_BLK+=temp; mib_pread.ATUR_CHAN_CORR_BLK_INTL = RxMessage[4]; } else{ current_intvl->AturChanPerfCorrBlk+=0xffff - mib_pread.ATUR_CHAN_CORR_BLK_INTL +RxMessage[4]; ATUR_CHAN_CORR_BLK+=0xffff - mib_pread.ATUR_CHAN_CORR_BLK_INTL +RxMessage[4]; mib_pread.ATUR_CHAN_CORR_BLK_INTL = RxMessage[4]; } } } else if(chantype.fast == 1){ if(showtime!=1) goto mib_poll_end; ATUR_CHAN_CORR_BLK_FLAG_MAKECMV_FAST; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 3 Index 1"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUR_CHAN_CORR_BLK_FAST; if(temp>=0){ current_intvl->AturChanPerfCorrBlk+=temp; ATUR_CHAN_CORR_BLK+=temp; mib_pread.ATUR_CHAN_CORR_BLK_FAST = RxMessage[4]; } else{ current_intvl->AturChanPerfCorrBlk+=0xffff - mib_pread.ATUR_CHAN_CORR_BLK_FAST + RxMessage[4]; ATUR_CHAN_CORR_BLK+=0xffff - mib_pread.ATUR_CHAN_CORR_BLK_FAST + RxMessage[4]; mib_pread.ATUR_CHAN_CORR_BLK_FAST = RxMessage[4]; } } } if(chantype.interleave == 1){ if(showtime!=1) goto mib_poll_end; ATUR_CHAN_UNCORR_BLK_FLAG_MAKECMV_INTL; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 2 Index 0"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUR_CHAN_UNCORR_BLK_INTL; if(temp>=0){ current_intvl->AturChanPerfUncorrBlk+=temp; ATUR_CHAN_UNCORR_BLK+=temp; mib_pread.ATUR_CHAN_UNCORR_BLK_INTL = RxMessage[4]; } else{ current_intvl->AturChanPerfUncorrBlk+=0xffff - mib_pread.ATUR_CHAN_UNCORR_BLK_INTL + RxMessage[4]; ATUR_CHAN_UNCORR_BLK+=0xffff - mib_pread.ATUR_CHAN_UNCORR_BLK_INTL + RxMessage[4]; mib_pread.ATUR_CHAN_UNCORR_BLK_INTL = RxMessage[4]; } } } else if(chantype.fast == 1){ if(showtime!=1) goto mib_poll_end; ATUR_CHAN_UNCORR_BLK_FLAG_MAKECMV_FAST; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 2 Index 1"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUR_CHAN_UNCORR_BLK_FAST; if(temp>=0){ current_intvl->AturChanPerfUncorrBlk+=temp; ATUR_CHAN_UNCORR_BLK+=temp; mib_pread.ATUR_CHAN_UNCORR_BLK_FAST = RxMessage[4]; } else{ current_intvl->AturChanPerfUncorrBlk+=0xffff - mib_pread.ATUR_CHAN_UNCORR_BLK_FAST + RxMessage[4]; ATUR_CHAN_UNCORR_BLK+=0xffff - mib_pread.ATUR_CHAN_UNCORR_BLK_FAST + RxMessage[4]; mib_pread.ATUR_CHAN_UNCORR_BLK_FAST = RxMessage[4]; } } } //RFC-3440 #ifdef AMAZON_MEI_MIB_RFC3440 if(showtime!=1) goto mib_poll_end; ATUC_PERF_STAT_FASTR_FLAG_MAKECMV; //??? if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 0 Address 0 Index 0"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUC_PERF_STAT_FASTR; if(temp>=0){ current_intvl->AtucPerfStatFastR+=temp; ATUC_PERF_STAT_FASTR+=temp; mib_pread.ATUC_PERF_STAT_FASTR = RxMessage[4]; } else{ current_intvl->AtucPerfStatFastR+=0xffff - mib_pread.ATUC_PERF_STAT_FASTR + RxMessage[4]; ATUC_PERF_STAT_FASTR+=0xffff - mib_pread.ATUC_PERF_STAT_FASTR + RxMessage[4]; mib_pread.ATUC_PERF_STAT_FASTR = RxMessage[4]; } } if(showtime!=1) goto mib_poll_end; ATUC_PERF_STAT_FAILED_FASTR_FLAG_MAKECMV; //??? if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 0 Address 0 Index 0"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUC_PERF_STAT_FAILED_FASTR; if(temp>=0){ current_intvl->AtucPerfStatFailedFastR+=temp; ATUC_PERF_STAT_FAILED_FASTR+=temp; mib_pread.ATUC_PERF_STAT_FAILED_FASTR = RxMessage[4]; } else{ current_intvl->AtucPerfStatFailedFastR+=0xffff - mib_pread.ATUC_PERF_STAT_FAILED_FASTR + RxMessage[4]; ATUC_PERF_STAT_FAILED_FASTR+=0xffff - mib_pread.ATUC_PERF_STAT_FAILED_FASTR + RxMessage[4]; mib_pread.ATUC_PERF_STAT_FAILED_FASTR = RxMessage[4]; } } if(showtime!=1) goto mib_poll_end; ATUC_PERF_STAT_SESL_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 8 Index 0"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUC_PERF_STAT_SESL; if(temp>=0){ current_intvl->AtucPerfStatSesL+=temp; ATUC_PERF_STAT_SESL+=temp; mib_pread.ATUC_PERF_STAT_SESL = RxMessage[4]; } else{ current_intvl->AtucPerfStatSesL+=0xffff - mib_pread.ATUC_PERF_STAT_SESL + RxMessage[4]; ATUC_PERF_STAT_SESL+=0xffff - mib_pread.ATUC_PERF_STAT_SESL + RxMessage[4]; mib_pread.ATUC_PERF_STAT_SESL = RxMessage[4]; } } if(showtime!=1) goto mib_poll_end; ATUC_PERF_STAT_UASL_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 10 Index 0"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUC_PERF_STAT_UASL; if(temp>=0){ current_intvl->AtucPerfStatUasL+=temp; ATUC_PERF_STAT_UASL+=temp; mib_pread.ATUC_PERF_STAT_UASL = RxMessage[4]; } else{ current_intvl->AtucPerfStatUasL+=0xffff - mib_pread.ATUC_PERF_STAT_UASL + RxMessage[4]; ATUC_PERF_STAT_UASL+=0xffff - mib_pread.ATUC_PERF_STAT_UASL + RxMessage[4]; mib_pread.ATUC_PERF_STAT_UASL = RxMessage[4]; } } if(showtime!=1) goto mib_poll_end; ATUR_PERF_STAT_SESL_FLAG_MAKECMV; if(meiCMV(TxMessage, YES_REPLY)!=MEI_SUCCESS){ #ifdef AMAZON_MEI_DEBUG_ON printk("\n\nCMV fail, Group 7 Address 34 Index 0"); #endif } else{ temp = RxMessage[4] - mib_pread.ATUR_PERF_STAT_SESL; if(temp>=0){ current_intvl->AtucPerfStatUasL+=temp; ATUC_PERF_STAT_UASL+=temp; mib_pread.ATUR_PERF_STAT_SESL = RxMessage[4]; } else{ current_intvl->AtucPerfStatUasL+=0xffff - mib_pread.ATUR_PERF_STAT_SESL + RxMessage[4]; ATUC_PERF_STAT_UASL+=0xffff - mib_pread.ATUR_PERF_STAT_SESL + RxMessage[4]; mib_pread.ATUR_PERF_STAT_SESL = RxMessage[4]; } } #endif mib_poll_end: up(&mei_sema); do_gettimeofday(&time_fini); i = ((int)((time_fini.tv_sec-time_now.tv_sec)*1000)) + ((int)((time_fini.tv_usec-time_now.tv_usec)/1000)) ; //msec }//showtime==1 } } int mib_poll_init(void) { printk("Starting mib_poll...\n"); kernel_thread(adsl_mib_poll, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL); return 0; } #endif //IFX_SMALL_FOOTPRINT //EXPORT_NO_SYMBOLS; #ifdef ADSL_LED_SUPPORT // adsl led -start int led_status_on=0,led_need_to_flash=0; int led_current_flashing=0; unsigned long led_delay=0; static int led_poll(void *unused) { stop_led_module=0; //begin polling ... while(!stop_led_module){ if ((!led_status_on)&&(!led_need_to_flash)) interruptible_sleep_on_timeout (&wait_queue_led_polling,1000); //10 seconds timeout for waiting wakeup // else printk("direct running task, no waiting"); run_task_queue(&tq_ifx_led);//joelin task // printk("led and LOP polling...\n"); } return 0; } static int led_poll_init(void) { // printk("Starting adsl led polling...\n"); //warning-led-start // CLEAR_BIT((*((volatile u32 *)0xB0100B40)), 0x40); //Warning LED GPIO ON //warning-led-end kernel_thread(led_poll, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL); return 0; } int adsl_led_flash(void) { int i; if (!firmware_support_led) return 0; //joelin version check if (led_status_on == 0 && led_need_to_flash == 0) { queue_task(&led_task, &tq_ifx_led);//joelin task wake_up_interruptible(&wait_queue_led_polling); //wake up and clean led module // printk("queue Task 1...\n"); //joelin test } led_need_to_flash=1;//asking to flash led return 0; } int adsl_led_flash_task(void *ptr) { u16 one=1; u16 zero=0; u16 data=0x0600; int kernel_use=1; u16 CMVMSG[MSG_LENGTH]; //adsl-led-start for >v1.1.2.7.1.1 // printk("Task Running...\n"); //joelin test if ((firmware_support_led==2)&&(led_support_check)) { led_support_check=0; data=0x0600; makeCMV_local(H2D_CMV_WRITE, INFO, 91, 0, 1, &data,CMVMSG); //configure GPIO9 GPIO10 as outputs mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG); makeCMV_local(H2D_CMV_WRITE, INFO, 91, 2, 1, &data,CMVMSG); //enable writing to bit 9 and bit10 mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG); data=0x0a01; makeCMV_local(H2D_CMV_WRITE, INFO, 91, 4, 1, &data,CMVMSG); //use GPIO10 for TR68 .Enable and don't invert. mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG); #ifdef DATA_LED_ON_MODE data=0x0903;//tecom //use GPIO9 for TR68 data led .turn on. #else data=0x0900; #endif makeCMV_local(H2D_CMV_WRITE, INFO, 91, 5, 1, &data,CMVMSG); //use GPIO9 for TR68 data led .turn off. mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, CMVMSG); } if (!showtime) {led_need_to_flash=0; return 0;} //adsl-led-end for >v1.1.2.7.1.1 if (led_status_on == 0 || led_need_to_flash == 1) { if (led_current_flashing==0) { if (firmware_support_led==1){//>1.1.2.3.1.1 makeCMV_local(H2D_CMV_WRITE, INFO, 91, 0, 1, &one,CMVMSG); //flash mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, &CMVMSG); } else if (firmware_support_led==2){//>1.1.2.7.1.1 data=0x0901;//flash makeCMV_local(H2D_CMV_WRITE, INFO, 91, 5, 1, &data,CMVMSG); //use GPIO9 for TR68 data led .flash. mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, &CMVMSG); }//(firmware_support_led==2) led_current_flashing = 1;//turn on led } led_status_on=1; do{//do nothing , waiting untill no data traffic led_need_to_flash=0; interruptible_sleep_on_timeout(&wait_queue_led, 25); //the time for LED Off , if no data traffic }while(led_need_to_flash==1); }else if (led_status_on == 1 && led_need_to_flash==0) { if (led_current_flashing==1) {//turn off led if (firmware_support_led==1){//>1.1.2.3.1.1 makeCMV_local(H2D_CMV_WRITE, INFO, 91, 0, 1, &zero,CMVMSG);//off mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, &CMVMSG); } //>1.1.2.3.1.1 else if (firmware_support_led==2){//>1.1.2.7.1.1 #ifdef DATA_LED_ON_MODE data=0x0903;//tecom //use GPIO9 for TR68 data led .turn on. #else data=0x0900;//off #endif makeCMV_local(H2D_CMV_WRITE, INFO, 91, 5, 1, &data,CMVMSG); //use GPIO9 for TR68 data led .off. mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_CMV_WINHOST, &CMVMSG); }//(firmware_support_led==2) led_status_on=0; led_current_flashing = 0; } } if (led_status_on == 1 || led_need_to_flash) {//led flash job on going or led need to flash queue_task(&led_task, &tq_ifx_led); //joelin task // printk("queue Task 2...\n"); //joelin test } return 0; } //joelin adsl led-end #else int adsl_led_flash(void) { return 0; } #endif //ADSL_LED_SUPPORT #ifdef IFX_DYING_GASP static int lop_poll(void *unused) { while(1) { interruptible_sleep_on_timeout(&wait_queue_dying_gasp, 1); #ifdef CONFIG_CPU_AMAZON_E //000003:fchang if(showtime&&((*((volatile u32 *)0xB0100B14))&0x4)==0x0) {//000003:fchang #else //000003:fchang if(showtime&&((*((volatile u32 *)0xB0100B44))&0x8000)==0x0) { #endif //CONFIG_CPU_AMAZON_E mei_ioctl((struct inode *)0,NULL, AMAZON_MEI_WRITEDEBUG, &lop_debugwr); printk("send dying gasp..\n");} } return 0; } static int lop_poll_init(void) { // printk("Starting LOP polling...\n"); kernel_thread(lop_poll, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL); return 0; } #endif //IFX_DYING_GASP //joelin 04/16/2005-satrt static int unavailable_seconds_poll(void *unused) { while(1){ interruptible_sleep_on_timeout (&wait_queue_uas_poll,100); //1 second timeout for waiting wakeup if (!showtime) unavailable_seconds++; } return 0; } static int unavailable_seconds_poll_init(void) { kernel_thread(unavailable_seconds_poll, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL); return 0; } //joelin 04/16/2005-end EXPORT_SYMBOL(meiDebugWrite); EXPORT_SYMBOL(ifx_pop_eoc); MODULE_LICENSE("GPL"); module_init(amazon_mei_init_module); module_exit(amazon_mei_cleanup_module);