blob: e73b826f03a1470e8a872a88fb61cd6b6fb9cf47 [file] [log] [blame]
Christina Quast2b8a18b2015-04-12 09:31:36 +02001#include "board.h"
Harald Welte2a6d3af2016-02-28 19:29:14 +01002#include "req_ctx.h"
Christina Quast2b8a18b2015-04-12 09:31:36 +02003
Harald Welte2a6d3af2016-02-28 19:29:14 +01004/* call-back after (successful?) transfer of a buffer */
5static void usb_write_cb(uint8_t *arg, uint8_t status, uint32_t transferred,
6 uint32_t remaining)
Christina Quast2b8a18b2015-04-12 09:31:36 +02007{
Harald Welte2a6d3af2016-02-28 19:29:14 +01008 struct req_ctx *rctx = (struct req_ctx *) arg;
9
10 if (status != USBD_STATUS_SUCCESS)
11 TRACE_ERROR("%s error, status=%d\n", __func__, status);
12
13 /* release request contxt to pool */
14 req_ctx_set_state(rctx, RCTX_S_FREE);
Christina Quast2b8a18b2015-04-12 09:31:36 +020015}
16
Harald Welte2a6d3af2016-02-28 19:29:14 +010017int usb_to_host(void)
Christina Quast2b8a18b2015-04-12 09:31:36 +020018{
Harald Welte2a6d3af2016-02-28 19:29:14 +010019 struct req_ctx *rctx;
20 int rc;
Christina Quast2b8a18b2015-04-12 09:31:36 +020021
Harald Welte2a6d3af2016-02-28 19:29:14 +010022 rctx = req_ctx_find_get(0, RCTX_S_USB_TX_PENDING, RCTX_S_USB_TX_BUSY);
23
24 /* FIXME: obtain endpoint number from req_ctx! */
25 rc = USBD_Write(PHONE_DATAIN, rctx->data, rctx->tot_len,
26 (TransferCallback) &usb_write_cb, rctx);
27 if (rc != USBD_STATUS_SUCCESS) {
28 TRACE_ERROR("%s error %x\n", __func__, ret);
29 req_ctx_set_state(rctx, RCTX_S_USB_TX_PENDING);
30 return 0;
31 }
32
33 return 1;
Christina Quast2b8a18b2015-04-12 09:31:36 +020034}
35
Harald Welte2a6d3af2016-02-28 19:29:14 +010036static void usb_read_cb(uint8_t *arg, uint8_t status, uint32_t transferred,
37 uint32_t remaining)
Christina Quast2b8a18b2015-04-12 09:31:36 +020038{
Harald Welte2a6d3af2016-02-28 19:29:14 +010039 struct req_ctx *rctx = (struct req_ctx *) arg;
Christina Quast2b8a18b2015-04-12 09:31:36 +020040
Harald Welte2a6d3af2016-02-28 19:29:14 +010041 if (status != USBD_STATUS_SUCCESS) {
42 TRACE_ERROR("%s error, status=%d\n", __func__, status);
43 /* release request contxt to pool */
44 req_ctx_put(rctx);
45 return;
46 }
47 req_ctx_set_state(rctx, RCTX_S_UART_TX_PENDING);
48}
49
50int usb_from_host(int ep)
51{
52 struct req_ctx *rctx;
53 int rc;
54
55 rctx = req_ctx_find_get(0, RCTX_S_FREE, RCTX_S_USB_RX_BUSY);
56
57 rc = USBD_Read(ep, rctx->data, rctx->size,
58 (TransferCallback) &usb_read_cb, rctx);
59
60 if (rc != USBD_STATUS_SUCCESS) {
61 TRACE_ERROR("%s error %x\n", __func__, ret);
62 req_ctx_put(rctx);
63 }
64
65 return 0;
Christina Quast2b8a18b2015-04-12 09:31:36 +020066}