k2_fw_usb_api: workaround for EP4 bug.
authorOleksij Rempel <linux@rempel-privat.de>
Wed, 24 Jul 2013 08:26:18 +0000 (10:26 +0200)
committerOleksij Rempel <linux@rempel-privat.de>
Wed, 24 Jul 2013 08:56:34 +0000 (10:56 +0200)
This patch is workaround for xhci related issue.
After usb port resume FIFO on EP4 can't accept Bulck stream longer then
64 Bytes.
Currently we have no better way then just completly reset chip.
Side effect of this workaround - disconnection event for this device.
It means, module will be reloaded and we will get new usb minor id.
This is why, we should not do it on each firmware restart.

Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
target_firmware/magpie_fw_dev/target/hif/k2_fw_usb_api.c

index 0be8a8744ed0f89d5c11cd9085e33b7eea17efa8..83a72a94de7762b7f0c6bb0cd7b55a1bf8d301d8 100755 (executable)
@@ -402,6 +402,17 @@ void _fw_usb_reset_fifo(void)
     A_UART_HWINIT((22*1000*1000), 19200);
 }
 
+void cold_reboot(void)
+{
+       A_PRINTF("Cold reboot initiated.");
+#if defined(PROJECT_MAGPIE)
+       HAL_WORD_REG_WRITE(WATCH_DOG_MAGIC_PATTERN_ADDR, 0);
+#elif defined(PROJECT_K2)
+       HAL_WORD_REG_WRITE(MAGPIE_REG_RST_STATUS_ADDR, 0);
+#endif /* #if defined(PROJECT_MAGPIE) */
+       A_USB_JUMP_BOOT();
+}
+
 /*
  * -- support more than 64 bytes command on ep4 -- 
  */
@@ -420,7 +431,7 @@ void vUsb_Reg_Out_patch(void)
     usbfifolen = USB_BYTE_REG_READ(ZM_EP4_BYTE_COUNT_LOW_OFFSET);
     if (usbfifolen > 0x40) {
         A_PRINTF("EP4 FIFO Bug? Buffer is too big: %x\n", usbfifolen);
-        goto ERR;
+        cold_reboot();
     }
 
     // check is command is new