USB: Check init/post_init errors
Host with inoperable ULPI able to bring the system into an infinite loop. The patch adds error checking during initialization to avoid this. Signed-off-by: Alexander Shiyan <shc_work@mail.ru> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
cf9b0c6927
commit
139a88a337
|
@ -748,6 +748,7 @@ static int ehci_init(struct usb_host *host)
|
||||||
struct ehci_priv *ehci = to_ehci(host);
|
struct ehci_priv *ehci = to_ehci(host);
|
||||||
uint32_t reg;
|
uint32_t reg;
|
||||||
uint32_t cmd;
|
uint32_t cmd;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
ehci_halt(ehci);
|
ehci_halt(ehci);
|
||||||
|
|
||||||
|
@ -755,8 +756,11 @@ static int ehci_init(struct usb_host *host)
|
||||||
if (ehci_reset(ehci) != 0)
|
if (ehci_reset(ehci) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (ehci->init)
|
if (ehci->init) {
|
||||||
ehci->init(ehci->drvdata);
|
ret = ehci->init(ehci->drvdata);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ehci->qh_list->qh_link = cpu_to_hc32((uint32_t)ehci->qh_list | QH_LINK_TYPE_QH);
|
ehci->qh_list->qh_link = cpu_to_hc32((uint32_t)ehci->qh_list | QH_LINK_TYPE_QH);
|
||||||
ehci->qh_list->qh_endpt1 = cpu_to_hc32((1 << 15) | (USB_SPEED_HIGH << 12));
|
ehci->qh_list->qh_endpt1 = cpu_to_hc32((1 << 15) | (USB_SPEED_HIGH << 12));
|
||||||
|
@ -799,9 +803,9 @@ static int ehci_init(struct usb_host *host)
|
||||||
ehci->rootdev = 0;
|
ehci->rootdev = 0;
|
||||||
|
|
||||||
if (ehci->post_init)
|
if (ehci->post_init)
|
||||||
ehci->post_init(ehci->drvdata);
|
ret = ehci->post_init(ehci->drvdata);
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
Loading…
Reference in New Issue