usb: xhci: handle Config Error Change (CEC) in xhci driver
authorLu Baolu <baolu.lu@linux.intel.com>
Mon, 23 Mar 2015 16:27:41 +0000 (18:27 +0200)
committerSasha Levin <sasha.levin@oracle.com>
Fri, 24 Apr 2015 21:13:58 +0000 (17:13 -0400)
commit83961c5495b591d4d6409b119f67c596a6bd6193
treefae945f7d235010fdedb7e8ebc81eba79346a2f3
parentae0f5de3bbd931e0046f505f39daff158d0faa75
usb: xhci: handle Config Error Change (CEC) in xhci driver

[ Upstream commit 9425183d177aa4a2f09d01a74925124f0778b595 ]

Linux xHCI driver doesn't report and handle port cofig error change.
If Port Configure Error for root hub port occurs, CEC bit in PORTSC
would be set by xHC and remains 1. This happends when the root port
fails to configure its link partner, e.g. the port fails to exchange
port capabilities information using Port Capability LMPs.

Then the Port Status Change Events will be blocked until all status
change bits(CEC is one of the change bits) are cleared('0') (refer to
xHCI spec 4.19.2). Otherwise, the port status change event for this
root port will not be generated anymore, then root port would look
like dead for user and can't be recovered until a Host Controller
Reset(HCRST).

This patch is to check CEC bit in PORTSC in xhci_get_port_status()
and set a Config Error in the return status if CEC is set. This will
cause a ClearPortFeature request, where CEC bit is cleared in
xhci_clear_port_change_bit().

[The commit log is based on initial Marvell patch posted at
http://marc.info/?l=linux-kernel&m=142323612321434&w=2]

Reported-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Cc: stable <stable@vger.kernel.org> # v3.2+
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
drivers/usb/host/xhci-hub.c