diff options
author | Peter Mamonov <pmamonov@gmail.com> | 2015-08-25 13:33:56 +0300 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2015-08-26 14:14:54 +0200 |
commit | 9a146aea92fc40ae6b6b829e444a2da2a93985f2 (patch) | |
tree | e61fd1738d051d02d646c6496a07c59a5e7e3487 /drivers/usb/host/ehci-hcd.c | |
parent | f38ba32965c5686c062884fab2e9f505015af82a (diff) | |
download | barebox-9a146aea92fc40ae6b6b829e444a2da2a93985f2.tar.gz barebox-9a146aea92fc40ae6b6b829e444a2da2a93985f2.tar.xz |
usb: ehci-hcd: initialize ehci->qh_list[] with zeros
Without this initialization ehci->qh_list[0].qh_endpt2 is left uninitialized,
which causes problems with some EHCI host controllers.
Das u-boot uses the same strategy:
static int ehci_common_init(struct ehci_ctrl *ctrl, uint tweaks)
{
...
qh_list = &ctrl->qh_list;
/* Set head of reclaim list */
memset(qh_list, 0, sizeof(*qh_list));
qh_list->qh_link = cpu_to_hc32((unsigned long)qh_list | QH_LINK_TYPE_QH);
qh_list->qh_endpt1 = cpu_to_hc32(QH_ENDPT1_H(1) |
QH_ENDPT1_EPS(USB_SPEED_HIGH));
qh_list->qh_overlay.qt_next = cpu_to_hc32(QT_NEXT_TERMINATE);
qh_list->qh_overlay.qt_altnext = cpu_to_hc32(QT_NEXT_TERMINATE);
qh_list->qh_overlay.qt_token =
cpu_to_hc32(QT_TOKEN_STATUS(QT_TOKEN_STATUS_HALTED));
...
}
Signed-off-by: Peter Mamonov <pmamonov@gmail.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/usb/host/ehci-hcd.c')
-rw-r--r-- | drivers/usb/host/ehci-hcd.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index abaeaf2aa7..0e7c595865 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -771,6 +771,8 @@ static int ehci_init(struct usb_host *host) return ret; } + memset(ehci->qh_list, 0, sizeof(struct QH) * NUM_TD); + 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_curtd = cpu_to_hc32(QT_NEXT_TERMINATE); |