summaryrefslogtreecommitdiff
path: root/os/manga/ioring.c
blob: fa3dc209e738dfdd767a51e7a492a1f893ba2112 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "u.h"
#include "../port/lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "io.h"

/*
 * Host Communication buffer rings
 */

/*
 * initialise receive and transmit buffer rings
 *
 * the ring entries must be uncached
 */

BD*
bdalloc(ulong nd)
{
	BD *b;

	b = xspanalloc(nd*sizeof(*b), CACHELINESZ, 0);
	if(b == nil)
		panic("bdalloc");
	return mmucacheinhib(b, nd*sizeof(*b));
}

int
ioringinit(Ring* r, int nrdre, int ntdre)
{
	int i;

	r->nrdre = nrdre;
	if(r->rdr == nil)
		r->rdr = bdalloc(nrdre);
	if(r->rxb == nil)
		r->rxb = malloc(nrdre*sizeof(Block*));
	if(r->rdr == nil || r->rxb == nil)
		return -1;
	for(i = 0; i < nrdre; i++){
		r->rxb[i] = nil;
		r->rdr[i].ctrl = 0;
		r->rdr[i].size = 0;
		r->rdr[i].addr = 0;
		if(i)
			r->rdr[i-1].next = PADDR(&r->rdr[i]);
	}
	r->rdr[i-1].next = PADDR(&r->rdr[0]);
	r->rdrx = 0;

	r->ntdre = ntdre;
	if(r->tdr == nil)
		r->tdr = bdalloc(ntdre);
	if(r->txb == nil)
		r->txb = malloc(ntdre*sizeof(Block*));
	if(r->tdr == nil || r->txb == nil)
		return -1;
	for(i = 0; i < ntdre; i++){
		r->txb[i] = nil;
		r->tdr[i].ctrl = 0;
		r->tdr[i].size = 0;
		r->tdr[i].addr = 0;
		if(i)
			r->tdr[i-1].next = PADDR(&r->tdr[i]);
	}
	r->tdr[i-1].next = PADDR(&r->tdr[0]);
	r->tdrh = 0;
	r->tdri = 0;
	r->ntq = 0;
	return 0;
}