USB: ehci: make debug port in-use detection functional again
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 commit1a49e2ac96
. That commit effectively rendered commit9fa5780bee
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> Cc: stable <stable@vger.kernel.org> Acked-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
2cb5000057
commit
75e1a2ae1f
1 changed files with 20 additions and 19 deletions
|
@ -200,6 +200,26 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
|
||||||
break;
|
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);
|
retval = ehci_setup(hcd);
|
||||||
if (retval)
|
if (retval)
|
||||||
return retval;
|
return retval;
|
||||||
|
@ -228,25 +248,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
|
||||||
break;
|
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 */
|
/* at least the Genesys GL880S needs fixup here */
|
||||||
temp = HCS_N_CC(ehci->hcs_params) * HCS_N_PCC(ehci->hcs_params);
|
temp = HCS_N_CC(ehci->hcs_params) * HCS_N_PCC(ehci->hcs_params);
|
||||||
temp &= 0x0f;
|
temp &= 0x0f;
|
||||||
|
|
Loading…
Add table
Reference in a new issue