| #pragma once |
| |
| #define RCTX_SIZE_LARGE 960 |
| #define RCTX_SIZE_SMALL 320 |
| #define MAX_HDRSIZE sizeof(struct openpcd_hdr) |
| |
| #include <stdint.h> |
| #include "osmocom/core/linuxlist.h" |
| |
| #define __ramfunc |
| |
| enum req_ctx_state { |
| /* free to be allocated */ |
| RCTX_S_FREE, |
| |
| /* USB -> UART */ |
| /* In USB driver, waiting for data from host */ |
| RCTX_S_USB_RX_BUSY, |
| /* somewhere in the main loop */ |
| RCTX_S_MAIN_PROCESSING, |
| /* pending (in queue) for transmission on UART */ |
| RCTX_S_UART_TX_PENDING, |
| /* currently in active transmission on UART */ |
| RCTX_S_UART_TX_BUSY, |
| |
| /* UART -> USB */ |
| /* currently in active reception on UART */ |
| RCTX_S_UART_RX_BUSY, |
| /* pending (in queue) for transmission over USB to host */ |
| RCTX_S_USB_TX_PENDING, |
| /* currently in transmission over USB to host */ |
| RCTX_S_USB_TX_BUSY, |
| |
| /* number of states */ |
| RCTX_STATE_COUNT |
| }; |
| |
| struct req_ctx { |
| /* if this req_ctx is on a queue... */ |
| struct llist_head list; |
| uint32_t ep; |
| |
| /* enum req_ctx_state */ |
| volatile uint32_t state; |
| /* size of th 'data' buffer */ |
| uint16_t size; |
| /* total number of used bytes in buffer */ |
| uint16_t tot_len; |
| /* index into the buffer, user specific */ |
| uint16_t idx; |
| /* actual data buffer */ |
| uint8_t *data; |
| }; |
| |
| extern void req_ctx_init(void); |
| extern struct req_ctx __ramfunc *req_ctx_find_get(int large, uint32_t old_state, uint32_t new_state); |
| extern struct req_ctx *req_ctx_find_busy(void); |
| extern void req_ctx_set_state(struct req_ctx *ctx, uint32_t new_state); |
| extern void req_ctx_put(struct req_ctx *ctx); |
| extern uint8_t req_ctx_num(struct req_ctx *ctx); |
| unsigned int req_ctx_count(uint32_t state); |