diff options
author | kaashoek <kaashoek> | 2006-08-07 01:38:46 +0000 |
---|---|---|
committer | kaashoek <kaashoek> | 2006-08-07 01:38:46 +0000 |
commit | 104207726be721843e44b8616faa87222aa5f0c2 (patch) | |
tree | c3110f6482c692df461023a3d40ed420cc288475 /ide.c | |
parent | 8ec6530feea5153e00dced60d33fbfdd9d5c3184 (diff) | |
download | xv6-labs-104207726be721843e44b8616faa87222aa5f0c2.tar.gz xv6-labs-104207726be721843e44b8616faa87222aa5f0c2.tar.bz2 xv6-labs-104207726be721843e44b8616faa87222aa5f0c2.zip |
bwrite
Diffstat (limited to 'ide.c')
-rw-r--r-- | ide.c | 18 |
1 files changed, 10 insertions, 8 deletions
@@ -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) { |