This commit is contained in:
Carl-Benedikt Krüger 2011-08-04 15:02:23 +02:00
parent 695ca0da4f
commit a5b402b1f5
2 changed files with 32 additions and 38 deletions

View file

@ -76,8 +76,6 @@ extern HANDLE hProc;
* regarding the driver & its configuration
*/
/*
*/
#define MMNIF_TX_BUFFERLEN 1792
#define MMNIF_TX_QUEUELEN 4
@ -128,9 +126,6 @@ static unsigned int router_ip_address = 0xC0A80001; /* 192.168.0.1 */
char* mpb_start_address = NULL;
unsigned int mpb_size = NULL;
/* just set and reset the irq */
static int pulse_irq = 0;
/*
* the memory mapped network device
*/
@ -184,19 +179,18 @@ typedef struct rx_desc
/* receive ring buffer structure */
typedef struct mm_rx_buffer
{
/*
*
/* iv_intr: inform via interrupt
* states whether the interface wants to recieve an interrupt for
* incoming packet
*/
uint16_t iv_intr;
/* memory "pseudo-ring/heap"
* packets are always in one single chunk of memory
* head : head of allocated memory region
* tail : tail of allocated memory region
*/
uint16_t iv_intr;
uint16_t roffset;
uint16_t woffset;
uint32_t head;
uint32_t tail;
uint16_t tot_bytes;
uint16_t free_bytes;
uint16_t free_bytes_head;
uint16_t free_bytes_tail;
spinlock_t wlock;
uint16_t head;
uint16_t tail;
spinlock_t rlock;
/*
*
@ -429,22 +423,22 @@ uint32_t mmnif_rxbuff_alloc(uint8_t dest,uint16_t len)
if (rb->dcount)
{
if (rb->woffset > rb->roffset)
if (rb->tail > rb->head)
{
if (MMNIF_RX_BUFFERLEN - rb->woffset > len)
if (MMNIF_RX_BUFFERLEN - rb->tail > len)
{
rb->desc_table[rb->dwrite].stat = MMNIF_STATUS_PENDING;
ret = memblock + rb->woffset;
ret = memblock + rb->tail;
rb->desc_table[rb->dwrite].addr = ret;
rb->desc_table[rb->dwrite].len = len;
rb->dcount--;
rb->dwrite = (++rb->dwrite)%MMNIF_MAX_DESCRIPTORS;
rb->woffset = (rb->woffset + len);
rb->tail = (rb->tail + len);
spinlock_unlock(&rb->dlock);
return ret;
}
else if (rb->roffset > len)
else if (rb->head > len)
{
rb->desc_table[rb->dwrite].stat = MMNIF_STATUS_PENDING;
ret = memblock;
@ -453,7 +447,7 @@ uint32_t mmnif_rxbuff_alloc(uint8_t dest,uint16_t len)
rb->dcount--;
rb->dwrite = (++rb->dwrite)%MMNIF_MAX_DESCRIPTORS;
rb->woffset = len;
rb->tail = len;
spinlock_unlock(&rb->dlock);
return ret;
}
@ -465,36 +459,36 @@ uint32_t mmnif_rxbuff_alloc(uint8_t dest,uint16_t len)
}
else
{
if (rb->roffset - rb->woffset > len)
if (rb->head - rb->tail > len)
{
rb->desc_table[rb->dwrite].stat = MMNIF_STATUS_PENDING;
ret = memblock + rb->woffset;
ret = memblock + rb->tail;
rb->desc_table[rb->dwrite].addr = ret;
rb->desc_table[rb->dwrite].len = len;
rb->dcount--;
rb->dwrite = (++rb->dwrite)%MMNIF_MAX_DESCRIPTORS;
rb->woffset = (rb->woffset + len);
rb->tail = (rb->tail + len);
spinlock_unlock(&rb->dlock);
return ret;
}
else if (rb->woffset == rb->roffset)
else if (rb->tail == rb->head)
{
if (MMNIF_RX_BUFFERLEN - rb->woffset < len)
if (MMNIF_RX_BUFFERLEN - rb->tail < len)
{
rb->woffset = 0;
rb->tail = 0;
if (rb->dread == rb->dwrite)
rb->roffset = 0;
rb->head = 0;
}
rb->desc_table[rb->dwrite].stat = MMNIF_STATUS_PENDING;
ret = memblock + rb->woffset;
ret = memblock + rb->tail;
rb->desc_table[rb->dwrite].addr = ret;
rb->desc_table[rb->dwrite].len = len;
rb->dcount--;
rb->dwrite = (++rb->dwrite)%MMNIF_MAX_DESCRIPTORS;
rb->woffset = (rb->woffset + len);
rb->tail = (rb->tail + len);
spinlock_unlock(&rb->dlock);
return ret;
}
@ -555,21 +549,21 @@ void mmnif_rxbuff_free()
b->dread = (b->dread +1)%MMNIF_MAX_DESCRIPTORS;
b->desc_table[j].stat = MMNIF_STATUS_FREE;
if (b->woffset > b->roffset)
if (b->tail > b->head)
{
b->roffset += b->desc_table[j].len;
b->head += b->desc_table[j].len;
}
else
{
if ( (b->desc_table[(j+1)%MMNIF_MAX_DESCRIPTORS].stat != MMNIF_STATUS_FREE )
&& ( b->desc_table[j].addr > b->desc_table[(j+1)%MMNIF_MAX_DESCRIPTORS].addr))
{
b->roffset = 0;
b->head = 0;
}
else
{
b->roffset += b->desc_table[j].len;
b->head += b->desc_table[j].len;
}
}
}

View file

@ -158,7 +158,7 @@ void srv_on_conn(ServerEventArgs* e)
{
int i = 0, err = 0;
int tmp1,tmp2;
char buff[256];
char buff[1024];
SHELLDEBUGPRINTF("someone finally connected\n");
@ -180,7 +180,7 @@ void srv_on_conn(ServerEventArgs* e)
tmp2 = get_clock_tick();
// SHELLDEBUGPRINTF("send with %f kb/s",((float)i*sizeof(buff))/(tmp2-tmp1));
SHELLDEBUGPRINTF("send %d kb in %d ticks",i*sizeof(buff),(tmp2-tmp1));
SHELLDEBUGPRINTF("send %d bytes in %d ticks",i*sizeof(buff),(tmp2-tmp1));
}
void* server_task(void* e)