On Tue, 19 Feb 2019, Mikulas Patocka wrote:

> The patches cd0e00c106722eca40b38ebf11cf134c01901086 and
> 92d7223a74235054f2aa7227d207d9c57f84dca0 fix a theoretical issue where the
> code didn't follow the specification. Unfortunatelly, they also reduce
> timing when port write is followed by a port read.
> 
> These reduced timing cause hang on boot on the Avanti platform when
> probing serial ports. This patch adds memory barrier after the outb, outw,
> outl functions, so that there is delay between port write and subsequent
> port read - just like before.
> 
> Fixes: cd0e00c10672 ("alpha: io: reorder barriers to guarantee writeX() and 
> iowriteX() ordering")
> Cc: sta...@vger.kernel.org    # v4.17+

you can also add:

Tested-by: Mikulas Patocka <mpato...@redhat.com>

> ---
>  arch/alpha/kernel/io.c |    6 ++++++
>  1 file changed, 6 insertions(+)
> 
> Index: linux-stable/arch/alpha/kernel/io.c
> ===================================================================
> --- linux-stable.orig/arch/alpha/kernel/io.c  2019-02-19 14:06:03.000000000 
> +0100
> +++ linux-stable/arch/alpha/kernel/io.c       2019-02-19 14:12:29.000000000 
> +0100
> @@ -78,16 +78,19 @@ u32 inl(unsigned long port)
>  void outb(u8 b, unsigned long port)
>  {
>       iowrite8(b, ioport_map(port, 1));
> +     mb();
>  }
>  
>  void outw(u16 b, unsigned long port)
>  {
>       iowrite16(b, ioport_map(port, 2));
> +     mb();
>  }
>  
>  void outl(u32 b, unsigned long port)
>  {
>       iowrite32(b, ioport_map(port, 4));
> +     mb();
>  }
>  
>  EXPORT_SYMBOL(inb);
> @@ -336,6 +339,7 @@ void iowrite8_rep(void __iomem *port, co
>  void outsb(unsigned long port, const void *src, unsigned long count)
>  {
>       iowrite8_rep(ioport_map(port, 1), src, count);
> +     mb();
>  }
>  
>  EXPORT_SYMBOL(iowrite8_rep);
> @@ -376,6 +380,7 @@ void iowrite16_rep(void __iomem *port, c
>  void outsw(unsigned long port, const void *src, unsigned long count)
>  {
>       iowrite16_rep(ioport_map(port, 2), src, count);
> +     mb();
>  }
>  
>  EXPORT_SYMBOL(iowrite16_rep);
> @@ -408,6 +413,7 @@ void iowrite32_rep(void __iomem *port, c
>  void outsl(unsigned long port, const void *src, unsigned long count)
>  {
>       iowrite32_rep(ioport_map(port, 4), src, count);
> +     mb();
>  }
>  
>  EXPORT_SYMBOL(iowrite32_rep);
> 

Reply via email to