Commit d51dd3de87026cb0ea1ea5f873f08e930053bfc5

Authored by Geert Uytterhoeven
Committed by Paul Mackerras
1 parent ef8034d01a

[POWERPC] cell/PS3: Ignore storage devices that are still being probed

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>

Showing 2 changed files with 30 additions and 0 deletions Side-by-side Diff

arch/powerpc/platforms/ps3/platform.h
... ... @@ -83,6 +83,7 @@
83 83 PS3_DEV_TYPE_STOR_ROM = TYPE_ROM, /* 5 */
84 84 PS3_DEV_TYPE_SB_GPIO = 6,
85 85 PS3_DEV_TYPE_STOR_FLASH = TYPE_RBC, /* 14 */
  86 + PS3_DEV_TYPE_STOR_DUMMY = 32,
86 87 PS3_DEV_TYPE_NOACCESS = 255,
87 88 };
88 89  
arch/powerpc/platforms/ps3/repository.c
... ... @@ -349,6 +349,35 @@
349 349 return result;
350 350 }
351 351  
  352 + if (tmp.bus_type == PS3_BUS_TYPE_STORAGE) {
  353 + /*
  354 + * A storage device may show up in the repository before the
  355 + * hypervisor has finished probing its type and regions
  356 + */
  357 + unsigned int num_regions;
  358 +
  359 + if (tmp.dev_type == PS3_DEV_TYPE_STOR_DUMMY) {
  360 + pr_debug("%s:%u storage device not ready\n", __func__,
  361 + __LINE__);
  362 + return -ENODEV;
  363 + }
  364 +
  365 + result = ps3_repository_read_stor_dev_num_regions(tmp.bus_index,
  366 + tmp.dev_index,
  367 + &num_regions);
  368 + if (result) {
  369 + pr_debug("%s:%d read_stor_dev_num_regions failed\n",
  370 + __func__, __LINE__);
  371 + return result;
  372 + }
  373 +
  374 + if (!num_regions) {
  375 + pr_debug("%s:%u storage device has no regions yet\n",
  376 + __func__, __LINE__);
  377 + return -ENODEV;
  378 + }
  379 + }
  380 +
352 381 result = ps3_repository_read_dev_id(tmp.bus_index, tmp.dev_index,
353 382 &tmp.dev_id);
354 383