| From 1ddcb71a3edf0e1682b6e056158e4c4b00325f66 Mon Sep 17 00:00:00 2001 |
| From: Longfang Liu <liulongfang@huawei.com> |
| Date: Mon, 8 Jun 2020 11:46:59 +0800 |
| Subject: USB: ehci: reopen solution for Synopsys HC bug |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Longfang Liu <liulongfang@huawei.com> |
| |
| commit 1ddcb71a3edf0e1682b6e056158e4c4b00325f66 upstream. |
| |
| A Synopsys USB2.0 core used in Huawei Kunpeng920 SoC has a bug which |
| might cause the host controller not issuing ping. |
| |
| Bug description: |
| After indicating an Interrupt on Async Advance, the software uses the |
| doorbell mechanism to delete the Next Link queue head of the last |
| executed queue head. At this time, the host controller still references |
| the removed queue head(the queue head is NULL). NULL reference causes |
| the host controller to lose the USB device. |
| |
| Solution: |
| After deleting the Next Link queue head, when has_synopsys_hc_bug set |
| to 1,the software can write one of the valid queue head addresses to |
| the ASYNCLISTADDR register to allow the host controller to get |
| the valid queue head. in order to solve that problem, this patch set |
| the flag for Huawei Kunpeng920 |
| |
| There are detailed instructions and solutions in this patch: |
| commit 2f7ac6c19997 ("USB: ehci: add workaround for Synopsys HC bug") |
| |
| Signed-off-by: Longfang Liu <liulongfang@huawei.com> |
| Cc: stable <stable@vger.kernel.org> |
| Acked-by: Alan Stern <stern@rowland.harvard.edu> |
| Link: https://lore.kernel.org/r/1591588019-44284-1-git-send-email-liulongfang@huawei.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/host/ehci-pci.c | 7 +++++++ |
| 1 file changed, 7 insertions(+) |
| |
| --- a/drivers/usb/host/ehci-pci.c |
| +++ b/drivers/usb/host/ehci-pci.c |
| @@ -229,6 +229,13 @@ static int ehci_pci_setup(struct usb_hcd |
| ehci_info(ehci, "applying MosChip frame-index workaround\n"); |
| ehci->frame_index_bug = 1; |
| break; |
| + case PCI_VENDOR_ID_HUAWEI: |
| + /* Synopsys HC bug */ |
| + if (pdev->device == 0xa239) { |
| + ehci_info(ehci, "applying Synopsys HC workaround\n"); |
| + ehci->has_synopsys_hc_bug = 1; |
| + } |
| + break; |
| } |
| |
| /* optional debug port, normally in the first BAR */ |