/* Alternate Status Register bits. */
#define STA_BSY 0x80 /* Busy. */
+#define STA_DRDY 0x40 /* Device Ready. */
#define STA_DRQ 0x08 /* Data Request. */
/* Control Register bits. */
default:
NOT_REACHED ();
}
- lock_init (&c->lock, c->name);
+ lock_init (&c->lock);
c->expecting_interrupt = false;
- sema_init (&c->completion_wait, 0, c->name);
+ sema_init (&c->completion_wait, 0);
/* Initialize devices. */
for (dev_no = 0; dev_no < 2; dev_no++)
}
/* Register interrupt handler. */
- intr_register (c->irq, 0, INTR_OFF, interrupt_handler, c->name);
+ intr_register_ext (c->irq, interrupt_handler, c->name);
/* Reset hardware. */
reset_channel (c);
}
/* Returns the disk numbered DEV_NO--either 0 or 1 for master or
- slave, respectively--within the channel numbered CHAN_NO. */
+ slave, respectively--within the channel numbered CHAN_NO.
+
+ Pintos uses disks this way:
+ 0:0 - operating system kernel
+ 0:1 - file system
+ 1:0 - scratch
+ 1:1 - swap
+*/
struct disk *
disk_get (int chan_no, int dev_no)
{
/* Issue soft reset sequence, which selects device 0 as a side effect.
Also enable interrupts. */
outb (reg_ctl (c), 0);
- timer_sleep (timer_us2ticks (10));
+ timer_usleep (10);
outb (reg_ctl (c), CTL_SRST);
- timer_sleep (timer_us2ticks (10));
+ timer_usleep (10);
outb (reg_ctl (c), 0);
- timer_sleep (timer_ms2ticks (150));
+ timer_msleep (150);
/* Wait for device 0 to clear BSY. */
if (present[0])
{
if (inb (reg_nsect (c)) == 1 && inb (reg_lbal (c)) == 1)
break;
- timer_sleep (timer_ms2ticks (10));
+ timer_msleep (10);
}
wait_while_busy (&c->devices[1]);
}
check_device_type (struct disk *d)
{
struct channel *c = d->channel;
- uint8_t error, lbam, lbah;
+ uint8_t error, lbam, lbah, status;
select_device (d);
error = inb (reg_error (c));
lbam = inb (reg_lbam (c));
lbah = inb (reg_lbah (c));
+ status = inb (reg_status (c));
- if (error != 1 && (error != 0x81 || d->dev_no == 1))
+ if ((error != 1 && (error != 0x81 || d->dev_no == 1))
+ || (status & STA_DRDY) == 0
+ || (status & STA_BSY) != 0)
{
d->is_ata = false;
return error != 0x81;
{
if ((inb (reg_status (d->channel)) & (STA_BSY | STA_DRQ)) == 0)
return;
- timer_sleep (timer_us2ticks (10));
+ timer_usleep (10);
}
printf ("%s: idle timeout\n", d->name);
printf ("ok\n");
return (inb (reg_alt_status (c)) & STA_DRQ) != 0;
}
- timer_sleep (timer_ms2ticks (10));
+ timer_msleep (10);
}
printf ("failed\n");
dev |= DEV_DEV;
outb (reg_device (c), dev);
inb (reg_alt_status (c));
- timer_sleep (timer_ns2ticks (400));
+ timer_nsleep (400);
}
/* Select disk D in its channel, as select_device(), but wait for