All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Lu, Baolu" <baolu.lu@linux.intel.com>
To: Alan Stern <stern@rowland.harvard.edu>
Cc: Mathias Nyman <mathias.nyman@intel.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/3] usb: xhci: This reworks ff8cbf250b448aac35589f6075082c3fcad8a8fe
Date: Tue, 04 Nov 2014 15:40:46 +0800	[thread overview]
Message-ID: <545882FE.70907@linux.intel.com> (raw)
In-Reply-To: <Pine.LNX.4.44L0.1410311023550.1833-100000@iolanthe.rowland.org>


On 10/31/2014 10:28 PM, Alan Stern wrote:
> On Fri, 31 Oct 2014, Lu Baolu wrote:
>
>> xhci: clear root port wake on bits if controller isn't wake-up capable
>>
>> When xHCI PCI host is suspended, if do_wakeup is false in xhci_pci_suspend,
>> xhci_pci_suspend needs to clear all root port wake on bits. Otherwise some Intel
>> platforms may get a spurious wakeup, even if PCI PME# is disabled.
>>
>> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
>> ---
>>   drivers/usb/host/xhci-pci.c | 42 ++++++++++++++++++++++++++++++++++++++++++
>>   drivers/usb/host/xhci.h     |  6 ++++++
>>   2 files changed, 48 insertions(+)
>>
>> diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
>> index 280dde9..3e7441a 100644
>> --- a/drivers/usb/host/xhci-pci.c
>> +++ b/drivers/usb/host/xhci-pci.c
>> @@ -27,6 +27,8 @@
>>   #include "xhci.h"
>>   #include "xhci-trace.h"
>>   
>> +#define	PORT_WAKE_BITS	(PORT_WKOC_E | PORT_WKDISC_E | PORT_WKCONN_E)
>> +
>>   /* Device for a quirk */
>>   #define PCI_VENDOR_ID_FRESCO_LOGIC	0x1b73
>>   #define PCI_DEVICE_ID_FRESCO_LOGIC_PDK	0x1000
>> @@ -126,6 +128,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
>>   		 */
>>   		xhci->quirks |= XHCI_SPURIOUS_REBOOT;
>>   		xhci->quirks |= XHCI_AVOID_BEI;
>> +		xhci->quirks |= XHCI_DISABLE_PORT_WOB;
>>   	}
>>   	if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
>>   	    (pdev->device == PCI_DEVICE_ID_INTEL_LYNXPOINT_XHCI ||
>> @@ -279,6 +282,42 @@ static void xhci_pci_remove(struct pci_dev *dev)
>>   }
>>   
>>   #ifdef CONFIG_PM
>> +static void xhci_disable_port_wake_bits(struct xhci_hcd *xhci)
>> +{
>> +	int port_index;
>> +	__le32 __iomem **port_array;
>> +	unsigned long flags;
>> +	u32 t1, t2;
>> +
>> +	spin_lock_irqsave(&xhci->lock, flags);
>> +
>> +	/* disble usb3 ports Wake bits*/
>> +	port_index = xhci->num_usb3_ports;
>> +	port_array = xhci->usb3_ports;
>> +	while (port_index--) {
>> +		t1 = readl(port_array[port_index]);
>> +		t2 = xhci_port_state_to_neutral(t1);
>> +		t2 &= ~PORT_WAKE_BITS;
>> +		t1 = xhci_port_state_to_neutral(t1);
>> +		if (t1 != t2)
>> +			writel(t2, port_array[port_index]);
>> +	}
>> +
>> +	/* disble usb2 ports Wake bits*/
>> +	port_index = xhci->num_usb2_ports;
>> +	port_array = xhci->usb2_ports;
>> +	while (port_index--) {
>> +		t1 = readl(port_array[port_index]);
>> +		t2 = xhci_port_state_to_neutral(t1);
>> +		t2 &= ~PORT_WAKE_BITS;
>> +		t1 = xhci_port_state_to_neutral(t1);
>> +		if (t1 != t2)
>> +			writel(t2, port_array[port_index]);
>> +	}
>> +
>> +	spin_unlock_irqrestore(&xhci->lock, flags);
>> +}
>> +
>>   static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup)
>>   {
>>   	struct xhci_hcd	*xhci = hcd_to_xhci(hcd);
>> @@ -291,6 +330,9 @@ static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup)
>>   	if (xhci->quirks & XHCI_COMP_MODE_QUIRK)
>>   		pdev->no_d3cold = true;
>>   
>> +	if (xhci->quirks & XHCI_DISABLE_PORT_WOB && !do_wakeup)
>> +		xhci_disable_port_wake_bits(xhci);
>> +
>>   	return xhci_suspend(xhci);
>>   }
> There are two things wrong here.  First, this should not be a quirk.
> The Wake-On bits should be disabled whenever they aren't needed, on
> every controller.
>
> Second, this code (or something like it) belongs in xhci.c or
> xhci-hub.c, not xhci-pci.c.  This is because it should apply to all
> xHCI controllers, not just the PCI-based ones.
Hi Alan,

I agree with you. I will resubmit my patches.

BR,
baolu

>
> (In fact, instead of disabling the Wake-On bits when the controller is
> suspended and do_wakeup is 0, it probably would be better to leave them
> disabled normally and then _enable_ them if do_wakeup is 1.)
>
> Alan Stern
>


  reply	other threads:[~2014-11-04  7:40 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-31  2:38 [PATCH 0/3] Rework "xhci: clear root port wake on bits if controller isn't wake-up capable" Lu Baolu
2014-10-31  2:38 ` [PATCH 1/3] usb: xhci: Revert " Lu Baolu
2014-10-31  2:38 ` [PATCH 2/3] usb: xhci: This reworks ff8cbf250b448aac35589f6075082c3fcad8a8fe Lu Baolu
2014-10-31 14:28   ` Alan Stern
2014-11-04  7:40     ` Lu, Baolu [this message]
2014-10-31  2:38 ` [PATCH 3/3] usb: xhci: fix comment for PORT_DEV_REMOVE Lu Baolu

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=545882FE.70907@linux.intel.com \
    --to=baolu.lu@linux.intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=mathias.nyman@intel.com \
    --cc=stern@rowland.harvard.edu \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.