summaryrefslogtreecommitdiff
path: root/ide.c
diff options
context:
space:
mode:
authorkaashoek <kaashoek>2006-08-07 01:38:46 +0000
committerkaashoek <kaashoek>2006-08-07 01:38:46 +0000
commit104207726be721843e44b8616faa87222aa5f0c2 (patch)
treec3110f6482c692df461023a3d40ed420cc288475 /ide.c
parent8ec6530feea5153e00dced60d33fbfdd9d5c3184 (diff)
downloadxv6-labs-104207726be721843e44b8616faa87222aa5f0c2.tar.gz
xv6-labs-104207726be721843e44b8616faa87222aa5f0c2.tar.bz2
xv6-labs-104207726be721843e44b8616faa87222aa5f0c2.zip
bwrite
Diffstat (limited to 'ide.c')
-rw-r--r--ide.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/ide.c b/ide.c
index bfc3d7c..d6bef6d 100644
--- a/ide.c
+++ b/ide.c
@@ -101,7 +101,10 @@ ide_start_request (void)
outb(0x1F5, (r->secno >> 16) & 0xFF);
outb(0x1F6, 0xE0 | ((r->diskno&1)<<4) | ((r->secno>>24)&0x0F));
if (r->read) outb(0x1F7, 0x20); // read
- else outb(0x1F7, 0x30); // write
+ else {
+ outb(0x1F7, 0x30); // write
+ outsl(0x1F0, r->addr, 512/4);
+ }
}
}
@@ -113,7 +116,7 @@ ide_start_rw(int diskno, uint secno, void *addr, uint nsecs, int read)
if(!holding(&ide_lock))
panic("ide_start_read: not holding ide_lock");
- if(nsecs > 256)
+ if(nsecs > 1)
panic("ide_start_read: nsecs too large");
while ((head + 1) % NREQUEST == tail)
@@ -136,7 +139,7 @@ ide_start_rw(int diskno, uint secno, void *addr, uint nsecs, int read)
int
ide_finish(void *c)
{
- int r = 0;
+ int r;
struct ide_request *req = (struct ide_request *) c;
if(c != &request[tail])
@@ -144,11 +147,10 @@ ide_finish(void *c)
if(!holding(&ide_lock))
panic("ide_start_read: not holding ide_lock");
- for (; req->nsecs > 0; req->nsecs--, req->addr += 512) {
- if ((r = ide_wait_ready(1)) < 0)
- break;
- if (req->read) insl(0x1F0, req->addr, 512/4);
- else outsl(0x1F0, req->addr, 512/4);
+
+ if (req->read) {
+ if ((r = ide_wait_ready(1)) >= 0)
+ insl(0x1F0, req->addr, 512/4);
}
if ((head + 1) % NREQUEST == tail) {