From c19a9345b92522c905f75fcdcd5d8fea6678887c Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@6dc7ffe9-61d6-0310-9af1-9938baff3ed1> Date: Sun, 30 Jul 2006 10:14:06 +0000 Subject: introduce new req_ctx api and handling git-svn-id: https://svn.openpcd.org:2342/trunk@59 6dc7ffe9-61d6-0310-9af1-9938baff3ed1 --- openpcd/firmware/src/openpcd.h | 24 ++++++++++++++++++------ openpcd/firmware/src/req_ctx.c | 40 ++++++++++++++++++++-------------------- 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/openpcd/firmware/src/openpcd.h b/openpcd/firmware/src/openpcd.h index 56304e1..fa93dce 100644 --- a/openpcd/firmware/src/openpcd.h +++ b/openpcd/firmware/src/openpcd.h @@ -23,7 +23,7 @@ #define OPENPCD_IRQ_PRIO_UDP (AT91C_AIC_PRIOR_LOWEST+1) #define OPENPCD_IRQ_PRIO_RC632 AT91C_AIC_PRIOR_LOWEST -#define MAX_REQSIZE 256 +#define MAX_REQSIZE 64 #define MAX_HDRSIZE 8 #define req_buf_payload(x) (x->data[x->hdr_len]) @@ -38,17 +38,29 @@ struct req_buf { }; struct req_ctx { - //u_int16_t seq; /* request sequence number */ - - u_int32_t flags; - + u_int16_t seq; /* request sequence number */ + u_int16_t flags; + volatile u_int32_t state; struct req_buf rx; struct req_buf tx; }; +#define RCTX_STATE_FREE 0x00 +#define RCTX_STATE_UDP_RCV_BUSY 0x01 +#define RCTX_STATE_UDP_RCV_DONE 0x02 +#define RCTX_STATE_MAIN_PROCESSING 0x03 +#define RCTX_STATE_RC632IRQ_BUSY 0x04 + +#define RCTX_STATE_UDP_EP2_PENDING 0x10 +#define RCTX_STATE_UDP_EP2_BUSY 0x11 + +#define RCTX_STATE_UDP_EP3_PENDING 0x12 +#define RCTX_STATE_UDP_EP3_BUSY 0x13 + #define NUM_REQ_CTX 8 -extern struct req_ctx *req_ctx_find_get(void); +extern struct req_ctx *req_ctx_find_get(unsigned long old_state, unsigned long new_state); extern struct req_ctx *req_ctx_find_busy(void); +extern void req_ctx_set_state(struct req_ctx *ctx, unsigned long new_state); extern void req_ctx_put(struct req_ctx *ctx); extern u_int8_t req_ctx_num(struct req_ctx *ctx); diff --git a/openpcd/firmware/src/req_ctx.c b/openpcd/firmware/src/req_ctx.c index c0731fe..984f6b9 100644 --- a/openpcd/firmware/src/req_ctx.c +++ b/openpcd/firmware/src/req_ctx.c @@ -8,26 +8,21 @@ /* FIXME: locking, FIFO order processing */ -static struct req_ctx req_ctx[8]; -static unsigned long req_ctx_busy; /* bitmask of used request contexts */ +static struct req_ctx req_ctx[NUM_REQ_CTX]; -struct req_ctx *req_ctx_find_get(void) +struct req_ctx *req_ctx_find_get(unsigned long old_state, unsigned long new_state) { + unsigned long flags; u_int8_t i; - for (i = 0; i < NUM_REQ_CTX; i++) { - if (test_and_set_bit(i, &req_ctx_busy) == 1) - return &req_ctx[i]; - } - return NULL; -} - -struct req_ctx *req_ctx_find_busy(void) -{ - u_int8_t i; for (i = 0; i < NUM_REQ_CTX; i++) { - if (test_bit(i, &req_ctx_busy)) + local_irq_save(flags); + if (req_ctx[i].state == old_state) { + req_ctx[i].state = new_state; + local_irq_restore(flags); return &req_ctx[i]; + } + local_irq_restore(flags); } return NULL; @@ -38,12 +33,17 @@ u_int8_t req_ctx_num(struct req_ctx *ctx) return ((void *)ctx - (void *)&req_ctx[0])/sizeof(*ctx); } -void req_ctx_put(struct req_ctx *ctx) +void req_ctx_set_state(struct req_ctx *ctx, unsigned long new_state) { - int offset = req_ctx_num(ctx); - if (offset > NUM_REQ_CTX) - DEBUGPCR("Error in offset calculation req_ctx_put"); + unsigned long flags; + + /* FIXME: do we need this kind of locking, we're UP! */ + local_irq_save(flags); + ctx->state = new_state; + local_irq_restore(flags); +} - clear_bit(offset, &req_ctx_busy); - //req_ctx_busy &= ~(1 << offset); +void req_ctx_put(struct req_ctx *ctx) +{ + req_ctx_set_state(ctx, RCTX_STATE_FREE); } -- cgit v1.2.3