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

Commit 7e115fdb authored by Hemant Kumar's avatar Hemant Kumar Committed by Gerrit - the friendly Code Review server
Browse files

usb: gadget: Disable USB2 LPM Support



USB device is failing to initiate L1 remote wakeup for following
scenarios:-

1) When USB host initiates L1 between control transfers
(Setup and Status Phase).
2)In case of BULK only composition when USB host initiates L1 after
PING retries on OUT endpoint. Device fails to initiate L1 remote
wakeup when SW issues start transfer.
3) When bus is suspended and Start transfer is issued on IN TRB

Hence disable high speed link power management support by advertising
bcdUSB as 2.0 in high speed mode.

Change-Id: I83124d5e3821ba979be4772bc04e41f05dc7492c
Signed-off-by: default avatarHemant Kumar <hemantk@codeaurora.org>
parent 4e7334e5
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -35,6 +35,12 @@
	(speed == USB_SPEED_SUPER ?\
	 SSUSB_GADGET_VBUS_DRAW : CONFIG_USB_GADGET_VBUS_DRAW)

/* disable LPM by default */
static bool disable_l1_for_hs = true;
module_param(disable_l1_for_hs, bool, 0644);
MODULE_PARM_DESC(disable_l1_for_hs,
	"Disable support for L1 LPM for HS devices");

/**
 * struct usb_os_string - represents OS String to be reported by a gadget
 * @bLength: total length of the entire descritor, always 0x12
@@ -1718,10 +1724,10 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
				if (gadget->speed >= USB_SPEED_SUPER) {
					cdev->desc.bcdUSB = cpu_to_le16(0x0310);
					cdev->desc.bMaxPacketSize0 = 9;
				} else {
				} else if (!disable_l1_for_hs) {
					cdev->desc.bcdUSB = cpu_to_le16(0x0210);
				}
			} else if (gadget->l1_supported) {
			} else if (!disable_l1_for_hs) {
				cdev->desc.bcdUSB = cpu_to_le16(0x0210);
				DBG(cdev, "Config HS device with LPM(L1)\n");
			}
@@ -1755,7 +1761,7 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
			break;
		case USB_DT_BOS:
			if (gadget_is_superspeed(gadget) ||
				gadget->l1_supported) {
				!disable_l1_for_hs) {
				value = bos_desc(cdev);
				value = min(w_length, (u16) value);
			}
+0 −1
Original line number Diff line number Diff line
@@ -520,7 +520,6 @@ struct usb_gadget {
	unsigned			is_selfpowered:1;
	unsigned			deactivated:1;
	unsigned			connected:1;
	bool				l1_supported;
	bool				remote_wakeup;
};
#define work_to_gadget(w)	(container_of((w), struct usb_gadget, work))