+/* shared patches for k2 and magpie */
#include "usb_defs.h"
#include "usb_type.h"
extern USB_FIFO_CONFIG usbFifoConf;
extern Action eUsbCxFinishAction;
+extern void _fw_usb_suspend_reboot();
+
+typedef void (* USBFIFO_recv_command)(VBUF *cmd);
+USBFIFO_recv_command m_origUsbfifoRecvCmd = NULL;
+
+void _fw_usbfifo_recv_command(VBUF *buf)
+{
+ uint8_t *cmd_data;
+ uint32_t tmp;
+
+ cmd_data = (uint8_t *)(buf->desc_list->buf_addr +
+ buf->desc_list->data_offset);
+ tmp = *((uint32_t *)cmd_data);
+ if (tmp == 0xFFFFFFFF)
+ _fw_usb_suspend_reboot();
+ 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;
+}
void cold_reboot(void)
{
return bStandardCommand();
}
+/*
+ * usb descriptor patch
+ */
+
+extern uint16_t *u8ConfigDescriptorEX;
+extern uint16_t *pu8DescriptorEX;
+extern uint16_t u16TxRxCounter;
+extern SetupPacket ControlCmd;
+extern uint16_t *u8UsbDeviceDescriptor;
+extern BOOLEAN bGet_descriptor(void);
+
+uint16_t ConfigDescriptorPatch[30];
+uint16_t UsbDeviceDescriptorPatch[9];
+
+#define BCD_DEVICE_OFFSET 6
+#define BCD_DEVICE_FW_SIGNATURE 0xffff
+#define VENDOR_ID_OFFSET 4
+#define PRODUCT_ID_OFFSET 5
+
+#define EP3_TRANSFER_TYPE_OFFSET 17
+#define EP3_INT_INTERVAL 19
+#define EP4_TRANSFER_TYPE_OFFSET 21
+#define EP4_INT_INTERVAL 22
+
+BOOLEAN bGet_descriptor_patch(void)
+{
+ if (mDEV_REQ_VALUE_HIGH() == 1)
+ {
+ uint8_t *p = (uint8_t *)u8UsbDeviceDescriptor;
+
+ /* Copy Usb Device Descriptor */
+ ath_hal_memcpy(UsbDeviceDescriptorPatch, p,
+ sizeof(UsbDeviceDescriptorPatch));
+
+ /* Change bcdDevice. we need it to detect if FW
+ * was uploaded. */
+ UsbDeviceDescriptorPatch[BCD_DEVICE_OFFSET] =
+ BCD_DEVICE_FW_SIGNATURE;
+
+ pu8DescriptorEX = UsbDeviceDescriptorPatch;
+ u16TxRxCounter = mTABLE_LEN(u8UsbDeviceDescriptor[0]);
+
+ if (u16TxRxCounter > mDEV_REQ_LENGTH())
+ u16TxRxCounter = mDEV_REQ_LENGTH();
+
+ A_USB_EP0_TX_DATA();
+
+ return TRUE;
+ } else if (mDEV_REQ_VALUE_HIGH() == 2) {
+ uint8_t *p = (uint8_t *)u8ConfigDescriptorEX;
+
+ /* Copy ConfigDescriptor */
+ ath_hal_memcpy(ConfigDescriptorPatch, p,
+ sizeof(ConfigDescriptorPatch));
+
+ /* place holder for EPx patches */
+
+ if (mDEV_REQ_VALUE_LOW() == 0) {
+ /* configuration no: 0 */
+ pu8DescriptorEX = ConfigDescriptorPatch;
+ u16TxRxCounter = ConfigDescriptorPatch[1];
+ } else
+ return FALSE;
+
+ if (u16TxRxCounter > mDEV_REQ_LENGTH())
+ u16TxRxCounter = mDEV_REQ_LENGTH();
+
+ A_USB_EP0_TX_DATA();
+ return TRUE;
+ } else
+ return bGet_descriptor();
+}
+