X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=target_firmware%2Fmagpie_fw_dev%2Ftarget%2Fhif%2Fusb_api_main_patch.c;h=10a1123a97c7405b04c086f2f95c8ca8da9858cc;hb=024df3f6d90e4518e0143d07ddc523bc9b2c6542;hp=5daf1766447bf3fd311b192b1504436d059748b3;hpb=a595388aceac29334b75c1fd83b074991897cc54;p=open-ath9k-htc-firmware.git diff --git a/target_firmware/magpie_fw_dev/target/hif/usb_api_main_patch.c b/target_firmware/magpie_fw_dev/target/hif/usb_api_main_patch.c index 5daf176..10a1123 100644 --- a/target_firmware/magpie_fw_dev/target/hif/usb_api_main_patch.c +++ b/target_firmware/magpie_fw_dev/target/hif/usb_api_main_patch.c @@ -26,6 +26,80 @@ void cold_reboot(void) A_USB_JUMP_BOOT(); } +/* + * support more than 64 bytes command on ep3 + */ +void usb_status_in_patch(void) +{ + uint16_t count; + uint16_t remainder; + uint16_t reg_buf_len; + static uint16_t buf_len; + static VBUF *evntbuf = NULL; + static volatile uint32_t *regaddr; + static BOOLEAN cmd_is_new = TRUE; + BOOLEAN cmd_end = FALSE; + + if (cmd_is_new) { + evntbuf = usbFifoConf.get_event_buf(); + if (evntbuf != NULL) { + regaddr = (uint32_t *)VBUF_GET_DATA_ADDR(evntbuf); + buf_len = evntbuf->buf_length; + } else { + mUSB_STATUS_IN_INT_DISABLE(); + return; + } + + cmd_is_new = FALSE; + } + + if (buf_len > USB_EP3_MAX_PKT_SIZE) { + reg_buf_len = USB_EP3_MAX_PKT_SIZE; + buf_len -= USB_EP3_MAX_PKT_SIZE; + } + /* TODO: 64 bytes... + * controller supposed will take care of zero-length? */ + else { + reg_buf_len = buf_len; + cmd_end = TRUE; + } + + /* INT use EP3 */ + for (count = 0; count < (reg_buf_len / 4); count++) + { + USB_WORD_REG_WRITE(ZM_EP3_DATA_OFFSET, *regaddr); + regaddr++; + } + + remainder = reg_buf_len % 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 && cmd_end) { + usbFifoConf.send_event_done(evntbuf); + cmd_is_new = TRUE; + } +} + /* * support more than 64 bytes command on ep4 */