| From 75e1a2ae1f61ce1ae640410ba757bba84bd9fefe Mon Sep 17 00:00:00 2001 |
| From: Jan Beulich <JBeulich@suse.com> |
| Date: Wed, 19 Dec 2012 16:15:56 +0000 |
| Subject: USB: ehci: make debug port in-use detection functional again |
| |
| From: Jan Beulich <JBeulich@suse.com> |
| |
| commit 75e1a2ae1f61ce1ae640410ba757bba84bd9fefe upstream. |
| |
| Debug port in-use determination must be done before the controller gets |
| reset the first time, i.e. before the call to ehci_setup() as of commit |
| 1a49e2ac9651df7349867a5cf44e2c83de1046af. That commit effectively |
| rendered commit 9fa5780beea1274d498a224822397100022da7d4 useless. |
| |
| While moving that code around, also fix the BAR determination - the |
| respective capability field is a 3- rather than a 2-bit one -, and use |
| PCI_CAP_ID_DBG instead of the literal 0x0a. |
| |
| It's unclear to me whether the debug port functionality is important |
| enough to warrant fixing this in stable kernels too. |
| |
| Signed-off-by: Jan Beulich <jbeulich@suse.com> |
| Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| Acked-by: Alan Stern <stern@rowland.harvard.edu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/host/ehci-pci.c | 39 ++++++++++++++++++++------------------- |
| 1 file changed, 20 insertions(+), 19 deletions(-) |
| |
| --- a/drivers/usb/host/ehci-pci.c |
| +++ b/drivers/usb/host/ehci-pci.c |
| @@ -192,6 +192,26 @@ static int ehci_pci_setup(struct usb_hcd |
| break; |
| } |
| |
| + /* optional debug port, normally in the first BAR */ |
| + temp = pci_find_capability(pdev, PCI_CAP_ID_DBG); |
| + if (temp) { |
| + pci_read_config_dword(pdev, temp, &temp); |
| + temp >>= 16; |
| + if (((temp >> 13) & 7) == 1) { |
| + u32 hcs_params = ehci_readl(ehci, |
| + &ehci->caps->hcs_params); |
| + |
| + temp &= 0x1fff; |
| + ehci->debug = hcd->regs + temp; |
| + temp = ehci_readl(ehci, &ehci->debug->control); |
| + ehci_info(ehci, "debug port %d%s\n", |
| + HCS_DEBUG_PORT(hcs_params), |
| + (temp & DBGP_ENABLED) ? " IN USE" : ""); |
| + if (!(temp & DBGP_ENABLED)) |
| + ehci->debug = NULL; |
| + } |
| + } |
| + |
| retval = ehci_setup(hcd); |
| if (retval) |
| return retval; |
| @@ -226,25 +246,6 @@ static int ehci_pci_setup(struct usb_hcd |
| break; |
| } |
| |
| - /* optional debug port, normally in the first BAR */ |
| - temp = pci_find_capability(pdev, 0x0a); |
| - if (temp) { |
| - pci_read_config_dword(pdev, temp, &temp); |
| - temp >>= 16; |
| - if ((temp & (3 << 13)) == (1 << 13)) { |
| - temp &= 0x1fff; |
| - ehci->debug = hcd->regs + temp; |
| - temp = ehci_readl(ehci, &ehci->debug->control); |
| - ehci_info(ehci, "debug port %d%s\n", |
| - HCS_DEBUG_PORT(ehci->hcs_params), |
| - (temp & DBGP_ENABLED) |
| - ? " IN USE" |
| - : ""); |
| - if (!(temp & DBGP_ENABLED)) |
| - ehci->debug = NULL; |
| - } |
| - } |
| - |
| /* at least the Genesys GL880S needs fixup here */ |
| temp = HCS_N_CC(ehci->hcs_params) * HCS_N_PCC(ehci->hcs_params); |
| temp &= 0x0f; |