mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Ben Hutchings <ben@decadent.org.uk>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: torvalds@linux-foundation.org, akpm@linux-foundation.org,
	alan@lxorguk.ukuu.org.uk,
	Stanislaw Ledwon <staszek.ledwon@linux.jf.intel.com>,
	Stanislaw Ledwon <staszek.ledwon@linux.intel.com>,
	Sarah Sharp <sarah.a.sharp@linux.intel.com>,
	Andiry Xu <andiry.xu@amd.com>
Subject: [ 026/108] usb: Add support for root hub port status CAS
Date: Mon, 23 Jul 2012 02:07:17 +0100	[thread overview]
Message-ID: <20120723010655.469503467@decadent.org.uk> (raw)
In-Reply-To: <20120723010651.408577075@decadent.org.uk>

3.2-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Stanislaw Ledwon <staszek.ledwon@linux.jf.intel.com>

commit 8bea2bd37df08aaa599aa361a9f8b836ba98e554 upstream.

The host controller port status register supports CAS (Cold Attach
Status) bit. This bit could be set when USB3.0 device is connected
when system is in Sx state. When the system wakes to S0 this port
status with CAS bit is reported and this port can't be used by any
device.

When CAS bit is set the port should be reset by warm reset. This
was not supported by xhci driver.

The issue was found when pendrive was connected to suspended
platform. The link state of "Compliance Mode" was reported together
with CAS bit. This link state was also not supported by xhci and
core/hub.c.

The CAS bit is defined only for xhci root hub port and it is
not supported on regular hubs. The link status is used to force
warm reset on port. Make the USB core issue a warm reset when port
is in ether the 'inactive' or 'compliance mode'. Change the xHCI driver
to report 'compliance mode' when the CAS is set. This force warm reset
on the root hub port.

This patch should be backported to stable kernels as old as 3.2, that
contain the commit 10d674a82e553cb8a1f41027bb3c3e309b3f6804 "USB: When
hot reset for USB3 fails, try warm reset."

Signed-off-by: Stanislaw Ledwon <staszek.ledwon@linux.intel.com>
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Acked-by: Andiry Xu <andiry.xu@amd.com>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
---
 drivers/usb/core/hub.c      |   18 ++++++++++--------
 drivers/usb/host/xhci-hub.c |   44 +++++++++++++++++++++++++++++++++++++------
 drivers/usb/host/xhci.h     |    6 +++++-
 3 files changed, 53 insertions(+), 15 deletions(-)

diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 25a7422..8fb4849 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2324,12 +2324,16 @@ static unsigned hub_is_wusb(struct usb_hub *hub)
 static int hub_port_reset(struct usb_hub *hub, int port1,
 			struct usb_device *udev, unsigned int delay, bool warm);
 
-/* Is a USB 3.0 port in the Inactive state? */
-static bool hub_port_inactive(struct usb_hub *hub, u16 portstatus)
+/* Is a USB 3.0 port in the Inactive or Complinance Mode state?
+ * Port worm reset is required to recover
+ */
+static bool hub_port_warm_reset_required(struct usb_hub *hub, u16 portstatus)
 {
 	return hub_is_superspeed(hub->hdev) &&
-		(portstatus & USB_PORT_STAT_LINK_STATE) ==
-		USB_SS_PORT_LS_SS_INACTIVE;
+		(((portstatus & USB_PORT_STAT_LINK_STATE) ==
+		  USB_SS_PORT_LS_SS_INACTIVE) ||
+		 ((portstatus & USB_PORT_STAT_LINK_STATE) ==
+		  USB_SS_PORT_LS_COMP_MOD)) ;
 }
 
 static int hub_port_wait_reset(struct usb_hub *hub, int port1,
@@ -2365,7 +2369,7 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1,
 			 *
 			 * See https://bugzilla.kernel.org/show_bug.cgi?id=41752
 			 */
-			if (hub_port_inactive(hub, portstatus)) {
+			if (hub_port_warm_reset_required(hub, portstatus)) {
 				int ret;
 
 				if ((portchange & USB_PORT_STAT_C_CONNECTION))
@@ -4408,9 +4412,7 @@ static void hub_events(void)
 			/* Warm reset a USB3 protocol port if it's in
 			 * SS.Inactive state.
 			 */
-			if (hub_is_superspeed(hub->hdev) &&
-				(portstatus & USB_PORT_STAT_LINK_STATE)
-					== USB_SS_PORT_LS_SS_INACTIVE) {
+			if (hub_port_warm_reset_required(hub, portstatus)) {
 				dev_dbg(hub_dev, "warm reset port %d\n", i);
 				hub_port_reset(hub, i, NULL,
 						HUB_BH_RESET_TIME, true);
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
index 2732ef6..7b01094 100644
--- a/drivers/usb/host/xhci-hub.c
+++ b/drivers/usb/host/xhci-hub.c
@@ -462,6 +462,42 @@ void xhci_test_and_clear_bit(struct xhci_hcd *xhci, __le32 __iomem **port_array,
 	}
 }
 
+/* Updates Link Status for super Speed port */
+static void xhci_hub_report_link_state(u32 *status, u32 status_reg)
+{
+	u32 pls = status_reg & PORT_PLS_MASK;
+
+	/* resume state is a xHCI internal state.
+	 * Do not report it to usb core.
+	 */
+	if (pls == XDEV_RESUME)
+		return;
+
+	/* When the CAS bit is set then warm reset
+	 * should be performed on port
+	 */
+	if (status_reg & PORT_CAS) {
+		/* The CAS bit can be set while the port is
+		 * in any link state.
+		 * Only roothubs have CAS bit, so we
+		 * pretend to be in compliance mode
+		 * unless we're already in compliance
+		 * or the inactive state.
+		 */
+		if (pls != USB_SS_PORT_LS_COMP_MOD &&
+		    pls != USB_SS_PORT_LS_SS_INACTIVE) {
+			pls = USB_SS_PORT_LS_COMP_MOD;
+		}
+		/* Return also connection bit -
+		 * hub state machine resets port
+		 * when this bit is set.
+		 */
+		pls |= USB_PORT_STAT_CONNECTION;
+	}
+	/* update status field */
+	*status |= pls;
+}
+
 int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
 		u16 wIndex, char *buf, u16 wLength)
 {
@@ -606,13 +642,9 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
 			else
 				status |= USB_PORT_STAT_POWER;
 		}
-		/* Port Link State */
+		/* Update Port Link State for super speed ports*/
 		if (hcd->speed == HCD_USB3) {
-			/* resume state is a xHCI internal state.
-			 * Do not report it to usb core.
-			 */
-			if ((temp & PORT_PLS_MASK) != XDEV_RESUME)
-				status |= (temp & PORT_PLS_MASK);
+			xhci_hub_report_link_state(&status, temp);
 		}
 		if (bus_state->port_c_suspend & (1 << wIndex))
 			status |= 1 << USB_PORT_FEAT_C_SUSPEND;
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index de3d6e3..55c0785 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -341,7 +341,11 @@ struct xhci_op_regs {
 #define PORT_PLC	(1 << 22)
 /* port configure error change - port failed to configure its link partner */
 #define PORT_CEC	(1 << 23)
-/* bit 24 reserved */
+/* Cold Attach Status - xHC can set this bit to report device attached during
+ * Sx state. Warm port reset should be perfomed to clear this bit and move port
+ * to connected state.
+ */
+#define PORT_CAS	(1 << 24)
 /* wake on connect (enable) */
 #define PORT_WKCONN_E	(1 << 25)
 /* wake on disconnect (enable) */



  parent reply	other threads:[~2012-07-23  1:46 UTC|newest]

Thread overview: 116+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-23  1:06 [ 000/108] 3.2.24-stable review Ben Hutchings
2012-07-23  1:06 ` [ 001/108] samsung-laptop: make the dmi check less strict Ben Hutchings
2012-07-23  1:06 ` [ 002/108] raid5: delayed stripe fix Ben Hutchings
2012-07-23  1:06 ` [ 003/108] tcp: drop SYN+FIN messages Ben Hutchings
2012-07-23  1:06 ` [ 004/108] tg3: Apply short DMA frag workaround to 5906 Ben Hutchings
2012-07-23  1:06 ` [ 005/108] rtl8187: ->brightness_set can not sleep Ben Hutchings
2012-07-23  1:06 ` [ 006/108] net/wireless: ipw2x00: add supported cipher suites to wiphy initialization Ben Hutchings
2012-07-23  1:06 ` [ 007/108] drm/i915: do not enable RC6p on Sandy Bridge Ben Hutchings
2012-07-23  1:06 ` [ 008/108] drm/i915: fix operator precedence when enabling RC6p Ben Hutchings
2012-07-23  1:07 ` [ 009/108] kbuild: do not check for ancient modutils tools Ben Hutchings
2012-07-23  1:07 ` [ 010/108] brcmsmac: "INTERMEDIATE but not AMPDU" only when tracing Ben Hutchings
2012-07-23  1:07 ` [ 011/108] NFSv4: Rate limit the state manager for lock reclaim warning messages Ben Hutchings
2012-07-23  1:07 ` [ 012/108] ext4: Report max_batch_time option correctly Ben Hutchings
2012-07-23  1:07 ` [ 013/108] hugepages: fix use after free bug in "quota" handling Ben Hutchings
2012-07-23  1:07 ` [ 014/108] NFSv4: Reduce the footprint of the idmapper Ben Hutchings
2012-07-23  1:07 ` [ 015/108] NFSv4: Further reduce " Ben Hutchings
2012-07-23  1:07 ` [ 016/108] macvtap: zerocopy: fix offset calculation when building skb Ben Hutchings
2012-07-23  1:07 ` [ 017/108] macvtap: zerocopy: fix truesize underestimation Ben Hutchings
2012-07-23  1:07 ` [ 018/108] macvtap: zerocopy: put page when fail to get all requested user pages Ben Hutchings
2012-07-23  1:07 ` [ 019/108] macvtap: zerocopy: set SKBTX_DEV_ZEROCOPY only when skb is built successfully Ben Hutchings
2012-07-23  1:07 ` [ 020/108] macvtap: zerocopy: validate vectors before building skb Ben Hutchings
2012-07-23  1:07 ` [ 021/108] KVM: Fix buffer overflow in kvm_set_irq() Ben Hutchings
2012-07-23  1:07 ` [ 022/108] scsi: Silence unnecessary warnings about ioctl to partition Ben Hutchings
2012-07-23  7:31   ` Paolo Bonzini
2012-07-23  1:07 ` [ 023/108] epoll: clear the tfile_check_list on -ELOOP Ben Hutchings
2012-07-23  1:07 ` [ 024/108] iommu/amd: Fix missing iommu_shutdown initialization in passthrough mode Ben Hutchings
2012-07-23  1:07 ` [ 025/108] iommu/amd: Initialize dma_ops for hotplug and sriov devices Ben Hutchings
2012-07-23  1:07 ` Ben Hutchings [this message]
2012-07-23  1:07 ` [ 027/108] gpiolib: wm8994: Pay attention to the value set when enabling as output Ben Hutchings
2012-07-23  1:07 ` [ 028/108] sched/nohz: Rewrite and fix load-avg computation -- again Ben Hutchings
2012-07-24 14:06   ` Ben Hutchings
2012-07-26 21:25     ` Peter Zijlstra
2012-07-26 22:01       ` Ben Hutchings
2012-07-26 22:02         ` Peter Zijlstra
2012-07-23  1:07 ` [ 029/108] USB: option: add ZTE MF60 Ben Hutchings
2012-07-23  1:07 ` [ 030/108] USB: option: Add MEDIATEK product ids Ben Hutchings
2012-07-23  1:07 ` [ 031/108] USB: cdc-wdm: fix lockup on error in wdm_read Ben Hutchings
2012-07-23  1:07 ` [ 032/108] mtd: nandsim: dont open code a do_div helper Ben Hutchings
2012-07-23  1:07 ` [ 033/108] [media] dvb-core: Release semaphore on error path dvb_register_device() Ben Hutchings
2012-07-23  1:07 ` [ 034/108] hwspinlock/core: use global ID to register hwspinlocks on multiple devices Ben Hutchings
2012-07-23  1:07 ` [ 035/108] [SCSI] libsas: fix taskfile corruption in sas_ata_qc_fill_rtf Ben Hutchings
2012-07-23  1:07 ` [ 036/108] md/raid1: fix use-after-free bug in RAID1 data-check code Ben Hutchings
2012-07-23  1:07 ` [ 037/108] PCI: EHCI: fix crash during suspend on ASUS computers Ben Hutchings
2012-07-23  1:07 ` [ 038/108] memory hotplug: fix invalid memory access caused by stale kswapd pointer Ben Hutchings
2012-07-23  1:07 ` [ 039/108] ocfs2: fix NULL pointer dereference in __ocfs2_change_file_space() Ben Hutchings
2012-07-23  1:07 ` [ 040/108] mm, thp: abort compaction if migration page cannot be charged to memcg Ben Hutchings
2012-07-23  1:07 ` [ 041/108] drivers/rtc/rtc-mxc.c: fix irq enabled interrupts warning Ben Hutchings
2012-07-23  1:07 ` [ 042/108] fs: ramfs: file-nommu: add SetPageUptodate() Ben Hutchings
2012-07-23  1:07 ` [ 043/108] cpufreq / ACPI: Fix not loading acpi-cpufreq driver regression Ben Hutchings
2012-07-23  1:07 ` [ 044/108] hwmon: (it87) Preserve configuration register bits on init Ben Hutchings
2012-07-23  1:07 ` [ 045/108] ARM: SAMSUNG: fix race in s3c_adc_start for ADC Ben Hutchings
2012-07-23  1:07 ` [ 046/108] block: fix infinite loop in __getblk_slow Ben Hutchings
2012-07-23  1:07 ` [ 047/108] Remove easily user-triggerable BUG from generic_setlease Ben Hutchings
2012-07-23  1:07 ` [ 048/108] NFC: Export nfc.h to userland Ben Hutchings
2012-07-23  1:07 ` [ 049/108] PM / Hibernate: Hibernate/thaw fixes/improvements Ben Hutchings
2012-07-23  1:07 ` [ 050/108] cfg80211: check iface combinations only when iface is running Ben Hutchings
2012-07-23  1:07 ` [ 051/108] intel_ips: blacklist HP ProBook laptops Ben Hutchings
2012-07-23  1:07 ` [ 052/108] atl1c: fix issue of transmit queue 0 timed out Ben Hutchings
2012-07-23  1:07 ` [ 053/108] rt2x00usb: fix indexes ordering on RX queue kick Ben Hutchings
2012-07-23  1:07 ` [ 054/108] iwlegacy: always monitor for stuck queues Ben Hutchings
2012-07-23  1:07 ` [ 055/108] iwlegacy: dont mess up the SCD when removing a key Ben Hutchings
2012-07-23  1:07 ` [ 056/108] e1000e: Correct link check logic for 82571 serdes Ben Hutchings
2012-07-23  1:07 ` [ 057/108] tcm_fc: Fix crash seen with aborts and large reads Ben Hutchings
2012-07-23  1:07 ` [ 058/108] fifo: Do not restart open() if it already found a partner Ben Hutchings
2012-07-23  1:07 ` [ 059/108] target: Clean up returning errors in PR handling code Ben Hutchings
2012-07-23  1:07 ` [ 060/108] target: Fix range calculation in WRITE SAME emulation when num blocks == 0 Ben Hutchings
2012-07-23  1:07 ` [ 061/108] cifs: on CONFIG_HIGHMEM machines, limit the rsize/wsize to the kmap space Ben Hutchings
2012-07-23  1:07 ` [ 062/108] cifs: always update the inode cache with the results from a FIND_* Ben Hutchings
2012-07-23  1:07 ` [ 063/108] mm: fix lost kswapd wakeup in kswapd_stop() Ben Hutchings
2012-07-23  1:07 ` [ 064/108] md: avoid crash when stopping md array races with closing other open fds Ben Hutchings
2012-07-23  1:07 ` [ 065/108] md/raid1: close some possible races on write errors during resync Ben Hutchings
2012-07-23  1:07 ` [ 066/108] MIPS: Properly align the .data..init_task section Ben Hutchings
2012-07-23  1:07 ` [ 067/108] UBIFS: fix a bug in empty space fix-up Ben Hutchings
2012-07-23  1:07 ` [ 068/108] ore: Fix NFS crash by supporting any unaligned RAID IO Ben Hutchings
2012-07-23  1:08 ` [ 069/108] ore: Remove support of partial IO request (NFS crash) Ben Hutchings
2012-07-23  1:08 ` [ 070/108] pnfs-obj: dont leak objio_state if ore_write/read fails Ben Hutchings
2012-07-23  1:08 ` [ 071/108] pnfs-obj: Fix __r4w_get_page when offset is beyond i_size Ben Hutchings
2012-07-23  1:08 ` [ 072/108] dm raid1: fix crash with mirror recovery and discard Ben Hutchings
2012-07-23  1:08 ` [ 073/108] dm raid1: set discard_zeroes_data_unsupported Ben Hutchings
2012-07-23  1:08 ` [ 074/108] ntp: Fix leap-second hrtimer livelock Ben Hutchings
2012-07-23  1:08 ` [ 075/108] ntp: Correct TAI offset during leap second Ben Hutchings
2012-07-23  1:08 ` [ 076/108] timekeeping: Fix CLOCK_MONOTONIC inconsistency during leapsecond Ben Hutchings
2012-07-23  1:08 ` [ 077/108] time: Move common updates to a function Ben Hutchings
2012-07-23  1:08 ` [ 078/108] hrtimer: Provide clock_was_set_delayed() Ben Hutchings
2012-07-23  1:08 ` [ 079/108] timekeeping: Fix leapsecond triggered load spike issue Ben Hutchings
2012-07-23  1:08 ` [ 080/108] timekeeping: Maintain ktime_t based offsets for hrtimers Ben Hutchings
2012-07-23  1:08 ` [ 081/108] hrtimers: Move lock held region in hrtimer_interrupt() Ben Hutchings
2012-07-23  1:08 ` [ 082/108] timekeeping: Provide hrtimer update function Ben Hutchings
2012-07-23  1:08 ` [ 083/108] hrtimer: Update hrtimer base offsets each hrtimer_interrupt Ben Hutchings
2012-07-23  1:08 ` [ 084/108] timekeeping: Add missing update call in timekeeping_resume() Ben Hutchings
2012-07-23  1:08 ` [ 085/108] powerpc: Fix wrong divisor in usecs_to_cputime Ben Hutchings
2012-07-23  1:08 ` [ 086/108] vhost: dont forget to schedule() Ben Hutchings
2012-07-23  1:08 ` [ 087/108] r8169: call netif_napi_del at errpaths and at driver unload Ben Hutchings
2012-07-23  1:08 ` [ 088/108] bnx2x: fix checksum validation Ben Hutchings
2012-07-23  1:08 ` [ 089/108] bnx2x: fix panic when TX ring is full Ben Hutchings
2012-07-23  1:08 ` [ 090/108] net: remove skb_orphan_try() Ben Hutchings
2012-07-23  1:08 ` [ 091/108] ACPI: Make acpi_skip_timer_override cover all source_irq==0 cases Ben Hutchings
2012-07-23  1:08 ` [ 092/108] ACPI: Remove one board specific WARN when ignoring timer overriding Ben Hutchings
2012-07-23  1:08 ` [ 093/108] ACPI: Add a quirk for "AMILO PRO V2030" to ignore the " Ben Hutchings
2012-07-23  1:08 ` [ 094/108] ACPI, x86: fix Dell M6600 ACPI reboot regression via DMI Ben Hutchings
2012-07-23  1:08 ` [ 095/108] ACPI sysfs.c strlen fix Ben Hutchings
2012-07-23  1:08 ` [ 096/108] eCryptfs: Gracefully refuse miscdev file ops on inherited/passed files Ben Hutchings
2012-07-23  1:08 ` [ 097/108] eCryptfs: Fix lockdep warning in miscdev operations Ben Hutchings
2012-07-23  1:08 ` [ 098/108] eCryptfs: Properly check for O_RDONLY flag before doing privileged open Ben Hutchings
2012-07-23  1:08 ` [ 099/108] ACPI / PM: Make acpi_pm_device_sleep_state() follow the specification Ben Hutchings
2012-07-23  1:08 ` [ 100/108] ipheth: add support for iPad Ben Hutchings
2012-07-23  1:08 ` [ 101/108] stmmac: Fix for nfs hang on multiple reboot Ben Hutchings
2012-07-23  1:08 ` [ 102/108] bonding: debugfs and network namespaces are incompatible Ben Hutchings
2012-07-23  1:08 ` [ 103/108] bonding: Manage /proc/net/bonding/ entries from the netdev events Ben Hutchings
2012-07-23  1:08 ` [ 104/108] Input: bcm5974 - Add support for 2012 MacBook Pro Retina Ben Hutchings
2012-07-23  1:08 ` [ 105/108] Input: xpad - handle all variations of Mad Catz Beat Pad Ben Hutchings
2012-07-23  1:08 ` [ 106/108] Input: xpad - add signature for Razer Onza Tournament Edition Ben Hutchings
2012-07-23  1:08 ` [ 107/108] Input: xpad - add Andamiro Pump It Up pad Ben Hutchings
2012-07-23  1:08 ` [ 108/108] HID: add support for 2012 MacBook Pro Retina Ben Hutchings
2012-07-23  1:51 ` [ 000/108] 3.2.24-stable review Ben Hutchings
     [not found] ` <CAD9gYJKwrcovmGcDJoCMAzQF=zfT2jnk9ghctejWAX1R5ifB=w@mail.gmail.com>
2012-07-30  1:37   ` Ben Hutchings

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120723010655.469503467@decadent.org.uk \
    --to=ben@decadent.org.uk \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=andiry.xu@amd.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sarah.a.sharp@linux.intel.com \
    --cc=stable@vger.kernel.org \
    --cc=staszek.ledwon@linux.intel.com \
    --cc=staszek.ledwon@linux.jf.intel.com \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®