From 7bc06a4995aa653e404c8595f5c27dd08185e4dd Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Wed, 6 Jun 2012 19:00:04 +0200 Subject: [PATCH] * grub-core/disk/ieee1275/ofdisk.c (quiesce): New function. (grub_ofdisk_fini): Quiesce USB devices. --- ChangeLog | 5 +++++ grub-core/disk/ieee1275/ofdisk.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/ChangeLog b/ChangeLog index d7276f2cf..7a8e18557 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2012-06-06 Vladimir Serbinenko + + * grub-core/disk/ieee1275/ofdisk.c (quiesce): New function. + (grub_ofdisk_fini): Quiesce USB devices. + 2012-06-06 Vladimir Serbinenko * grub-core/loader/powerpc/ieee1275/linux.c (grub_linux_boot): Sync diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c index eb3ff4fb9..b1b2bff24 100644 --- a/grub-core/disk/ieee1275/ofdisk.c +++ b/grub-core/disk/ieee1275/ofdisk.c @@ -23,6 +23,7 @@ #include #include #include +#include static char *last_devpath; static grub_ieee1275_ihandle_t last_ihandle; @@ -475,6 +476,34 @@ grub_ofdisk_init (void) grub_disk_dev_register (&grub_ofdisk_dev); } +static int quiesce (struct grub_ieee1275_devalias *alias) +{ + static grub_ieee1275_ihandle_t ihandle; + struct set_color_args + { + struct grub_ieee1275_common_hdr common; + grub_ieee1275_cell_t method; + grub_ieee1275_cell_t ihandle; + grub_ieee1275_cell_t catch_result; + } + args; + + if (grub_strcmp (alias->type, "usb") != 0) + return 0; + + + if (grub_ieee1275_open (alias->path, &ihandle)) + return 0; + + INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 1); + args.method = (grub_ieee1275_cell_t) "usb-quiesce"; + args.ihandle = ihandle; + + IEEE1275_CALL_ENTRY_FN (&args); + grub_ieee1275_close (ihandle); + return 0; +} + void grub_ofdisk_fini (void) { @@ -483,5 +512,8 @@ grub_ofdisk_fini (void) last_ihandle = 0; last_devpath = NULL; + grub_ieee1275_devices_iterate (quiesce); + grub_millisleep (10); + grub_disk_dev_unregister (&grub_ofdisk_dev); }