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

Commit 3b637367 authored by Gerard Cauvy's avatar Gerard Cauvy Committed by Felipe Balbi
Browse files

usb: dwc3: ep0: fix SetFeature(TEST)



When host requests us to enter a test mode,
we cannot directly enter the test mode before
Status Phase is completed, otherwise the core
will never be able to deliver the Status ZLP
to host, because it has already entered the
requested Test Mode.

In order to fix the error, we move the actual
start of Test Mode right after we receive
Transfer Complete event of the status phase.

Signed-off-by: default avatarGerard Cauvy <g-cauvy1@ti.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 09072543
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -684,6 +684,9 @@ struct dwc3 {

	struct dwc3_hwparams	hwparams;
	struct dentry		*root;

	u8			test_mode;
	u8			test_mode_nr;
};

/* -------------------------------------------------------------------------- */
+13 −8
Original line number Diff line number Diff line
@@ -316,7 +316,6 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc,
	u32			wValue;
	u32			wIndex;
	int			ret;
	u32			mode;

	wValue = le16_to_cpu(ctrl->wValue);
	wIndex = le16_to_cpu(ctrl->wIndex);
@@ -355,13 +354,8 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc,
			if (!set)
				return -EINVAL;

			mode = wIndex >> 8;
			ret = dwc3_gadget_set_test_mode(dwc, mode);
			if (ret < 0) {
				dev_dbg(dwc->dev, "Invalid Test #%d\n",
						mode);
				return ret;
			}
			dwc->test_mode_nr = wIndex >> 8;
			dwc->test_mode = true;
		}
		break;

@@ -604,6 +598,17 @@ static void dwc3_ep0_complete_req(struct dwc3 *dwc,
		dwc3_gadget_giveback(dep, r, 0);
	}

	if (dwc->test_mode) {
		int ret;

		ret = dwc3_gadget_set_test_mode(dwc, dwc->test_mode_nr);
		if (ret < 0) {
			dev_dbg(dwc->dev, "Invalid Test #%d\n",
					dwc->test_mode_nr);
			dwc3_ep0_stall_and_restart(dwc);
		}
	}

	dwc->ep0state = EP0_SETUP_PHASE;
	dwc3_ep0_out_start(dwc);
}
+1 −0
Original line number Diff line number Diff line
@@ -1962,6 +1962,7 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc)
	reg = dwc3_readl(dwc->regs, DWC3_DCTL);
	reg &= ~DWC3_DCTL_TSTCTRL_MASK;
	dwc3_writel(dwc->regs, DWC3_DCTL, reg);
	dwc->test_mode = false;

	dwc3_stop_active_transfers(dwc);
	dwc3_clear_stall_all_ep(dwc);