www.usr.com/support/gpl/USR9113_release1.0.tar.gz
[bcm963xx.git] / bcmdrivers / opensource / char / board / bcm963xx / impl1 / board.c
index 58df4c7..36290ad 100755 (executable)
  *              for the board related ioctl calls: flash, get free kernel
  *              page and dump kernel memory, etc.
  *
- * Created on :  2/20/2002  seanl:  use cfiflash.c, cfliflash.h (AMD specific)
  *
  ***************************************************************************/
 
-
 /* Includes. */
 #include <linux/version.h>
 #include <linux/init.h>
@@ -100,15 +98,16 @@ typedef struct _CB_DGASP__LIST
 
 static LED_MAP_PAIR LedMapping[] =
 {   // led name     Initial state       physical pin (ledMask)
-    {kLedEnd,       kLedStateOff,       0, 0, 0, 0},
-    {kLedEnd,       kLedStateOff,       0, 0, 0, 0},
-    {kLedEnd,       kLedStateOff,       0, 0, 0, 0},
-    {kLedEnd,       kLedStateOff,       0, 0, 0, 0},
-    {kLedEnd,       kLedStateOff,       0, 0, 0, 0},
-    {kLedEnd,       kLedStateOff,       0, 0, 0, 0}, 
-    {kLedEnd,       kLedStateOff,       0, 0, 0, 0}, 
-    {kLedEnd,       kLedStateOff,       0, 0, 0, 0},     
-    {kLedEnd,       kLedStateOff,       0, 0, 0, 0} // NOTE: kLedEnd has to be at the end.
+    {kLedEnd,       kLedStateOff,       0, 0, 0, 0, 0, 0},
+    {kLedEnd,       kLedStateOff,       0, 0, 0, 0, 0, 0},
+    {kLedEnd,       kLedStateOff,       0, 0, 0, 0, 0, 0},
+    {kLedEnd,       kLedStateOff,       0, 0, 0, 0, 0, 0},
+    {kLedEnd,       kLedStateOff,       0, 0, 0, 0, 0, 0},
+    {kLedEnd,       kLedStateOff,       0, 0, 0, 0, 0, 0},
+    {kLedEnd,       kLedStateOff,       0, 0, 0, 0, 0, 0},
+    {kLedEnd,       kLedStateOff,       0, 0, 0, 0, 0, 0},   
+    {kLedEnd,       kLedStateOff,       0, 0, 0, 0, 0, 0},   
+    {kLedEnd,       kLedStateOff,       0, 0, 0, 0, 0, 0} // NOTE: kLedEnd has to be at the end.
 };
 
 /* Externs. */
@@ -147,6 +146,9 @@ static void __init kerSysInitDyingGaspHandler( void );
 static void __exit kerSysDeinitDyingGaspHandler( void );
 /* -DyingGasp function prototype - */
 
+static int ConfigCs(BOARD_IOCTL_PARMS *parms);
+static void SetPll(int pll_mask, int pll_value);
+static void SetGpio(int gpio, GPIO_STATE_t state);
 
 #if defined (WIRELESS)
 static irqreturn_t sesBtn_isr(int irq, void *dev_id, struct pt_regs *ptregs);
@@ -160,6 +162,8 @@ static void __init ses_board_init(void);
 static void __exit ses_board_deinit(void);
 #endif
 
+static irqreturn_t reset_isr(int irq, void *dev_id, struct pt_regs *ptregs);
+
 static PNVRAM_INFO g_pNvramInfo = NULL;
 static int g_ledInitialized = 0;
 static wait_queue_head_t g_board_wait_queue;
@@ -225,6 +229,7 @@ static int __init brcm_board_init( void )
      {kLedEnd, NULL, NULL}
     };
 
+    unsigned short pah_irq;    
     int ret;
         
     ret = register_chrdev(BOARD_DRV_MAJOR, "bcrmboard", &board_fops );
@@ -235,6 +240,7 @@ static int __init brcm_board_init( void )
         PLED_MAP_PAIR pLedMap = LedMapping;
         unsigned short gpio;
         struct BpLedInformation *pInfo;
+        ETHERNET_MAC_INFO EnetInfo;
 
         printk("brcmboard: brcm_board_init entry\n");
         board_major = BOARD_DRV_MAJOR;
@@ -242,21 +248,39 @@ static int __init brcm_board_init( void )
 
         for( pInfo = bpLedInfo; pInfo->ledName != kLedEnd; pInfo++ )
         {
-            if( pInfo->bpFunc && (*pInfo->bpFunc) (&gpio) == BP_SUCCESS )
+            if( pInfo->bpFunc && (*pInfo->bpFunc) (&gpio) == BP_SUCCESS &&
+                gpio != BP_HW_DEFINED_AH && gpio != BP_HW_DEFINED_AL )
             {
                 pLedMap->ledName = pInfo->ledName;
                 pLedMap->ledMask = GPIO_NUM_TO_MASK(gpio);
                 pLedMap->ledActiveLow = (gpio & BP_ACTIVE_LOW) ? 1 : 0;
+                pLedMap->ledSerial = (gpio & BP_GPIO_SERIAL) ? 1 : 0;
             }
-            if( pInfo->bpFuncFail && (*pInfo->bpFuncFail) (&gpio) == BP_SUCCESS )
+            if( pInfo->bpFuncFail && (*pInfo->bpFuncFail)(&gpio)==BP_SUCCESS &&
+                gpio != BP_HW_DEFINED_AH && gpio != BP_HW_DEFINED_AL )
             {
                 pLedMap->ledName = pInfo->ledName;
                 pLedMap->ledMaskFail = GPIO_NUM_TO_MASK(gpio);
                 pLedMap->ledActiveLowFail = (gpio & BP_ACTIVE_LOW) ? 1 : 0;
+                pLedMap->ledSerialFail = (gpio & BP_GPIO_SERIAL) ? 1 : 0;
             }
             if( pLedMap->ledName != kLedEnd )
                 pLedMap++;
         }
+
+        if( BpGetEthernetMacInfo( &EnetInfo, 1 ) == BP_SUCCESS )
+        {
+            if( EnetInfo.usGpioPhyLinkSpeed != BP_NOT_DEFINED )
+            {
+                /* The internal Ethernet PHY has a GPIO for 10/100 link speed. */
+                gpio = EnetInfo.usGpioPhyLinkSpeed;
+                pLedMap->ledName = kLedEphyLinkSpeed;
+                pLedMap->ledMask = GPIO_NUM_TO_MASK(gpio);
+                pLedMap->ledActiveLow = (gpio & BP_ACTIVE_LOW) ? 1 : 0;
+                pLedMap->ledSerial = (gpio & BP_GPIO_SERIAL) ? 1 : 0;
+                pLedMap++;
+            }
+        }
         
         init_waitqueue_head(&g_board_wait_queue);
 #if defined (WIRELESS)
@@ -267,6 +291,13 @@ static int __init brcm_board_init( void )
 
         boardLedInit(LedMapping);
         g_ledInitialized = 1;
+
+        if( BpGetPressAndHoldResetExtIntr(&pah_irq) == BP_SUCCESS )
+        {
+            pah_irq += INTERRUPT_ID_EXTERNAL_0;        
+            BcmHalMapInterrupt((FN_HANDLER)reset_isr, 0, pah_irq);
+            BcmHalInterruptEnable(pah_irq);
+        }
     }
 
     return ret;
@@ -590,6 +621,27 @@ int kerSysReleaseMacAddress( unsigned char *pucaMacAddr )
     return( nRet );
 } /* kerSysReleaseMacAddr */
 
+// USR9109/91113
+void kerSysSetMacAddress(unsigned char *pucaMacAddr)
+{
+    UINT32 crc = CRC32_INIT_VALUE;
+    NVRAM_DATA NvramData;
+    volatile unsigned char *mac;
+                                                                                
+    memcpy((char *)&NvramData, (char *)get_nvram_start_addr(), sizeof(NVRAM_DATA));
+                                                                                
+    mac = (unsigned char*)NvramData.ucaBaseMacAddr;
+    printk("Original ucaBaseMacAddr: %02X %02X %02X %02X %02X %02X\r\n", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
+                                                                                
+    memcpy(NvramData.ucaBaseMacAddr, pucaMacAddr, NVRAM_MAC_ADDRESS_LEN);
+    printk("New Mac: %02X %02X %02X %02X %02X %02X\r\n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
+                                                                                
+    NvramData.ulCheckSum = 0;
+    NvramData.ulCheckSum = getCrc32((char *)&NvramData, (UINT32) sizeof(NVRAM_DATA), crc);
+    kerSysNvRamSet((char *)&NvramData, sizeof(NVRAM_DATA), NVRAM_VERSION_NUMBER_ADDRESS);
+
+} /* kerSysSetMacAddr */
+
 int kerSysGetSdramSize( void )
 {
     return( (int) g_pNvramInfo->ulSdramSize );
@@ -783,14 +835,6 @@ static int flashFsKernelImage( int destAddr, unsigned char *imagePtr,
         return -1;
     }
 
-    if( getTagFromPartition(1) != NULL && getTagFromPartition(2) != NULL &&
-        newImgSize > availableSizeTwoImgs )
-    {
-        printk("Illegal image size %d.  Image size must not be greater "
-            "than %d.\n", newImgSize, availableSizeTwoImgs);
-        return -1;
-    }
-
     // If the current image fits in half the flash space and the new
     // image to flash also fits in half the flash space, then flash it
     // in the partition that is not currently being used to boot from.
@@ -861,7 +905,6 @@ static int board_ioctl( struct inode *inode, struct file *flip,
             // not used for now.  kerSysBcmImageInit();
             break;
 
-
         case BOARD_IOCTL_FLASH_WRITE:
             if (copy_from_user((void*)&ctrlParms, (void*)arg, sizeof(ctrlParms)) == 0)
             {
@@ -871,7 +914,10 @@ static int board_ioctl( struct inode *inode, struct file *flip,
                 switch (ctrlParms.action)
                 {
                     case SCRATCH_PAD:
-                        ret = kerSysScratchPadSet(ctrlParms.string, ctrlParms.buf, ctrlParms.offset);
+                        if (ctrlParms.offset == -1)
+                              ret =  kerSysScratchPadClearAll();
+                        else
+                              ret = kerSysScratchPadSet(ctrlParms.string, ctrlParms.buf, ctrlParms.offset);
                         break;
 
                     case PERSISTENT:
@@ -896,6 +942,8 @@ static int board_ioctl( struct inode *inode, struct file *flip,
 
                         // set memory type field
                         BpGetSdramSize( (unsigned long *) &ctrlParms.string[SDRAM_TYPE_ADDRESS_OFFSET] );
+                        // set thread number field
+                        BpGetCMTThread( (unsigned long *) &ctrlParms.string[THREAD_NUM_ADDRESS_OFFSET] );
 
                         ret = kerSysBcmImageSet(ctrlParms.offset + BOOT_OFFSET, ctrlParms.string, ctrlParms.strLen);
 
@@ -928,6 +976,9 @@ static int board_ioctl( struct inode *inode, struct file *flip,
                         // save NVRAM data into a local structure
                         memcpy( &SaveNvramData, pNvramData, sizeof(NVRAM_DATA) );
 
+                        if (ctrlParms.offset == 0) {
+                            ctrlParms.offset = FLASH_BASE;
+                        }
                         ret = kerSysBcmImageSet(ctrlParms.offset, ctrlParms.string, ctrlParms.strLen);
 
                         // if nvram is not valid, restore the current nvram settings
@@ -1126,7 +1177,7 @@ static int board_ioctl( struct inode *inode, struct file *flip,
             else
                 ret = -EFAULT;
             break;
-
+                                                                                
         case BOARD_IOCTL_GET_CHIP_ID:
             ctrlParms.result = (int) (PERF->RevID & 0xFFFF0000) >> 16;
             __copy_to_user((BOARD_IOCTL_PARMS*)arg, &ctrlParms, sizeof(BOARD_IOCTL_PARMS));
@@ -1336,6 +1387,50 @@ static int board_ioctl( struct inode *inode, struct file *flip,
             kerSysWakeupMonitorTask();
             break;
 
+        case BOARD_IOCTL_GET_VCOPE_GPIO:
+            if (copy_from_user((void*)&ctrlParms, (void*)arg, sizeof(ctrlParms)) == 0) {
+                ret = ((ctrlParms.result = BpGetVcopeGpio(ctrlParms.offset)) != BP_NOT_DEFINED) ? 0 : -EFAULT;
+                __copy_to_user((BOARD_IOCTL_PARMS*)arg, &ctrlParms, sizeof(BOARD_IOCTL_PARMS));
+            }
+            else {
+                ret = -EFAULT;  
+                ctrlParms.result = BP_NOT_DEFINED;
+            }
+
+            break;
+
+        case BOARD_IOCTL_SET_CS_PAR: 
+            if (copy_from_user((void*)&ctrlParms, (void*)arg, sizeof(ctrlParms)) == 0) {
+                ret = ConfigCs(&ctrlParms);
+                __copy_to_user((BOARD_IOCTL_PARMS*)arg, &ctrlParms, sizeof(BOARD_IOCTL_PARMS));
+            } 
+            else {
+                ret = -EFAULT;  
+            }
+            break;
+
+        case BOARD_IOCTL_SET_PLL: 
+            if (copy_from_user((void*)&ctrlParms, (void*)arg, sizeof(ctrlParms)) == 0) {
+                SetPll(ctrlParms.strLen, ctrlParms.offset);
+                __copy_to_user((BOARD_IOCTL_PARMS*)arg, &ctrlParms, sizeof(BOARD_IOCTL_PARMS));
+                ret = 0;
+            } 
+            else {
+                ret = -EFAULT;  
+            }
+            break;
+
+        case BOARD_IOCTL_SET_GPIO:
+            if (copy_from_user((void*)&ctrlParms, (void*)arg, sizeof(ctrlParms)) == 0) {
+                SetGpio(ctrlParms.strLen, ctrlParms.offset);
+                __copy_to_user((BOARD_IOCTL_PARMS*)arg, &ctrlParms, sizeof(BOARD_IOCTL_PARMS));
+                ret = 0;
+            } 
+            else {
+                ret = -EFAULT;  
+            }
+            break;
+    
         default:
             ret = -EINVAL;
             ctrlParms.result = 0;
@@ -1354,26 +1449,18 @@ static int board_ioctl( struct inode *inode, struct file *flip,
 #if defined (WIRELESS) 
 static irqreturn_t sesBtn_isr(int irq, void *dev_id, struct pt_regs *ptregs)
 {   
-#if defined(_BCM96338_) || defined(CONFIG_BCM96338)
     unsigned long gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio);
-    volatile unsigned long *gpio_reg = &GPIO->GPIOio;
-#endif
-#if defined(_BCM96345_) || defined(CONFIG_BCM96345)
-    unsigned short gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio);
-    volatile unsigned short *gpio_reg = &GPIO->GPIOio;
-#endif
-#if defined(_BCM96348_) || defined (CONFIG_BCM96348)
-    unsigned long gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio);
-    volatile unsigned long *gpio_reg = &GPIO->GPIOio;
+    volatile unsigned long *gpio_io_reg = &GPIO->GPIOio;
 
-    if( (sesBtn_gpio & ~BP_ACTIVE_MASK) >= 32 )
+#if !defined(CONFIG_BCM96338)
+    if( (sesBtn_gpio & BP_GPIO_NUM_MASK) >= 32 )
     {
         gpio_mask = GPIO_NUM_TO_MASK_HIGH(sesBtn_gpio);
-        gpio_reg = &GPIO->GPIOio_high;
+        gpio_io_reg = &GPIO->GPIOio_high;
     }
 #endif 
                
-    if (!(*gpio_reg & gpio_mask)){
+    if (!(*gpio_io_reg & gpio_mask)){
         wake_up_interruptible(&g_board_wait_queue);
         return IRQ_RETVAL(1);
     } else {
@@ -1409,27 +1496,19 @@ static void __init sesBtn_mapIntr(int context)
 
 static unsigned int sesBtn_poll(struct file *file, struct poll_table_struct *wait)
 {
-#if defined(_BCM96338_) || defined(CONFIG_BCM96338)
-    unsigned long gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio);
-    volatile unsigned long *gpio_reg = &GPIO->GPIOio;
-#endif
-#if defined(_BCM96345_) || defined(CONFIG_BCM96345)
-    unsigned short gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio);
-    volatile unsigned short *gpio_reg = &GPIO->GPIOio;
-#endif
-#if defined(_BCM96348_) || defined (CONFIG_BCM96348)
     unsigned long gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio);
-    volatile unsigned long *gpio_reg = &GPIO->GPIOio;
+    volatile unsigned long *gpio_io_reg = &GPIO->GPIOio;
 
-    if( (sesBtn_gpio & ~BP_ACTIVE_MASK) >= 32 )
+#if !defined(CONFIG_BCM96338)
+    if( (sesBtn_gpio & BP_GPIO_NUM_MASK) >= 32 )
     {
         gpio_mask = GPIO_NUM_TO_MASK_HIGH(sesBtn_gpio);
-        gpio_reg = &GPIO->GPIOio_high;
+        gpio_io_reg = &GPIO->GPIOio_high;
     }
 #endif 
                
-    if (!(*gpio_reg & gpio_mask)){
-       return POLLIN;
+    if (!(*gpio_io_reg & gpio_mask)){
+        return POLLIN;
     }  
     return 0;
 }
@@ -1439,28 +1518,20 @@ static ssize_t sesBtn_read(struct file *file,  char __user *buffer, size_t count
     volatile unsigned int event=0;
     ssize_t ret=0;     
 
-#if defined(_BCM96338_) || defined (CONFIG_BCM96338)
-    unsigned long gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio);
-    volatile unsigned long *gpio_reg = &GPIO->GPIOio;
-#endif
-#if defined(_BCM96345_) || defined (CONFIG_BCM96345)
-    unsigned short gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio);
-    volatile unsigned short *gpio_reg = &GPIO->GPIOio;
-#endif
-#if defined(_BCM96348_) || defined (CONFIG_BCM96348)
     unsigned long gpio_mask = GPIO_NUM_TO_MASK(sesBtn_gpio);
-    volatile unsigned long *gpio_reg = &GPIO->GPIOio;
+    volatile unsigned long *gpio_io_reg = &GPIO->GPIOio;
     
-    if( (sesBtn_gpio & ~BP_ACTIVE_MASK) >= 32 )
+#if !defined (CONFIG_BCM96338)
+    if( (sesBtn_gpio & BP_GPIO_NUM_MASK) >= 32 )
     {
         gpio_mask = GPIO_NUM_TO_MASK_HIGH(sesBtn_gpio);
-        gpio_reg = &GPIO->GPIOio_high;
+        gpio_io_reg = &GPIO->GPIOio_high;
     }
 #endif 
 
-    if(*gpio_reg & gpio_mask){
+    if(*gpio_io_reg & gpio_mask){
        BcmHalInterruptEnable(sesBtn_irq);              
-       return ret;
+           return ret;
     }  
     event = SES_EVENTS;
     __copy_to_user((char*)buffer, (char*)&event, sizeof(event));       
@@ -1532,14 +1603,14 @@ static void __exit ses_board_deinit()
  ***************************************************************************/
 #define KERSYS_DBG     printk
 
-#if defined(CONFIG_BCM96345)
-#define        CYCLE_PER_US    70
-#elif defined(CONFIG_BCM96348) || defined(CONFIG_BCM96338)
+#if defined(CONFIG_BCM96348) || defined(CONFIG_BCM96338)
 /* The BCM6348 cycles per microsecond is really variable since the BCM6348
  * MIPS speed can vary depending on the PLL settings.  However, an appoximate
  * value of 120 will still work OK for the test being done.
  */
 #define        CYCLE_PER_US    120
+#elif defined(CONFIG_BCM96358)
+#define        CYCLE_PER_US    150
 #endif
 #define        DG_GLITCH_TO    (100*CYCLE_PER_US)
  
@@ -1547,19 +1618,10 @@ static void __init kerSysDyingGaspMapIntr()
 {
     unsigned long ulIntr;
        
-#if defined(CONFIG_BCM96348) || defined(_BCM96348_) || defined(CONFIG_BCM96338) || defined(_BCM96338_)
     if( BpGetAdslDyingGaspExtIntr( &ulIntr ) == BP_SUCCESS ) {
                BcmHalMapInterrupt((FN_HANDLER)kerSysDyingGaspIsr, 0, INTERRUPT_ID_DG);
                BcmHalInterruptEnable( INTERRUPT_ID_DG );
     }
-#elif defined(CONFIG_BCM96345) || defined(_BCM96345_)
-    if( BpGetAdslDyingGaspExtIntr( &ulIntr ) == BP_SUCCESS ) {
-        ulIntr += INTERRUPT_ID_EXTERNAL_0;
-        BcmHalMapInterrupt((FN_HANDLER)kerSysDyingGaspIsr, 0, ulIntr);
-        BcmHalInterruptEnable( ulIntr );
-    }
-#endif
-
 } 
 
 void kerSysSetWdTimer(ulong timeUs)
@@ -1592,24 +1654,6 @@ static Bool kerSysDyingGaspCheckPowerLoss(void)
     UART->Data = '%';
     UART->Data = 'G';
 
-#if defined(CONFIG_BCM96345)
-    BpGetAdslDyingGaspExtIntr( &ulIntr );
-
-    do {
-        ulong clk1;
-        
-        clk1 = kerSysGetCycleCount();          /* time cleared */
-       /* wait a little to get new reading */
-        while ((kerSysGetCycleCount()-clk1) < CYCLE_PER_US*2)
-            ;
-    } while ((0 == (PERF->ExtIrqCfg & (1 << (ulIntr + EI_STATUS_SHFT)))) && ((kerSysGetCycleCount() - clk0) < DG_GLITCH_TO));
-
-    if (PERF->ExtIrqCfg & (1 << (ulIntr + EI_STATUS_SHFT))) {  /* power glitch */
-        BcmHalInterruptEnable( ulIntr + INTERRUPT_ID_EXTERNAL_0);
-        KERSYS_DBG(" - Power glitch detected. Duration: %ld us\n", (kerSysGetCycleCount() - clk0)/CYCLE_PER_US);
-        return 0;
-    }
-#elif (defined(CONFIG_BCM96348) || defined(CONFIG_BCM96338)) && !defined(VXWORKS)
     do {
         ulong clk1;
         
@@ -1624,17 +1668,17 @@ static Bool kerSysDyingGaspCheckPowerLoss(void)
         KERSYS_DBG(" - Power glitch detected. Duration: %ld us\n", (kerSysGetCycleCount() - clk0)/CYCLE_PER_US);
         return 0;
     }
-#endif
+
     return 1;
 }
 
 static void kerSysDyingGaspShutdown( void )
 {
     kerSysSetWdTimer(1000000);
-#if defined(CONFIG_BCM96345)
-    PERF->blkEnables &= ~(EMAC_CLK_EN | USB_CLK_EN | CPU_CLK_EN);   
-#elif defined(CONFIG_BCM96348)
+#if defined(CONFIG_BCM96348)
     PERF->blkEnables &= ~(EMAC_CLK_EN | USBS_CLK_EN | USBH_CLK_EN | SAR_CLK_EN);
+#elif defined(CONFIG_BCM96358) 
+    PERF->blkEnables &= ~(EMAC_CLK_EN | USBS_CLK_EN | SAR_CLK_EN);
 #endif
 }
 
@@ -1645,7 +1689,7 @@ static unsigned int kerSysDyingGaspIsr(void)
 #endif
 {      
     struct list_head *pos;
-    CB_DGASP_LIST *tmp, *dsl = NULL;   
+    CB_DGASP_LIST *tmp = NULL, *dsl = NULL;    
 
     if (kerSysDyingGaspCheckPowerLoss()) {        
 
@@ -1665,6 +1709,11 @@ static unsigned int kerSysDyingGaspIsr(void)
 
         /* reset and shutdown system */
         kerSysDyingGaspShutdown();
+
+        // If power is going down, nothing should continue!
+
+        while (1)
+            ;
     }
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
 return( IRQ_HANDLED );
@@ -1763,6 +1812,80 @@ void kerSysDeregisterDyingGaspHandler(char *devname)
        
 } /* kerSysDeregisterDyingGaspHandler */
 
+static int ConfigCs (BOARD_IOCTL_PARMS *parms)
+{
+    int                     retv = 0;
+#if !defined(CONFIG_BCM96338)
+    int                     cs, flags;
+    cs_config_pars_t        info;
+
+    if (copy_from_user(&info, (void*)parms->buf, sizeof(cs_config_pars_t)) == 0) 
+    {
+        cs = parms->offset;
+
+        MPI->cs[cs].base = ((info.base & 0x1FFFE000) | (info.size >> 13));     
+
+        if ( info.mode == EBI_TS_TA_MODE )     // syncronious mode
+            flags = (EBI_TS_TA_MODE | EBI_ENABLE);
+        else
+        {
+            flags = ( EBI_ENABLE | \
+                (EBI_WAIT_STATES  & (info.wait_state << EBI_WTST_SHIFT )) | \
+                (EBI_SETUP_STATES & (info.setup_time << EBI_SETUP_SHIFT)) | \
+                (EBI_HOLD_STATES  & (info.hold_time  << EBI_HOLD_SHIFT )) );
+        }
+        MPI->cs[cs].config = flags;
+        parms->result = BP_SUCCESS;
+        retv = 0;
+    }
+    else
+    {
+        retv -= EFAULT;
+        parms->result = BP_NOT_DEFINED; 
+    }
+#endif
+    return( retv );
+}
+
+static void SetPll (int pll_mask, int pll_value)
+{
+    PERF->pll_control &= ~pll_mask;   // clear relevant bits
+    PERF->pll_control |= pll_value;   // and set desired value
+}
+
+static void SetGpio(int gpio, GPIO_STATE_t state)
+{
+    unsigned long gpio_mask = GPIO_NUM_TO_MASK(gpio);
+    volatile unsigned long *gpio_io_reg = &GPIO->GPIOio;
+    volatile unsigned long *gpio_dir_reg = &GPIO->GPIODir;
+    
+#if !defined (CONFIG_BCM96338)
+    if( gpio >= 32 )
+    {
+        gpio_mask = GPIO_NUM_TO_MASK_HIGH(gpio);
+        gpio_io_reg = &GPIO->GPIOio_high;
+        gpio_dir_reg = &GPIO->GPIODir_high;
+    }
+#endif 
+
+    *gpio_dir_reg |= gpio_mask;
+
+    if(state == GPIO_HIGH)
+        *gpio_io_reg |= gpio_mask;
+    else
+        *gpio_io_reg &= ~gpio_mask;
+}
+
+
+static irqreturn_t reset_isr(int irq, void *dev_id, struct pt_regs *ptregs)
+{
+    printk("\n*** Restore to Factory Default Setting ***\n\n");
+    kerSysPersistentSet( "Reset Persistent", strlen("Reset Persistent"), 0 );
+    kerSysMipsSoftReset();
+    return 0;
+}
+
+
 /***************************************************************************
  * MACRO to call driver initialization and cleanup functions.
  ***************************************************************************/
@@ -1772,6 +1895,7 @@ module_exit( brcm_board_cleanup );
 EXPORT_SYMBOL(kerSysNvRamGet);
 EXPORT_SYMBOL(dumpaddr);
 EXPORT_SYMBOL(kerSysGetMacAddress);
+EXPORT_SYMBOL(kerSysSetMacAddress);    // USR9109/9113
 EXPORT_SYMBOL(kerSysReleaseMacAddress);
 EXPORT_SYMBOL(kerSysGetSdramSize);
 EXPORT_SYMBOL(kerSysLedCtrl);
@@ -1784,7 +1908,6 @@ EXPORT_SYMBOL(BpGetRj11InnerOuterPairGpios);
 EXPORT_SYMBOL(BpGetPressAndHoldResetGpio);
 EXPORT_SYMBOL(BpGetVoipResetGpio);
 EXPORT_SYMBOL(BpGetVoipIntrGpio);
-EXPORT_SYMBOL(BpGetPcmciaResetGpio);
 EXPORT_SYMBOL(BpGetRtsCtsUartGpios);
 EXPORT_SYMBOL(BpGetAdslLedGpio);
 EXPORT_SYMBOL(BpGetAdslFailLedGpio);
@@ -1795,7 +1918,6 @@ EXPORT_SYMBOL(BpGetWanDataLedGpio);
 EXPORT_SYMBOL(BpGetPppLedGpio);
 EXPORT_SYMBOL(BpGetPppFailLedGpio);
 EXPORT_SYMBOL(BpGetVoipLedGpio);
-EXPORT_SYMBOL(BpGetWirelessExtIntr);
 EXPORT_SYMBOL(BpGetAdslDyingGaspExtIntr);
 EXPORT_SYMBOL(BpGetVoipExtIntr);
 EXPORT_SYMBOL(BpGetHpnaExtIntr);
@@ -1804,9 +1926,11 @@ EXPORT_SYMBOL(BpGetVoipChipSelect);
 EXPORT_SYMBOL(BpGetWirelessSesBtnGpio);
 EXPORT_SYMBOL(BpGetWirelessSesExtIntr);
 EXPORT_SYMBOL(BpGetWirelessSesLedGpio);
+EXPORT_SYMBOL(BpGetWirelessFlags);
 EXPORT_SYMBOL(kerSysRegisterDyingGaspHandler);
 EXPORT_SYMBOL(kerSysDeregisterDyingGaspHandler);
 EXPORT_SYMBOL(kerSysGetCycleCount);
 EXPORT_SYMBOL(kerSysSetWdTimer);
 EXPORT_SYMBOL(kerSysWakeupMonitorTask);
+EXPORT_SYMBOL(BpUpdateWirelessSromMap);