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

Commit 630dc6ea authored by Jack Pham's avatar Jack Pham
Browse files

usb: gadget: qdss: Fix usage of usb_ep_autoconfig()



commit 59ff8848 ("usb: gadget: qdss: Use usb_ep_autoconfig()
instead of ss() variant") modified f_qdss to use the simple
usb_ep_autoconfig() helper, however this function has a caveat
that the passed in descriptor's wMaxPacketSize field gets updated
to be a maximum to 64 bytes. Hence, this function should not be
called with descriptors intended for high- or Superspeed usage
since they can support up to 512 or 1024 bytes for bulk endpoints.

Instead, call usb_ep_autoconfig() by passing in the FS descriptors,
and use the resulting bEndpointAddress assignment to update the
corresponding HS and SS descriptors.

Change-Id: I0b177d5d1075bc3e996f09a2db4699952cf0886d
Signed-off-by: default avatarJack Pham <jackp@codeaurora.org>
parent bcb3f4fc
Loading
Loading
Loading
Loading
+10 −17
Original line number Diff line number Diff line
@@ -402,7 +402,7 @@ static int qdss_bind(struct usb_configuration *c, struct usb_function *f)
	if (!strcmp(qdss->ch.name, USB_QDSS_CH_MDM))
		qdss_data_ep_comp_desc.bMaxBurst = 0;

	ep = usb_ep_autoconfig(gadget, &qdss_ss_data_desc);
	ep = usb_ep_autoconfig(gadget, &qdss_fs_data_desc);
	if (!ep) {
		pr_err("%s: ep_autoconfig error\n", __func__);
		goto clear_ep;
@@ -414,7 +414,7 @@ static int qdss_bind(struct usb_configuration *c, struct usb_function *f)
		msm_ep_set_endless(qdss->port.data, true);

	if (qdss->debug_inface_enabled) {
		ep = usb_ep_autoconfig(gadget, &qdss_ss_ctrl_in_desc);
		ep = usb_ep_autoconfig(gadget, &qdss_fs_ctrl_in_desc);
		if (!ep) {
			pr_err("%s: ep_autoconfig error\n", __func__);
			goto clear_ep;
@@ -423,7 +423,7 @@ static int qdss_bind(struct usb_configuration *c, struct usb_function *f)
		qdss->port.ctrl_in = ep;
		ep->driver_data = qdss;

		ep = usb_ep_autoconfig(gadget, &qdss_ss_ctrl_out_desc);
		ep = usb_ep_autoconfig(gadget, &qdss_fs_ctrl_out_desc);
		if (!ep) {
			pr_err("%s: ep_autoconfig error\n", __func__);
			goto clear_ep;
@@ -441,24 +441,17 @@ static int qdss_bind(struct usb_configuration *c, struct usb_function *f)
		}
	}

	/*update fs descriptors*/
	qdss_fs_data_desc.bEndpointAddress =
		qdss_ss_data_desc.bEndpointAddress;
	if (qdss->debug_inface_enabled) {
		qdss_fs_ctrl_in_desc.bEndpointAddress =
		qdss_ss_ctrl_in_desc.bEndpointAddress;
		qdss_fs_ctrl_out_desc.bEndpointAddress =
		qdss_ss_ctrl_out_desc.bEndpointAddress;
	}

	/*update descriptors*/
	/* update hs/ss descriptors */
	qdss_hs_data_desc.bEndpointAddress =
		qdss_ss_data_desc.bEndpointAddress;
		qdss_ss_data_desc.bEndpointAddress =
			qdss_fs_data_desc.bEndpointAddress;
	if (qdss->debug_inface_enabled) {
		qdss_hs_ctrl_in_desc.bEndpointAddress =
		qdss_ss_ctrl_in_desc.bEndpointAddress;
			qdss_ss_ctrl_in_desc.bEndpointAddress =
				qdss_fs_ctrl_in_desc.bEndpointAddress;
		qdss_hs_ctrl_out_desc.bEndpointAddress =
		qdss_ss_ctrl_out_desc.bEndpointAddress;
			qdss_ss_ctrl_out_desc.bEndpointAddress =
				qdss_fs_ctrl_out_desc.bEndpointAddress;
	}

	if (qdss->debug_inface_enabled)