diff options
author | kaashoek <kaashoek> | 2006-08-06 20:28:15 +0000 |
---|---|---|
committer | kaashoek <kaashoek> | 2006-08-06 20:28:15 +0000 |
commit | 8ec6530feea5153e00dced60d33fbfdd9d5c3184 (patch) | |
tree | 90c0d92283f35523cb00d4cdc29334d5420eafae /ide.c | |
parent | 366189214ea663b20a0323b65661987a7de6f56d (diff) | |
download | xv6-labs-8ec6530feea5153e00dced60d33fbfdd9d5c3184.tar.gz xv6-labs-8ec6530feea5153e00dced60d33fbfdd9d5c3184.tar.bz2 xv6-labs-8ec6530feea5153e00dced60d33fbfdd9d5c3184.zip |
generalize async read to support write too
Diffstat (limited to 'ide.c')
-rw-r--r-- | ide.c | 21 |
1 files changed, 13 insertions, 8 deletions
@@ -20,8 +20,9 @@ struct ide_request { int diskno; uint secno; - void *dst; + void *addr; uint nsecs; + uint read; }; struct ide_request request[NREQUEST]; int head, tail; @@ -93,20 +94,22 @@ ide_start_request (void) if (head != tail) { r = &request[tail]; ide_wait_ready(0); - outb(0x3f6, 0); + outb(0x3f6, 0); // generate interrupt outb(0x1F2, r->nsecs); outb(0x1F3, r->secno & 0xFF); outb(0x1F4, (r->secno >> 8) & 0xFF); outb(0x1F5, (r->secno >> 16) & 0xFF); outb(0x1F6, 0xE0 | ((r->diskno&1)<<4) | ((r->secno>>24)&0x0F)); - outb(0x1F7, 0x20); // CMD 0x20 means read sector + if (r->read) outb(0x1F7, 0x20); // read + else outb(0x1F7, 0x30); // write } } void * -ide_start_read(int diskno, uint secno, void *dst, uint nsecs) +ide_start_rw(int diskno, uint secno, void *addr, uint nsecs, int read) { struct ide_request *r; + if(!holding(&ide_lock)) panic("ide_start_read: not holding ide_lock"); @@ -118,9 +121,10 @@ ide_start_read(int diskno, uint secno, void *dst, uint nsecs) r = &request[head]; r->secno = secno; - r->dst = dst; + r->addr = addr; r->nsecs = nsecs; r->diskno = diskno; + r->read = read; head = (head + 1) % NREQUEST; @@ -130,7 +134,7 @@ ide_start_read(int diskno, uint secno, void *dst, uint nsecs) } int -ide_finish_read(void *c) +ide_finish(void *c) { int r = 0; struct ide_request *req = (struct ide_request *) c; @@ -140,10 +144,11 @@ ide_finish_read(void *c) if(!holding(&ide_lock)) panic("ide_start_read: not holding ide_lock"); - for (; req->nsecs > 0; req->nsecs--, req->dst += 512) { + for (; req->nsecs > 0; req->nsecs--, req->addr += 512) { if ((r = ide_wait_ready(1)) < 0) break; - insl(0x1F0, req->dst, 512/4); + if (req->read) insl(0x1F0, req->addr, 512/4); + else outsl(0x1F0, req->addr, 512/4); } if ((head + 1) % NREQUEST == tail) { |