[POWERPC] cell/PS3: Ignore storage devices that are still being probed
authorGeert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
Thu, 6 Sep 2007 16:14:57 +0000 (18:14 +0200)
committerPaul Mackerras <paulus@samba.org>
Mon, 10 Sep 2007 18:30:37 +0000 (04:30 +1000)
On PS3, A storage device may show up in the repository before the hypervisor
has finished probing:
  - If its type is not yet known, it shows up as PS3_DEV_TYPE_STOR_DUMMY,
  - If its regions are being probed, it shows up as having zero regions.
If any of these happen, consider the device not yet present.  The storage
probe thread will retry later.

This fixes the timing-dependent problem where a kernel booted from FLASH ROM
sometimes cannot find the hard disk.

Signed-off-by: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
Acked-by: Geoff Levand <geoffrey.levand@am.sony.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/platforms/ps3/platform.h
arch/powerpc/platforms/ps3/repository.c

index 87d52060fec0a44276aa3cbc5fc4517bfc2cccb6..2eb8f92704b4f1a4e2bfbdc751d655dc74174fe9 100644 (file)
@@ -83,6 +83,7 @@ enum ps3_dev_type {
        PS3_DEV_TYPE_STOR_ROM = TYPE_ROM,       /* 5 */
        PS3_DEV_TYPE_SB_GPIO = 6,
        PS3_DEV_TYPE_STOR_FLASH = TYPE_RBC,     /* 14 */
+       PS3_DEV_TYPE_STOR_DUMMY = 32,
        PS3_DEV_TYPE_NOACCESS = 255,
 };
 
index 8cc37cfea0f22306e487709a0f2f49328f57c952..1c94824f7b6311c632440ceaffbd78d453a8aa90 100644 (file)
@@ -349,6 +349,35 @@ int ps3_repository_find_device(struct ps3_repository_device *repo)
                return result;
        }
 
+       if (tmp.bus_type == PS3_BUS_TYPE_STORAGE) {
+               /*
+                * A storage device may show up in the repository before the
+                * hypervisor has finished probing its type and regions
+                */
+               unsigned int num_regions;
+
+               if (tmp.dev_type == PS3_DEV_TYPE_STOR_DUMMY) {
+                       pr_debug("%s:%u storage device not ready\n", __func__,
+                                __LINE__);
+                       return -ENODEV;
+               }
+
+               result = ps3_repository_read_stor_dev_num_regions(tmp.bus_index,
+                                                                 tmp.dev_index,
+                                                                 &num_regions);
+               if (result) {
+                       pr_debug("%s:%d read_stor_dev_num_regions failed\n",
+                                __func__, __LINE__);
+                       return result;
+               }
+
+               if (!num_regions) {
+                       pr_debug("%s:%u storage device has no regions yet\n",
+                                __func__, __LINE__);
+                       return -ENODEV;
+               }
+       }
+
        result = ps3_repository_read_dev_id(tmp.bus_index, tmp.dev_index,
                &tmp.dev_id);