On 21.08.15 00:45, Cormac O'Brien wrote:
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.
Please split this into 2 separate patches.
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);
As Segher mentioned somewhere else, please introduce a helper for string properties.
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,
IDE_DPRINTF(DEV_NAME": [io ports 0x%lx]\n", current_channel, chan->mmio);1 * sizeof(props[0]));
@@ -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);
This should go into a header file.
Alex
+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;
- }
+}