Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 62f4b242 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

Merge tag 'for-usb-next-2013-08-27' of...

Merge tag 'for-usb-next-2013-08-27' of git://git.kernel.org/pub/scm/linux/kernel/git/sarah/xhci into usb-next

Sarah writes:

xhci: Bug fixes for 3.12.

Hi Greg,

Here's three low-priority bug fixes that should be queued for 3.12.
They disable runtime PM for hosts that need the XHCI_RESET_ON_RESUME
quirk, fix USB 2.0 Link PM on hosts that don't have BESL support, and
prevent a bunch of log spam.

Please pull into usb-next for 3.12.

Sarah Sharp
parents ce26bd23 0730d52a
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -71,7 +71,7 @@


/* USB 2.0 xHCI 1.0 hardware LMP capability - section 7.2.2.1.3.2 */
/* USB 2.0 xHCI 1.0 hardware LMP capability - section 7.2.2.1.3.2 */
#define XHCI_HLC               (1 << 19)
#define XHCI_HLC               (1 << 19)
#define XHCI_BLC               (1 << 19)
#define XHCI_BLC               (1 << 20)


/* command register values to disable interrupts and halt the HC */
/* command register values to disable interrupts and halt the HC */
/* start/stop HC execution - do not write unless HC is halted*/
/* start/stop HC execution - do not write unless HC is halted*/
+8 −16
Original line number Original line Diff line number Diff line
@@ -3087,14 +3087,10 @@ int xhci_queue_intr_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
	 * to set the polling interval (once the API is added).
	 * to set the polling interval (once the API is added).
	 */
	 */
	if (xhci_interval != ep_interval) {
	if (xhci_interval != ep_interval) {
		if (printk_ratelimit())
		dev_dbg_ratelimited(&urb->dev->dev,
			dev_dbg(&urb->dev->dev, "Driver uses different interval"
				"Driver uses different interval (%d microframe%s) than xHCI (%d microframe%s)\n",
					" (%d microframe%s) than xHCI "
				ep_interval, ep_interval == 1 ? "" : "s",
					"(%d microframe%s)\n",
				xhci_interval, xhci_interval == 1 ? "" : "s");
					ep_interval,
					ep_interval == 1 ? "" : "s",
					xhci_interval,
					xhci_interval == 1 ? "" : "s");
		urb->interval = xhci_interval;
		urb->interval = xhci_interval;
		/* Convert back to frames for LS/FS devices */
		/* Convert back to frames for LS/FS devices */
		if (urb->dev->speed == USB_SPEED_LOW ||
		if (urb->dev->speed == USB_SPEED_LOW ||
@@ -3876,14 +3872,10 @@ int xhci_queue_isoc_tx_prepare(struct xhci_hcd *xhci, gfp_t mem_flags,
	 * to set the polling interval (once the API is added).
	 * to set the polling interval (once the API is added).
	 */
	 */
	if (xhci_interval != ep_interval) {
	if (xhci_interval != ep_interval) {
		if (printk_ratelimit())
		dev_dbg_ratelimited(&urb->dev->dev,
			dev_dbg(&urb->dev->dev, "Driver uses different interval"
				"Driver uses different interval (%d microframe%s) than xHCI (%d microframe%s)\n",
					" (%d microframe%s) than xHCI "
				ep_interval, ep_interval == 1 ? "" : "s",
					"(%d microframe%s)\n",
				xhci_interval, xhci_interval == 1 ? "" : "s");
					ep_interval,
					ep_interval == 1 ? "" : "s",
					xhci_interval,
					xhci_interval == 1 ? "" : "s");
		urb->interval = xhci_interval;
		urb->interval = xhci_interval;
		/* Convert back to frames for LS/FS devices */
		/* Convert back to frames for LS/FS devices */
		if (urb->dev->speed == USB_SPEED_LOW ||
		if (urb->dev->speed == USB_SPEED_LOW ||
+22 −0
Original line number Original line Diff line number Diff line
@@ -3557,10 +3557,21 @@ void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev)
{
{
	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
	struct xhci_virt_device *virt_dev;
	struct xhci_virt_device *virt_dev;
	struct device *dev = hcd->self.controller;
	unsigned long flags;
	unsigned long flags;
	u32 state;
	u32 state;
	int i, ret;
	int i, ret;


#ifndef CONFIG_USB_DEFAULT_PERSIST
	/*
	 * We called pm_runtime_get_noresume when the device was attached.
	 * Decrement the counter here to allow controller to runtime suspend
	 * if no devices remain.
	 */
	if (xhci->quirks & XHCI_RESET_ON_RESUME)
		pm_runtime_put_noidle(dev);
#endif

	ret = xhci_check_args(hcd, udev, NULL, 0, true, __func__);
	ret = xhci_check_args(hcd, udev, NULL, 0, true, __func__);
	/* If the host is halted due to driver unload, we still need to free the
	/* If the host is halted due to driver unload, we still need to free the
	 * device.
	 * device.
@@ -3634,6 +3645,7 @@ static int xhci_reserve_host_control_ep_resources(struct xhci_hcd *xhci)
int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev)
int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev)
{
{
	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
	struct device *dev = hcd->self.controller;
	unsigned long flags;
	unsigned long flags;
	int timeleft;
	int timeleft;
	int ret;
	int ret;
@@ -3686,6 +3698,16 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev)
		goto disable_slot;
		goto disable_slot;
	}
	}
	udev->slot_id = xhci->slot_id;
	udev->slot_id = xhci->slot_id;

#ifndef CONFIG_USB_DEFAULT_PERSIST
	/*
	 * If resetting upon resume, we can't put the controller into runtime
	 * suspend if there is a device attached.
	 */
	if (xhci->quirks & XHCI_RESET_ON_RESUME)
		pm_runtime_get_noresume(dev);
#endif

	/* Is this a LS or FS device under a HS hub? */
	/* Is this a LS or FS device under a HS hub? */
	/* Hub or peripherial? */
	/* Hub or peripherial? */
	return 1;
	return 1;