diff options
| author | (no author) <(no author)@6dc7ffe9-61d6-0310-9af1-9938baff3ed1> | 2006-07-30 10:14:06 +0000 | 
|---|---|---|
| committer | (no author) <(no author)@6dc7ffe9-61d6-0310-9af1-9938baff3ed1> | 2006-07-30 10:14:06 +0000 | 
| commit | c19a9345b92522c905f75fcdcd5d8fea6678887c (patch) | |
| tree | feb2999c0648b5066b4850910bebc0585c7938ef | |
| parent | 616c33c49c3e6a2156a7489142915e32e7783073 (diff) | |
introduce new req_ctx api and handling 
git-svn-id: https://svn.openpcd.org:2342/trunk@59 6dc7ffe9-61d6-0310-9af1-9938baff3ed1
| -rw-r--r-- | openpcd/firmware/src/openpcd.h | 24 | ||||
| -rw-r--r-- | 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);  } | 
