summaryrefslogtreecommitdiff
path: root/ide.c
diff options
context:
space:
mode:
authorkaashoek <kaashoek>2006-08-06 20:28:15 +0000
committerkaashoek <kaashoek>2006-08-06 20:28:15 +0000
commit8ec6530feea5153e00dced60d33fbfdd9d5c3184 (patch)
tree90c0d92283f35523cb00d4cdc29334d5420eafae /ide.c
parent366189214ea663b20a0323b65661987a7de6f56d (diff)
downloadxv6-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.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/ide.c b/ide.c
index e2235a1..bfc3d7c 100644
--- a/ide.c
+++ b/ide.c
@@ -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) {