| From 1cbf17bc44c9e3787b57cecac5776430e7d8e543 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 17 Dec 2021 16:24:30 +0100 |
| Subject: Revert "usb: early: convert to readl_poll_timeout_atomic()" |
| |
| From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| [ Upstream commit c4d936efa46d8ea183df16c0f3fa4423327da51d ] |
| |
| This reverts commit 796eed4b2342c9d6b26c958e92af91253a2390e1. |
| |
| This change causes boot lockups when using "arlyprintk=xdbc" because |
| ktime can not be used at this point in time in the boot process. Also, |
| it is not needed for very small delays like this. |
| |
| Reported-by: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Reported-by: Peter Zijlstra <peterz@infradead.org> |
| Cc: Jann Horn <jannh@google.com> |
| Cc: Chunfeng Yun <chunfeng.yun@mediatek.com> |
| Fixes: 796eed4b2342 ("usb: early: convert to readl_poll_timeout_atomic()") |
| Link: https://lore.kernel.org/r/c2b5c9bb-1b75-bf56-3754-b5b18812d65e@linux.intel.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/usb/early/xhci-dbc.c | 15 +++++++++++---- |
| 1 file changed, 11 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/usb/early/xhci-dbc.c b/drivers/usb/early/xhci-dbc.c |
| index be4ecbabdd586..6c0434100e38c 100644 |
| --- a/drivers/usb/early/xhci-dbc.c |
| +++ b/drivers/usb/early/xhci-dbc.c |
| @@ -14,7 +14,6 @@ |
| #include <linux/pci_ids.h> |
| #include <linux/memblock.h> |
| #include <linux/io.h> |
| -#include <linux/iopoll.h> |
| #include <asm/pci-direct.h> |
| #include <asm/fixmap.h> |
| #include <linux/bcd.h> |
| @@ -136,9 +135,17 @@ static int handshake(void __iomem *ptr, u32 mask, u32 done, int wait, int delay) |
| { |
| u32 result; |
| |
| - return readl_poll_timeout_atomic(ptr, result, |
| - ((result & mask) == done), |
| - delay, wait); |
| + /* Can not use readl_poll_timeout_atomic() for early boot things */ |
| + do { |
| + result = readl(ptr); |
| + result &= mask; |
| + if (result == done) |
| + return 0; |
| + udelay(delay); |
| + wait -= delay; |
| + } while (wait > 0); |
| + |
| + return -ETIMEDOUT; |
| } |
| |
| static void __init xdbc_bios_handoff(void) |
| -- |
| 2.34.1 |
| |