16.12.2020 12:07, Dmitry Osipenko пишет:
>>>  static int ehci_ci_portpower(struct usb_hcd *hcd, int portnum, bool enable)
>>>  {
>>>     struct ehci_hcd *ehci = hcd_to_ehci(hcd);
>>> @@ -160,14 +166,14 @@ static int host_start(struct ci_hdrc *ci)
>>>             pinctrl_select_state(ci->platdata->pctl,
>>>                                  ci->platdata->pins_host);
>>>  
>>> +   ci->hcd = hcd;
>>> +
>>>     ret = usb_add_hcd(hcd, 0, 0);
>>>     if (ret) {
>>>             goto disable_reg;
>>>     } else {
>>>             struct usb_otg *otg = &ci->otg;
>>>  
>>> -           ci->hcd = hcd;
>>> -
>> Why this changed?
> The ci->hcd is used by tegra_usb_notify_event() to handle reset event
> and the reset happens once usb_add_hcd() is invoked.  Hence we need to
> pre-assign the hcd pointer, otherwise there will be a NULL dereference.

Actually, not a NULL dereference, but the reset will be skipped since we
check whether ci->hcd is NULL in the tegra's reset handler.

Reply via email to