xhci: Misc bug fixes for 3.10.
Hi Greg, Here's four xHCI bug fixes that should be queued for 3.10. The first two are generic bug fixes, and have been in my queue for a while because I've been doing the OPW internship coordination. I suspect you'll be seeing more pull requests from me now that the intern selection process is almost over. :) The last two patches fix a nasty kernel crash on resume from S3 for TI hosts that have the compliance mode quirk. Tony has confirmed that the patches fix the issue on the effected systems. All four patches are marked for stable. Sarah Sharp -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAABAgAGBQJRn/HbAAoJEBMGWMLi1Gc5BqkP/1BBofuukUTADySHMocTlPFG PtC/swG+luSMyDEUgt/YduVvHhlcalk++vPTbaBkGcioSKPuViinThPbQLpGh661 zBLBrWsJ5hdOJHTVc+k5G2sVZi7hbrwA/xGAfjrKZZ/IOE18G/VMi+LuBnA8ekXl E/jlWFnWuQOnD5ylvMK3ANgt0PRE393I8MqJdqnCoh1DEi9em72Es9ZdpG1KbKAW nnIuM8IGeBJrDgw3yIIugGNuq5Dxajs4N9uXloaetxxGSevs80+0cZSAX08wBPOa XMVawMAF0nhZIEOKLYGG09jrGwfct95Rwk92+GpteunYSfN7tRHwmonHHd3Q1azp hJ0yrlytrgJm3ArBkcCfXoGE6zIBkRL3GsV8m/lQLXyGA7in8AGMMyAdIOAiIMwn 89OckF3wFr0yR4/kidnvics/vVdE5GLIN2bqpPtzW8na1RIX0sZQVeZZ9LtWtal9 I4LmIulIyFJNJAbhiEBdHamwuYZJrsDEpPyzwKq5YntJj4Jz1EJYFlbUWuCrq0QH cuCKgRPrMJjreOIT/XD5azNihkiHXtI0NGiuUlKAHAzVXlKAw4qinqdy4DLMbwil xvjRJdxXcIjPDM2aDDSi+QGHbWPop2+7UID7bkKLDtbVemjsmzJuPAJ0Hzub6AUd Pfl0lC+1pwraGm+LqjBE =CwKx -----END PGP SIGNATURE----- Merge tag 'for-usb-linus-2013-05-24' of git://git.kernel.org/pub/scm/linux/kernel/git/sarah/xhci into usb-linus Sarah writes: xhci: Misc bug fixes for 3.10. Hi Greg, Here's four xHCI bug fixes that should be queued for 3.10. The first two are generic bug fixes, and have been in my queue for a while because I've been doing the OPW internship coordination. I suspect you'll be seeing more pull requests from me now that the intern selection process is almost over. :) The last two patches fix a nasty kernel crash on resume from S3 for TI hosts that have the compliance mode quirk. Tony has confirmed that the patches fix the issue on the effected systems. All four patches are marked for stable. Sarah Sharp
This commit is contained in:
Коммит
1730ff27b1
|
@ -1827,6 +1827,9 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
|
|||
}
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
|
||||
if (!xhci->rh_bw)
|
||||
goto no_bw;
|
||||
|
||||
num_ports = HCS_MAX_PORTS(xhci->hcs_params1);
|
||||
for (i = 0; i < num_ports; i++) {
|
||||
struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table;
|
||||
|
@ -1845,6 +1848,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
|
|||
}
|
||||
}
|
||||
|
||||
no_bw:
|
||||
xhci->num_usb2_ports = 0;
|
||||
xhci->num_usb3_ports = 0;
|
||||
xhci->num_active_eps = 0;
|
||||
|
@ -2256,6 +2260,9 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
|
|||
u32 page_size, temp;
|
||||
int i;
|
||||
|
||||
INIT_LIST_HEAD(&xhci->lpm_failed_devs);
|
||||
INIT_LIST_HEAD(&xhci->cancel_cmd_list);
|
||||
|
||||
page_size = xhci_readl(xhci, &xhci->op_regs->page_size);
|
||||
xhci_dbg(xhci, "Supported page size register = 0x%x\n", page_size);
|
||||
for (i = 0; i < 16; i++) {
|
||||
|
@ -2334,7 +2341,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
|
|||
xhci->cmd_ring = xhci_ring_alloc(xhci, 1, 1, TYPE_COMMAND, flags);
|
||||
if (!xhci->cmd_ring)
|
||||
goto fail;
|
||||
INIT_LIST_HEAD(&xhci->cancel_cmd_list);
|
||||
xhci_dbg(xhci, "Allocated command ring at %p\n", xhci->cmd_ring);
|
||||
xhci_dbg(xhci, "First segment DMA is 0x%llx\n",
|
||||
(unsigned long long)xhci->cmd_ring->first_seg->dma);
|
||||
|
@ -2445,8 +2451,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
|
|||
if (xhci_setup_port_arrays(xhci, flags))
|
||||
goto fail;
|
||||
|
||||
INIT_LIST_HEAD(&xhci->lpm_failed_devs);
|
||||
|
||||
/* Enable USB 3.0 device notifications for function remote wake, which
|
||||
* is necessary for allowing USB 3.0 devices to do remote wakeup from
|
||||
* U3 (device suspend).
|
||||
|
|
|
@ -221,6 +221,14 @@ static void xhci_pci_remove(struct pci_dev *dev)
|
|||
static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup)
|
||||
{
|
||||
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
|
||||
struct pci_dev *pdev = to_pci_dev(hcd->self.controller);
|
||||
|
||||
/*
|
||||
* Systems with the TI redriver that loses port status change events
|
||||
* need to have the registers polled during D3, so avoid D3cold.
|
||||
*/
|
||||
if (xhci_compliance_mode_recovery_timer_quirk_check())
|
||||
pdev->no_d3cold = true;
|
||||
|
||||
return xhci_suspend(xhci);
|
||||
}
|
||||
|
|
|
@ -466,7 +466,7 @@ static void compliance_mode_recovery_timer_init(struct xhci_hcd *xhci)
|
|||
* Systems:
|
||||
* Vendor: Hewlett-Packard -> System Models: Z420, Z620 and Z820
|
||||
*/
|
||||
static bool compliance_mode_recovery_timer_quirk_check(void)
|
||||
bool xhci_compliance_mode_recovery_timer_quirk_check(void)
|
||||
{
|
||||
const char *dmi_product_name, *dmi_sys_vendor;
|
||||
|
||||
|
@ -517,7 +517,7 @@ int xhci_init(struct usb_hcd *hcd)
|
|||
xhci_dbg(xhci, "Finished xhci_init\n");
|
||||
|
||||
/* Initializing Compliance Mode Recovery Data If Needed */
|
||||
if (compliance_mode_recovery_timer_quirk_check()) {
|
||||
if (xhci_compliance_mode_recovery_timer_quirk_check()) {
|
||||
xhci->quirks |= XHCI_COMP_MODE_QUIRK;
|
||||
compliance_mode_recovery_timer_init(xhci);
|
||||
}
|
||||
|
@ -956,6 +956,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
|||
struct usb_hcd *hcd = xhci_to_hcd(xhci);
|
||||
struct usb_hcd *secondary_hcd;
|
||||
int retval = 0;
|
||||
bool comp_timer_running = false;
|
||||
|
||||
/* Wait a bit if either of the roothubs need to settle from the
|
||||
* transition into bus suspend.
|
||||
|
@ -993,6 +994,13 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
|||
|
||||
/* If restore operation fails, re-initialize the HC during resume */
|
||||
if ((temp & STS_SRE) || hibernated) {
|
||||
|
||||
if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) &&
|
||||
!(xhci_all_ports_seen_u0(xhci))) {
|
||||
del_timer_sync(&xhci->comp_mode_recovery_timer);
|
||||
xhci_dbg(xhci, "Compliance Mode Recovery Timer deleted!\n");
|
||||
}
|
||||
|
||||
/* Let the USB core know _both_ roothubs lost power. */
|
||||
usb_root_hub_lost_power(xhci->main_hcd->self.root_hub);
|
||||
usb_root_hub_lost_power(xhci->shared_hcd->self.root_hub);
|
||||
|
@ -1035,6 +1043,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
|||
retval = xhci_init(hcd->primary_hcd);
|
||||
if (retval)
|
||||
return retval;
|
||||
comp_timer_running = true;
|
||||
|
||||
xhci_dbg(xhci, "Start the primary HCD\n");
|
||||
retval = xhci_run(hcd->primary_hcd);
|
||||
if (!retval) {
|
||||
|
@ -1076,7 +1086,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
|||
* to suffer the Compliance Mode issue again. It doesn't matter if
|
||||
* ports have entered previously to U0 before system's suspension.
|
||||
*/
|
||||
if (xhci->quirks & XHCI_COMP_MODE_QUIRK)
|
||||
if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && !comp_timer_running)
|
||||
compliance_mode_recovery_timer_init(xhci);
|
||||
|
||||
/* Re-enable port polling. */
|
||||
|
|
|
@ -1853,4 +1853,7 @@ struct xhci_input_control_ctx *xhci_get_input_control_ctx(struct xhci_hcd *xhci,
|
|||
struct xhci_slot_ctx *xhci_get_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx);
|
||||
struct xhci_ep_ctx *xhci_get_ep_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx, unsigned int ep_index);
|
||||
|
||||
/* xHCI quirks */
|
||||
bool xhci_compliance_mode_recovery_timer_quirk_check(void);
|
||||
|
||||
#endif /* __LINUX_XHCI_HCD_H */
|
||||
|
|
Загрузка…
Ссылка в новой задаче