summaryrefslogtreecommitdiff
path: root/os/manga/ioring.c
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2006-12-22 21:39:35 +0000
committerCharles.Forsyth <devnull@localhost>2006-12-22 21:39:35 +0000
commit74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a (patch)
treec6e220ba61db3a6ea4052e6841296d829654e664 /os/manga/ioring.c
parent46439007cf417cbd9ac8049bb4122c890097a0fa (diff)
20060303
Diffstat (limited to 'os/manga/ioring.c')
-rw-r--r--os/manga/ioring.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/os/manga/ioring.c b/os/manga/ioring.c
new file mode 100644
index 00000000..fa3dc209
--- /dev/null
+++ b/os/manga/ioring.c
@@ -0,0 +1,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;
+}