int usb_write(void *buf, unsigned len) { int r; if (fastboot_state == STATE_ERROR) goto oops; req->buf = buf; req->length = len; req->complete = req_complete; r = udc_request_queue(in, req); if (r < 0) { dprintf(INFO, "usb_write() queue failed\n"); goto oops; } event_wait(&txn_done); if (txn_status < 0) { dprintf(INFO, "usb_write() transaction failed\n"); goto oops; } return req->length; oops: fastboot_state = STATE_ERROR; return -1; }
static int usb_read(void *_buf, unsigned len) { int r; unsigned xfer; unsigned char *buf = _buf; int count = 0; if (fastboot_state == STATE_ERROR) goto oops; while (len > 0) { xfer = (len > MAX_USBFS_BULK_SIZE) ? MAX_USBFS_BULK_SIZE : len; req->buf = PA((addr_t)buf); req->length = xfer; req->complete = req_complete; r = udc_request_queue(out, req); if (r < 0) { dprintf(INFO, "usb_read() queue failed\n"); goto oops; } event_wait(&txn_done); if (txn_status < 0) { dprintf(INFO, "usb_read() transaction failed\n"); goto oops; } count += req->length; buf += req->length; len -= req->length; /* short transfer? */ if (req->length != xfer) break; } /* * Force reload of buffer from memory * since transaction is complete now. */ arch_invalidate_cache_range(_buf, count); return count; oops: fastboot_state = STATE_ERROR; return -1; }
int usb_read(void *_buf, unsigned len) { int r; unsigned xfer; unsigned char *buf = _buf; int count = 0; if (fastboot_state == STATE_ERROR) goto oops; while (len > 0) { xfer = (len > MAX_USBFS_BULK_SIZE) ? MAX_USBFS_BULK_SIZE : len; req->buf = buf; req->length = xfer; req->complete = req_complete; r = udc_request_queue(out, req); if (r < 0) { dprintf(INFO, "usb_read() queue failed\n"); goto oops; } event_wait(&txn_done); if (txn_status < 0) { dprintf(INFO, "usb_read() transaction failed\n"); goto oops; } count += req->length; buf += req->length; len -= req->length; /* short transfer? */ if (req->length != xfer) break; } return count; oops: fastboot_state = STATE_ERROR; return -1; }