diff options
-rw-r--r-- | arch/powerpc/platforms/powernv/opal-nvram.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/arch/powerpc/platforms/powernv/opal-nvram.c b/arch/powerpc/platforms/powernv/opal-nvram.c index 1bceb95f422d..5584247f5029 100644 --- a/arch/powerpc/platforms/powernv/opal-nvram.c +++ b/arch/powerpc/platforms/powernv/opal-nvram.c | |||
@@ -44,6 +44,10 @@ static ssize_t opal_nvram_read(char *buf, size_t count, loff_t *index) | |||
44 | return count; | 44 | return count; |
45 | } | 45 | } |
46 | 46 | ||
47 | /* | ||
48 | * This can be called in the panic path with interrupts off, so use | ||
49 | * mdelay in that case. | ||
50 | */ | ||
47 | static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index) | 51 | static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index) |
48 | { | 52 | { |
49 | s64 rc = OPAL_BUSY; | 53 | s64 rc = OPAL_BUSY; |
@@ -58,10 +62,16 @@ static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index) | |||
58 | while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { | 62 | while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { |
59 | rc = opal_write_nvram(__pa(buf), count, off); | 63 | rc = opal_write_nvram(__pa(buf), count, off); |
60 | if (rc == OPAL_BUSY_EVENT) { | 64 | if (rc == OPAL_BUSY_EVENT) { |
61 | msleep(OPAL_BUSY_DELAY_MS); | 65 | if (in_interrupt() || irqs_disabled()) |
66 | mdelay(OPAL_BUSY_DELAY_MS); | ||
67 | else | ||
68 | msleep(OPAL_BUSY_DELAY_MS); | ||
62 | opal_poll_events(NULL); | 69 | opal_poll_events(NULL); |
63 | } else if (rc == OPAL_BUSY) { | 70 | } else if (rc == OPAL_BUSY) { |
64 | msleep(OPAL_BUSY_DELAY_MS); | 71 | if (in_interrupt() || irqs_disabled()) |
72 | mdelay(OPAL_BUSY_DELAY_MS); | ||
73 | else | ||
74 | msleep(OPAL_BUSY_DELAY_MS); | ||
65 | } | 75 | } |
66 | } | 76 | } |
67 | 77 | ||