summaryrefslogtreecommitdiff
path: root/ide.c
diff options
context:
space:
mode:
authorkaashoek <kaashoek>2006-07-05 20:00:14 +0000
committerkaashoek <kaashoek>2006-07-05 20:00:14 +0000
commitb22d898297a2496ba4cfd31d445769fbebc0a46d (patch)
tree99a08718f78c6836be1a245650e48c9f20333fb9 /ide.c
parent8b4e2a08febc8b957b44732dbc7da831479a0005 (diff)
downloadxv6-labs-b22d898297a2496ba4cfd31d445769fbebc0a46d.tar.gz
xv6-labs-b22d898297a2496ba4cfd31d445769fbebc0a46d.tar.bz2
xv6-labs-b22d898297a2496ba4cfd31d445769fbebc0a46d.zip
timer interrupts
disk interrupts (assuming bochs has a bug)
Diffstat (limited to 'ide.c')
-rw-r--r--ide.c127
1 files changed, 67 insertions, 60 deletions
diff --git a/ide.c b/ide.c
index 3152f93..0e63a86 100644
--- a/ide.c
+++ b/ide.c
@@ -21,97 +21,104 @@ static int diskno = 0;
static int
ide_wait_ready(int check_error)
{
- int r;
+ int r;
- while (((r = inb(0x1F7)) & (IDE_BSY|IDE_DRDY)) != IDE_DRDY)
- /* do nothing */;
+ while (((r = inb(0x1F7)) & (IDE_BSY|IDE_DRDY)) != IDE_DRDY)
+ /* do nothing */;
- if (check_error && (r & (IDE_DF|IDE_ERR)) != 0)
- return -1;
- return 0;
+ if (check_error && (r & (IDE_DF|IDE_ERR)) != 0)
+ return -1;
+ return 0;
}
+void
+ide_init(void)
+{
+ cprintf("ide_init: enable IRQ 14\n");
+ irq_setmask_8259A(irq_mask_8259A & ~(1<<14));
+ ide_wait_ready(0);
+}
+
+
int
ide_probe_disk1(void)
{
- int r, x;
+ int r, x;
- // wait for Device 0 to be ready
- ide_wait_ready(0);
+ // wait for Device 0 to be ready
+ ide_wait_ready(0);
- // switch to Device 1
- outb(0x1F6, 0xE0 | (1<<4));
+ // switch to Device 1
+ outb(0x1F6, 0xE0 | (1<<4));
- // check for Device 1 to be ready for a while
- for (x = 0; x < 1000 && (r = inb(0x1F7)) == 0; x++)
- /* do nothing */;
+ // check for Device 1 to be ready for a while
+ for (x = 0; x < 1000 && (r = inb(0x1F7)) == 0; x++)
+ /* do nothing */;
- // switch back to Device 0
- outb(0x1F6, 0xE0 | (0<<4));
+ // switch back to Device 0
+ outb(0x1F6, 0xE0 | (0<<4));
- cprintf("Device 1 presence: %d\n", (x < 1000));
- return (x < 1000);
+ cprintf("Device 1 presence: %d\n", (x < 1000));
+ return (x < 1000);
}
void
ide_set_disk(int d)
{
- if (d != 0 && d != 1)
- panic("bad disk number");
- diskno = d;
+ if (d != 0 && d != 1)
+ panic("bad disk number");
+ diskno = d;
}
int
ide_read(uint32_t secno, void *dst, unsigned nsecs)
{
- int r;
-
- if(nsecs > 256)
- panic("ide_read");
-
- ide_wait_ready(0);
-
- outb(0x3f6, 0);
- outb(0x1F2, nsecs);
- outb(0x1F3, secno & 0xFF);
- outb(0x1F4, (secno >> 8) & 0xFF);
- outb(0x1F5, (secno >> 16) & 0xFF);
- outb(0x1F6, 0xE0 | ((diskno&1)<<4) | ((secno>>24)&0x0F));
- outb(0x1F7, 0x20); // CMD 0x20 means read sector
-
- sleep(0);
-
- for (; nsecs > 0; nsecs--, dst += 512) {
- if ((r = ide_wait_ready(1)) < 0)
- return r;
- insl(0x1F0, dst, 512/4);
- }
+ int r;
+
+ if(nsecs > 256)
+ panic("ide_read");
+
+ ide_wait_ready(0);
+
+ outb(0x3f6, 0);
+ outb(0x1F2, nsecs);
+ outb(0x1F3, secno & 0xFF);
+ outb(0x1F4, (secno >> 8) & 0xFF);
+ outb(0x1F5, (secno >> 16) & 0xFF);
+ outb(0x1F6, 0xE0 | ((diskno&1)<<4) | ((secno>>24)&0x0F));
+ outb(0x1F7, 0x20); // CMD 0x20 means read sector
+
+ for (; nsecs > 0; nsecs--, dst += 512) {
+ if ((r = ide_wait_ready(1)) < 0)
+ return r;
+ insl(0x1F0, dst, 512/4);
+ }
- return 0;
+ return 0;
}
int
ide_write(uint32_t secno, const void *src, unsigned nsecs)
{
- int r;
+ int r;
- if(nsecs > 256)
- panic("ide_write");
+ if(nsecs > 256)
+ panic("ide_write");
- ide_wait_ready(0);
+ ide_wait_ready(0);
- outb(0x1F2, nsecs);
- outb(0x1F3, secno & 0xFF);
- outb(0x1F4, (secno >> 8) & 0xFF);
- outb(0x1F5, (secno >> 16) & 0xFF);
- outb(0x1F6, 0xE0 | ((diskno&1)<<4) | ((secno>>24)&0x0F));
- outb(0x1F7, 0x30); // CMD 0x30 means write sector
+ outb(0x1F2, nsecs);
+ outb(0x1F3, secno & 0xFF);
+ outb(0x1F4, (secno >> 8) & 0xFF);
+ outb(0x1F5, (secno >> 16) & 0xFF);
+ outb(0x1F6, 0xE0 | ((diskno&1)<<4) | ((secno>>24)&0x0F));
+ outb(0x1F7, 0x30); // CMD 0x30 means write sector
- for (; nsecs > 0; nsecs--, src += 512) {
- if ((r = ide_wait_ready(1)) < 0)
- return r;
- outsl(0x1F0, src, 512/4);
- }
+ for (; nsecs > 0; nsecs--, src += 512) {
+ if ((r = ide_wait_ready(1)) < 0)
+ return r;
+ outsl(0x1F0, src, 512/4);
+ }
- return 0;
+ return 0;
}