Mac OS 9 is finicky about devices having the correct properties, so we change some IDE data to more closely model a real New World Mac. We also add ide_exit() to ciface_quiesce() to properly prepare the drives for transferring control to the operating system.
Signed-off-by: Cormac O'Brien cormac@c-obrien.org --- arch/ppc/qemu/methods.c | 2 ++ drivers/ide.c | 34 ++++++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-)
diff --git a/arch/ppc/qemu/methods.c b/arch/ppc/qemu/methods.c index cb72bc1..adf3ea2 100644 --- a/arch/ppc/qemu/methods.c +++ b/arch/ppc/qemu/methods.c @@ -109,11 +109,13 @@ NODE_METHODS( tty ) = {
DECLARE_NODE( ciface, 0, 0, "+/openprom/client-services" );
+extern void ide_exit(void); /* ( -- ) */ static void ciface_quiesce( unsigned long args[], unsigned long ret[] ) { usb_exit(); + ide_exit(); #if 0 unsigned long msr; /* This seems to be the correct thing to do - but I'm not sure */ diff --git a/drivers/ide.c b/drivers/ide.c index 327c64a..8ef34cb 100644 --- a/drivers/ide.c +++ b/drivers/ide.c @@ -1581,6 +1581,12 @@ int macio_ide_init(const char *path, uint32_t addr, int nb_channels) set_property(dnode, "compatible", (is_oldworld() ? "heathrow-ata" : "keylargo-ata"), 13);
+ set_property(dnode, "model", ((current_channel == 3) ? + "ata-3" : "ata-4"), strlen("ata-*") + 1); + + set_property(dnode, "AAPL,connector", "ata", + strlen("ata") + 1); + props[0] = 0x00000526; props[1] = 0x00000085; props[2] = 0x00000025; @@ -1589,8 +1595,8 @@ int macio_ide_init(const char *path, uint32_t addr, int nb_channels) props[5] = 0x00000000; props[6] = 0x00000000; props[7] = 0x00000000; - OLDWORLD(set_property(dnode, "AAPL,pio-timing", - (char *)&props, 8*sizeof(props[0]))); + set_property(dnode, "AAPL,pio-timing", + (char *)&props, 8*sizeof(props[0]));
/* The first interrupt entry is the ide interrupt, the second the dbdma interrupt */ @@ -1634,8 +1640,8 @@ int macio_ide_init(const char *path, uint32_t addr, int nb_channels) (char *)&props, 2*sizeof(props[0])));
props[0] = 0; - OLDWORLD(set_property(dnode, "AAPL,bus-id", (char*)props, - 1 * sizeof(props[0]))); + set_property(dnode, "AAPL,bus-id", (char*)props, + 1 * sizeof(props[0])); IDE_DPRINTF(DEV_NAME": [io ports 0x%lx]\n", current_channel, chan->mmio);
@@ -1683,3 +1689,23 @@ int macio_ide_init(const char *path, uint32_t addr, int nb_channels) return 0; } #endif /* CONFIG_DRIVER_MACIO */ + +void ide_exit(void); +void ide_exit(void) +{ + struct ide_channel *current; + + current = channels; + while (current) { + struct ide_drive *drive; + int i; + + for (i = 0; i < 2; i++) { + drive = ¤t->drives[i]; + ob_ide_select_drive(drive); + ob_ide_software_reset(drive); + ob_ide_device_type_check(drive); + } + current = current->next; + } +}