[U-Boot] [PATCH v3 2/6] usb: xhci: return ERR_PTR(-ETIMEDOUT) at the end of xhci_wait_for_event()
Marek Vasut
marex at denx.de
Sun Jan 28 12:43:10 UTC 2018
On 01/28/2018 11:18 AM, Masahiro Yamada wrote:
> Bin, Marek,
Hi,
> Would you take a look at xHCI code?
I was kinda hoping Bin would, oh well ...
> Lots of xHCI code invokes BUG_ON()/BUG()
> when the hardware access fails,
> then halts the system completely.
> This is not a software bug.
>
>
> 2018-01-10 10:45 GMT+09:00 Masahiro Yamada <yamada.masahiro at socionext.com>:
>> xhci_wait_for_event() is supposed to return a pointer to union xhci_trb,
>> but it does not return anything at the end of the function.
>>
>> This relies on that the end of the function is unreachable due to BUG().
>>
>> We are planning to make BUG() no-op for platforms with strong image size
>> constraint.
But BUG() should hang the system because it means an unrecoverable issue
happened. Changing it to nop would cause a lot of weird misbehavior, so
that is IMO a bad idea. Just change it to hang(), that should be present
even on size-constrained systems.
>> Doing so would cause compiler warning:
>>
>> drivers/usb/host/xhci-ring.c:475:1: warning: control reaches end of non-void function [-Wreturn-type]
>> }
>> ^
>>
>> So, this function must return something. From the error message just
>> above, ERR_PTR(-ETIMEDOUT) seems a good choice.
This is an imported code from Linux, so you might want to check what
they do/did there.
>> The use of BUG() looks suspicious here in the first place; no response
>> from hardware is not a bug. It should be treated as a normal error.
>> So, this function must return an error pointer instead of BUG(), then
>> the caller must handle it properly.
>>
>> I am not fixing the code because this is not the only place that stops
>> the system. Just one failure of xHCI halts the system, here and there.
>>
>> I left a comment block, hoping somebody will take a look.
>>
>> Signed-off-by: Masahiro Yamada <yamada.masahiro at socionext.com>
>> ---
>>
>> Changes in v3:
>> - newly added
>>
>> Changes in v2: None
>>
>> drivers/usb/host/xhci-ring.c | 7 +++++++
>> 1 file changed, 7 insertions(+)
>>
>> diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
>> index 579e670..d780367 100644
>> --- a/drivers/usb/host/xhci-ring.c
>> +++ b/drivers/usb/host/xhci-ring.c
>> @@ -471,7 +471,14 @@ union xhci_trb *xhci_wait_for_event(struct xhci_ctrl *ctrl, trb_type expected)
>> return NULL;
>>
>> printf("XHCI timeout on event type %d... cannot recover.\n", expected);
>> +
>> + /*
>> + * CHECK:
>> + * Is this software bug? Is this a good reason to halt the system?
>> + */
>> BUG();
>> +
>> + return ERR_PTR(-ETIMEDOUT);
>> }
>>
>> /*
>> --
>> 2.7.4
>>
>> _______________________________________________
>> U-Boot mailing list
>> U-Boot at lists.denx.de
>> https://lists.denx.de/listinfo/u-boot
>
>
>
--
Best regards,
Marek Vasut
More information about the U-Boot
mailing list