hif/usb_api: remove dup code - _fw_usbfifo_recv_command
[open-ath9k-htc-firmware.git] / target_firmware / magpie_fw_dev / target / rompatch / usb_api_patch.c
index 872b50d5823b34d5f02e4a44eca9a99dc7e9fad5..52c692e3074bd0d834ccd5834c12a7bbcd8b8c69 100755 (executable)
@@ -46,8 +46,6 @@
 #define measure_time 0
 #define measure_time_pll 10000000
 
-typedef void (* USBFIFO_recv_command)(VBUF *cmd);
-
 extern Action eUsbCxFinishAction;
 extern CommandType eUsbCxCommand;
 extern BOOLEAN UsbChirpFinish;
@@ -55,8 +53,6 @@ extern USB_FIFO_CONFIG usbFifoConf;
 extern uint16_t *pu8DescriptorEX;
 extern uint16_t u16TxRxCounter;
 
-USBFIFO_recv_command m_origUsbfifoRecvCmd = NULL;
-
 void zfTurnOffPower_patch(void);
 
 static void _fw_reset_dma_fifo();
@@ -67,365 +63,43 @@ static void _fw_power_off();
 BOOLEAN bEepromExist = TRUE;
 BOOLEAN bJumptoFlash = FALSE;
 
-void _fw_usbfifo_recv_command(VBUF *buf)
+void _fw_usb_suspend_reboot()
 {
-       A_UINT8 *cmd_data;
-       A_UINT32 tmp;
-
-       cmd_data = (A_UINT8 *)(buf->desc_list->buf_addr + buf->desc_list->data_offset);
-       tmp = *((A_UINT32 *)cmd_data);
-       if ( tmp == 0xFFFFFFFF ) {      
-               // reset usb/wlan dma
-               _fw_reset_dma_fifo();
-
-               // restore gpio setting and usb/wlan dma state
-               _fw_restore_dma_fifo();
+       /* reset usb/wlan dma */
+       _fw_reset_dma_fifo();
 
-               // set clock to bypass mode - 40Mhz from XTAL 
-               HAL_WORD_REG_WRITE(MAGPIE_REG_CPU_PLL_BYPASS_ADDR, (BIT0|BIT4));
+       /* restore gpio setting and usb/wlan dma state */
+       _fw_restore_dma_fifo();
 
-               A_DELAY_USECS(100); // wait for stable
+       /* set clock to bypass mode - 40Mhz from XTAL */
+       HAL_WORD_REG_WRITE(MAGPIE_REG_CPU_PLL_BYPASS_ADDR, (BIT0|BIT4));
 
-               HAL_WORD_REG_WRITE(MAGPIE_REG_CPU_PLL_ADDR, (BIT16));
+       A_DELAY_USECS(100); /* wait for stable */
 
-               A_DELAY_USECS(100); // wait for stable
-               A_UART_HWINIT((40*1000*1000), 19200);
+       HAL_WORD_REG_WRITE(MAGPIE_REG_CPU_PLL_ADDR, (BIT16));
 
-               A_CLOCK_INIT(40);
+       A_DELAY_USECS(100); /* wait for stable */
+       A_UART_HWINIT((40*1000*1000), 19200);
 
-               if (!bEepromExist) { //jump to flash boot (eeprom data in flash)
-                       bJumptoFlash = TRUE;
-                       A_PRINTF("Jump to Flash BOOT\n");
-                       app_start();
-               }else{
-                       A_PRINTF("receive the suspend command...\n");
-                       // reboot.....
-                       A_USB_JUMP_BOOT();              
-               }
+       A_CLOCK_INIT(40);
 
+       if (!bEepromExist) { /* jump to flash boot (eeprom data in flash) */
+               bJumptoFlash = TRUE;
+               A_PRINTF("Jump to Flash BOOT\n");
+               app_start();
        } else {
-               m_origUsbfifoRecvCmd(buf);
-       }
-}
-
-void _fw_usbfifo_init(USB_FIFO_CONFIG *pConfig)
-{
-       m_origUsbfifoRecvCmd = pConfig->recv_command;
-
-       usbFifoConf.get_command_buf = pConfig->get_command_buf;
-       usbFifoConf.recv_command    = _fw_usbfifo_recv_command;
-       usbFifoConf.get_event_buf   = pConfig->get_event_buf;
-       usbFifoConf.send_event_done = pConfig->send_event_done;
-}
-
-/*
- * -- support more than 64 bytes command on ep4 -- 
- */
-void vUsb_Reg_Out_patch(void)
-{   
-       uint16_t usbfifolen;
-       uint16_t ii;
-       uint32_t ep4_data;
-       static volatile uint32_t *regaddr;
-       static uint16_t cmdLen;
-       static VBUF *buf;
-       BOOLEAN cmd_is_last = FALSE;
-       static BOOLEAN cmd_is_new = TRUE;
-
-       // get the size of this transcation
-       usbfifolen = USB_BYTE_REG_READ(ZM_EP4_BYTE_COUNT_LOW_OFFSET);
-
-       // check is command is new
-       if( cmd_is_new ){
-
-               buf = usbFifoConf.get_command_buf();
-               cmdLen = 0;
-
-               if( !buf )
-                       goto ERR;
-
-               // copy free, assignment buffer of the address
-               regaddr = (uint32_t *)buf->desc_list->buf_addr;
-
-               cmd_is_new = FALSE;
-       }
-
-       // just in case, suppose should not happen
-       if( !buf )
-               goto ERR;
-
-       // if size is smaller, this is the last command!
-       // zero-length supposed should be set through 0x27/bit7->0x19/bit4, not here
-       if( usbfifolen<64 ) {
-               cmd_is_last = TRUE;
-       }
-
-       // accumulate the size
-       cmdLen += usbfifolen;
-
-       // round it to alignment
-       if(usbfifolen % 4)
-               usbfifolen = (usbfifolen >> 2) + 1;
-       else
-               usbfifolen = usbfifolen >> 2;
-
-       // retrieve the data from fifo
-       for(ii = 0; ii < usbfifolen; ii++)
-       {
-               ep4_data = USB_WORD_REG_READ(ZM_EP4_DATA_OFFSET);   // read fifo data out
-               *regaddr = ep4_data;
-               regaddr++;
-       }
-
-       // if this is the last command, callback to HTC
-       if (  cmd_is_last  )
-       {
-               buf->desc_list->next_desc = NULL;
-               buf->desc_list->data_offset = 0;
-               buf->desc_list->data_size = cmdLen;
-               buf->desc_list->control = 0;
-               buf->next_buf = NULL;
-               buf->buf_length = cmdLen;
-
-               usbFifoConf.recv_command(buf);
-
-               cmd_is_new = TRUE;
-       }
-
-       goto DONE;
-ERR:
-       //    we might get no command buffer here?
-       //    but if we return here, the ep4 fifo will be lock out,
-       //    so that we still read them out but just drop it ?
-       for(ii = 0; ii < usbfifolen; ii++)
-       {
-               ep4_data = USB_WORD_REG_READ(ZM_EP4_DATA_OFFSET);   // read fifo data out
-       }
-
-DONE:
-       //mUSB_STATUS_IN_INT_ENABLE();
-       ;
-}
-
-
-/* 
- *  -- usb1.1 ep6 fix --
- */
-extern uint16_t       u8UsbConfigValue;
-extern uint16_t       u8UsbInterfaceValue;
-extern uint16_t       u8UsbInterfaceAlternateSetting;
-extern SetupPacket    ControlCmd;
-extern void vUsbClrEPx(void);
-
-#undef FS_C1_I0_A0_EP_NUMBER
-#define FS_C1_I0_A0_EP_NUMBER 6
-
-#define FS_C1_I0_A0_EP6_BLKSIZE    BLK512BYTE
-#define FS_C1_I0_A0_EP6_BLKNO      DOUBLE_BLK
-#define FS_C1_I0_A0_EP6_DIRECTION  DIRECTION_OUT
-#define FS_C1_I0_A0_EP6_TYPE       TF_TYPE_BULK
-#define FS_C1_I0_A0_EP6_MAX_PACKET 0x0040
-#define FS_C1_I0_A0_EP6_bInterval  00
-
-// EP6
-#define FS_C1_I0_A0_EP6_FIFO_START  (FS_C1_I0_A0_EP5_FIFO_START + FS_C1_I0_A0_EP5_FIFO_NO)
-#define FS_C1_I0_A0_EP6_FIFO_NO     (FS_C1_I0_A0_EP6_BLKNO * FS_C1_I0_A0_EP6_BLKSIZE)
-#define FS_C1_I0_A0_EP6_FIFO_CONFIG (0x80 | ((FS_C1_I0_A0_EP6_BLKSIZE - 1) << 4) | ((FS_C1_I0_A0_EP6_BLKNO - 1) << 2) | FS_C1_I0_A0_EP6_TYPE)
-#define FS_C1_I0_A0_EP6_FIFO_MAP    (((1 - FS_C1_I0_A0_EP6_DIRECTION) << 4) | EP6)
-#define FS_C1_I0_A0_EP6_MAP         (FS_C1_I0_A0_EP6_FIFO_START |   (FS_C1_I0_A0_EP6_FIFO_START << 4)   | (MASK_F0 >> (4*FS_C1_I0_A0_EP6_DIRECTION)))
-
-
-#define CMD_PCI_RC_RESET_ON() HAL_WORD_REG_WRITE(MAGPIE_REG_RST_RESET_ADDR, \
-                        (HAL_WORD_REG_READ(MAGPIE_REG_RST_RESET_ADDR)| \
-                         (PCI_RC_PHY_SHIFT_RESET_BIT|PCI_RC_PLL_RESET_BIT|PCI_RC_PHY_RESET_BIT|PCI_RC_RESET_BIT)))
-
-void vUSBFIFO_EP6Cfg_FS_patch(void)
-{
-#if (FS_C1_I0_A0_EP_NUMBER >= 6)
-       int i;
-
-       //EP0X06
-       mUsbEPMap(EP6, FS_C1_I0_A0_EP6_MAP);
-       mUsbFIFOMap(FS_C1_I0_A0_EP6_FIFO_START, FS_C1_I0_A0_EP6_FIFO_MAP);
-       mUsbFIFOConfig(FS_C1_I0_A0_EP6_FIFO_START, FS_C1_I0_A0_EP6_FIFO_CONFIG);
-
-       for(i = FS_C1_I0_A0_EP6_FIFO_START + 1 ;
-            i < FS_C1_I0_A0_EP6_FIFO_START + FS_C1_I0_A0_EP6_FIFO_NO ; i ++)
-       {
-               mUsbFIFOConfig(i, (FS_C1_I0_A0_EP6_FIFO_CONFIG & (~BIT7)) );
-       }
-
-       mUsbEPMxPtSzHigh(EP6, FS_C1_I0_A0_EP6_DIRECTION, (FS_C1_I0_A0_EP6_MAX_PACKET & 0x7ff));
-       mUsbEPMxPtSzLow(EP6, FS_C1_I0_A0_EP6_DIRECTION, (FS_C1_I0_A0_EP6_MAX_PACKET & 0x7ff));
-       mUsbEPinHighBandSet(EP6 , FS_C1_I0_A0_EP6_DIRECTION, FS_C1_I0_A0_EP6_MAX_PACKET);
-#endif
-}
-
-void vUsbFIFO_EPxCfg_FS_patch(void)
-{
-       switch (u8UsbConfigValue)
-       {
-#if (FS_CONFIGURATION_NUMBER >= 1)
-               // Configuration 0X01
-        case 0X01:
-               switch (u8UsbInterfaceValue)
-               {
-#if (FS_C1_INTERFACE_NUMBER >= 1)
-                       // Interface 0
-                case 0:
-                       switch (u8UsbInterfaceAlternateSetting)
-                       {
-
-#if (FS_C1_I0_ALT_NUMBER >= 1)
-                               // AlternateSetting 0
-                        case 0:
-
-                               // snapped....
-
-                               // patch up this ep6_fs config
-                               vUSBFIFO_EP6Cfg_FS_patch();
-
-                               break;
-
-#endif
-                        default:
-                               break;
-                       }
-                       break;
-#endif
-                default:
-                       break;
-               }
-               break;
-#endif
-        default:
-               break;
-       }
-       //mCHECK_STACK();
-}
-
-
-BOOLEAN bSet_configuration_patch(void)
-{
-       bSet_configuration();
-
-       if (mLOW_BYTE(mDEV_REQ_VALUE()) == 0)
-       {
-               // snapped....
-               ;
-       }
-       else
-       {
-               if (mUsbHighSpeedST())                  // First judge HS or FS??
-               {
-                       // snapped....
-                       ;
-               }
-               else
-               {
-                       // snapped....
-                       vUsbFIFO_EPxCfg_FS_patch();
-               }
-
-               // snapped....
+               A_PRINTF("receive the suspend command...\n");
+               /* reboot..... */
+               A_USB_JUMP_BOOT();
        }
 
-       eUsbCxFinishAction = ACT_DONE;
-       return TRUE;
 }
 
-
-/*
- * -- support more than 64 bytes command on ep3 -- 
- */
-void vUsb_Status_In_patch(void)
-{
-       uint16_t count;
-       uint16_t remainder;
-       u16_t RegBufLen;
-       BOOLEAN cmdEnd = FALSE;
-
-       static u16_t mBufLen;
-       static VBUF *evntbuf = NULL;
-       static volatile u32_t *regaddr;
-       static BOOLEAN cmd_is_new = TRUE;
-
-       if( cmd_is_new )
-       {
-               evntbuf = usbFifoConf.get_event_buf();
-               if ( evntbuf != NULL )
-               {
-                       regaddr = (u32_t *)VBUF_GET_DATA_ADDR(evntbuf);
-                       mBufLen = evntbuf->buf_length;
-               }
-               else
-               {
-                       mUSB_STATUS_IN_INT_DISABLE();
-                       goto ERR_DONE;
-               }
-
-               cmd_is_new = FALSE;
-       }
-
-       if( mBufLen > bUSB_EP_MAX_PKT_SIZE_64 ) {
-               RegBufLen = bUSB_EP_MAX_PKT_SIZE_64;
-               mBufLen -= bUSB_EP_MAX_PKT_SIZE_64;
-       }
-       // TODO: 64 byes... controller supposed will take care of zero-length?
-       else {
-               RegBufLen = mBufLen;
-               cmdEnd = TRUE;
-       }
-
-       /* INT use EP3 */
-       for(count = 0; count < (RegBufLen / 4); count++)
-       {
-               USB_WORD_REG_WRITE(ZM_EP3_DATA_OFFSET, *regaddr);
-               regaddr++;
-       }
-
-       remainder = RegBufLen % 4;
-
-       if (remainder)
-       {
-               switch(remainder)
-               {
-               case 3:
-                       USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x7);
-                       break;
-               case 2:
-                       USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x3);
-                       break;
-               case 1:
-                       USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x1);
-                       break;
-               }
-
-               USB_WORD_REG_WRITE(ZM_EP3_DATA_OFFSET, *regaddr);
-
-               // Restore CBus FIFO size to word size            
-               USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0xF);
-       }
-
-       mUSB_EP3_XFER_DONE();
-
-       if ( evntbuf != NULL && cmdEnd )
-       {
-               usbFifoConf.send_event_done(evntbuf);
-               cmd_is_new = TRUE;
-       }
-
-ERR_DONE:
-       ;
-}
-
-
 #define PCI_RC_RESET_BIT                            BIT6
 #define PCI_RC_PHY_RESET_BIT                        BIT7
 #define PCI_RC_PLL_RESET_BIT                        BIT8
 #define PCI_RC_PHY_SHIFT_RESET_BIT                  BIT10
 
-
 /*
  * -- urn_off_merlin --
  * . values suggested from Lalit
@@ -434,7 +108,6 @@ ERR_DONE:
 static void turn_off_merlin()
 {
        volatile uint32_t default_data[9];
-       volatile uint32_t read_data = 0;
        uint32_t i=0;
 
        if(1)
@@ -553,7 +226,6 @@ volatile uint32_t gpio = 0x0;
  */
 void zfTurnOffPower_patch(void)
 {
-       uint32_t i=0;
        A_PRINTF("+++ goto suspend ......\n");
 
        // setting the go suspend here, power down right away...
@@ -605,8 +277,6 @@ void zfResetUSBFIFO_patch(void)
 
 static void _fw_reset_dma_fifo()
 {
-       int i;
-       
        HAL_BYTE_REG_WRITE(0x100ae, (HAL_BYTE_REG_READ(0x100ae)|0x10));
        HAL_BYTE_REG_WRITE(0x100ae, (HAL_BYTE_REG_READ(0x100af)|0x10));
        A_PRINTF("_fw_reset_dma_fifo\n");
@@ -723,6 +393,10 @@ static void _fw_power_on()
                           (HAL_WORD_REG_READ(MAGPIE_REG_ETH_PLL_BYPASS_ADDR)&(~(BIT4|BIT0))));
 }
 
+#define CMD_PCI_RC_RESET_ON() HAL_WORD_REG_WRITE(MAGPIE_REG_RST_RESET_ADDR, \
+                        (HAL_WORD_REG_READ(MAGPIE_REG_RST_RESET_ADDR)| \
+                         (PCI_RC_PHY_SHIFT_RESET_BIT|PCI_RC_PLL_RESET_BIT|PCI_RC_PHY_RESET_BIT|PCI_RC_RESET_BIT)))
+
 static void _fw_restore_dma_fifo(void)
 {
        HAL_WORD_REG_WRITE(0x5601C, (HAL_WORD_REG_READ(0x5601C)&(~(BIT18))));
@@ -742,137 +416,3 @@ static void _fw_restore_dma_fifo(void)
        MAGPIE_REG_USB_RX1_SWAP_DATA = 0x1;
        MAGPIE_REG_USB_RX2_SWAP_DATA = 0x1;
 }
-
-extern uint16_t *u8ConfigDescriptorEX;
-extern uint16_t *pu8DescriptorEX;
-extern uint16_t u16TxRxCounter;
-
-extern uint16_t *u8UsbDeviceDescriptor;
-
-extern BOOLEAN bGet_descriptor(void);
-
-uint16_t ConfigDescriptorPatch[30];
-
- uint16_t UsbDeviceDescriptorPatch[18];
- #define VENDOR_ID_OFFSET           8
- #define PRODUCT_ID_OFFSET          10
-
-#define EP3_TRANSFER_TYPE_OFFSET    17
-#define EP3_INT_INTERVAL            19
-#define EP4_TRANSFER_TYPE_OFFSET    21
-#define EP4_INT_INTERVAL            22
-
-
-
- #define A_SFLASH_READ_4B(u32Data, start_addr) u32Data = *(uint32_t *)(0xf000000+start_addr);
- #define FLASH_SIZE 0x800000 //8M
- #define FLASH_USB_VENDOR_ID_OFFSET     0x86
- #define FLASH_USB_PRODUCT_ID_OFFSET    0x87
-
- // flash reserved size for saving eeprom data is 4K.
- #define EE_DATA_RESERVED_LEN 0x1000 //4K
-
-#define mLOW_MASK(u16)          ((uint8_t) ((u16) & mMASK(8)))
-#define mHIGH_MASK(u16)         ((uint8_t) ((u16) & ~mMASK(8)))
-
-/* (1234) -> 0034 */
-//#define mLOW_BYTE(u16)          ((U_8)(u16))
-#define mLOW_BYTE(u16)          mLOW_MASK(u16)
-/* (1234) -> 0012 */
-#define mHIGH_BYTE(u16)         ((uint8_t) (((uint16_t) (u16)) >> 8))
-
-#define mLOW_WORD0(u32)         ((uint16_t) ((u32) & 0xFFFF))
-#define mHIGH_WORD0(u32)        ((uint16_t) ((u32) >> 16))
-
-/* (1234) -> 3412 */
-#define mSWAP_BYTE(u16)         ((mLOW_MASK(u16) << 8) | mHIGH_BYTE(u16))
-BOOLEAN bGet_descriptor_patch(void)
-{
-       /* Patch for custom id from flash */
-       if (bEepromExist == FALSE && mDEV_REQ_VALUE_HIGH() == 1)
-       {
-               uint8_t *p = (uint8_t *)u8UsbDeviceDescriptor;
-               uint32_t u32Tmp=0;
-               /* Copy Usb Device Descriptor */
-               memcpy(UsbDeviceDescriptorPatch, p, sizeof(UsbDeviceDescriptorPatch));
-
-               A_SFLASH_READ_4B(u32Tmp, FLASH_SIZE - EE_DATA_RESERVED_LEN + FLASH_USB_VENDOR_ID_OFFSET*2);
-               UsbDeviceDescriptorPatch[VENDOR_ID_OFFSET] = mSWAP_BYTE(mLOW_WORD0(u32Tmp));
-               UsbDeviceDescriptorPatch[PRODUCT_ID_OFFSET] = mSWAP_BYTE(mHIGH_WORD0(u32Tmp));             
-      
-               pu8DescriptorEX = UsbDeviceDescriptorPatch;
-               u16TxRxCounter = mTABLE_LEN(u8UsbDeviceDescriptor[0]);
-  
-               if (u16TxRxCounter > mDEV_REQ_LENGTH())  
-                       u16TxRxCounter = mDEV_REQ_LENGTH();
-             
-               A_USB_EP0_TX_DATA();
-           
-               //u16TxRxCounter = 18;
-               return TRUE;
-       }  
-       if (mDEV_REQ_VALUE_HIGH() == 2) {
-               uint8_t *p = (uint8_t *)u8ConfigDescriptorEX;
-
-               /* Copy ConfigDescriptor */
-               memcpy(ConfigDescriptorPatch, p, sizeof(ConfigDescriptorPatch));
-
-               p = (uint8_t *)ConfigDescriptorPatch;
-
-               /* Patch the transfer type of EP3 and EP4 */
-               ConfigDescriptorPatch[EP3_TRANSFER_TYPE_OFFSET] = 0x0283;
-               ConfigDescriptorPatch[EP3_INT_INTERVAL] = 0x0700;
-               ConfigDescriptorPatch[EP4_TRANSFER_TYPE_OFFSET] = 0x4002;
-               ConfigDescriptorPatch[EP4_INT_INTERVAL] = 0x00;
-
-               switch (mDEV_REQ_VALUE_LOW())
-               {
-               case 0x00:      // configuration no: 0
-                       pu8DescriptorEX = ConfigDescriptorPatch;
-                       u16TxRxCounter = ConfigDescriptorPatch[1];
-                       //u16TxRxCounter = 46;
-                       break;
-               default:
-                       return FALSE;
-               }
-
-               if (u16TxRxCounter > mDEV_REQ_LENGTH())
-                       u16TxRxCounter = mDEV_REQ_LENGTH();
-
-               A_USB_EP0_TX_DATA();
-               return TRUE;
-       }
-       else {
-               return bGet_descriptor();
-       }
-}
-
-extern BOOLEAN bStandardCommand(void);
-
-BOOLEAN bStandardCommand_patch(void)
-{
-       if (mDEV_REQ_REQ() == USB_SET_CONFIGURATION) {
-               A_USB_SET_CONFIG();
-
-#if ENABLE_SWAP_DATA_MODE
-               // SWAP FUNCTION should be enabled while DMA engine is not working,
-               // the best place to enable it is before we trigger the DMA
-               MAGPIE_REG_USB_RX0_SWAP_DATA = 0x1;
-               MAGPIE_REG_USB_TX0_SWAP_DATA = 0x1;
-
-#if SYSTEM_MODULE_HP_EP5
-               MAGPIE_REG_USB_RX1_SWAP_DATA = 0x1;
-#endif
-
-#if SYSTEM_MODULE_HP_EP6
-               MAGPIE_REG_USB_RX2_SWAP_DATA = 0x1;
-#endif
-
-#endif //ENABLE_SWAP_DATA_MODE
-               return TRUE;
-       }
-       else {
-               return bStandardCommand();
-       }
-}