On Fri, Aug 17, 2018 at 9:10 PM Mikulas Patocka <mpato...@redhat.com> wrote:
>
> Hi
>
> The commit 9ce8654323d69273b4977f76f11c9e2d345ab130 breaks the Alpha
> Avanti platform. There is temporary 40-second hang during boot when
> detecting serial ports (although the hang eventually resolves and the
> machine boots) and there's total hang during shutdown when saving the
> hardware clock.
>
> The bug can be fixed with the patch below - apparently, there's something
> in the Alpha Avanti platform code that expects that the barrier should be
> after the I/O write instructions.

I have two theories here:

- there might be a driver oddity (can't really call it bug) that
relies on writel()
  etc to imply a barrier afterwards when that guarantee isn't there elsewhere

- For outb()/outw()/outl(), we ought to provide stronger barriers than for
  writeb()/writew()/writel(), as PCI drivers should expect the store to have
  arrived at the device by the time the function returns.

Could you try the patch below that would address the second issue but not
the first?

      Arnd

diff --git a/arch/alpha/include/asm/io.h b/arch/alpha/include/asm/io.h
index 4c533fc94d62..0a479ac27cab 100644
--- a/arch/alpha/include/asm/io.h
+++ b/arch/alpha/include/asm/io.h
@@ -364,11 +364,13 @@ extern inline u16 inw(unsigned long port)
 extern inline void outb(u8 b, unsigned long port)
 {
        iowrite8(b, ioport_map(port, 1));
+       mb();
 }

 extern inline void outw(u16 b, unsigned long port)
 {
        iowrite16(b, ioport_map(port, 2));
+       mb();
 }
 #endif

@@ -394,6 +396,7 @@ extern inline u32 inl(unsigned long port)
 extern inline void outl(u32 b, unsigned long port)
 {
        iowrite32(b, ioport_map(port, 4));
+       mb();
 }
 #endif

Reply via email to