|
@@ -7,6 +7,7 @@
|
|
* Author: Chunfeng.Yun <chunfeng.yun@mediatek.com>
|
|
* Author: Chunfeng.Yun <chunfeng.yun@mediatek.com>
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
+#include <linux/iopoll.h>
|
|
#include <linux/usb/composite.h>
|
|
#include <linux/usb/composite.h>
|
|
|
|
|
|
#include "mtu3.h"
|
|
#include "mtu3.h"
|
|
@@ -263,6 +264,7 @@ static int handle_test_mode(struct mtu3 *mtu, struct usb_ctrlrequest *setup)
|
|
{
|
|
{
|
|
void __iomem *mbase = mtu->mac_base;
|
|
void __iomem *mbase = mtu->mac_base;
|
|
int handled = 1;
|
|
int handled = 1;
|
|
|
|
+ u32 value;
|
|
|
|
|
|
switch (le16_to_cpu(setup->wIndex) >> 8) {
|
|
switch (le16_to_cpu(setup->wIndex) >> 8) {
|
|
case TEST_J:
|
|
case TEST_J:
|
|
@@ -292,6 +294,14 @@ static int handle_test_mode(struct mtu3 *mtu, struct usb_ctrlrequest *setup)
|
|
if (mtu->test_mode_nr == TEST_PACKET_MODE)
|
|
if (mtu->test_mode_nr == TEST_PACKET_MODE)
|
|
ep0_load_test_packet(mtu);
|
|
ep0_load_test_packet(mtu);
|
|
|
|
|
|
|
|
+ /* send status before entering test mode. */
|
|
|
|
+ value = mtu3_readl(mbase, U3D_EP0CSR) & EP0_W1C_BITS;
|
|
|
|
+ mtu3_writel(mbase, U3D_EP0CSR, value | EP0_SETUPPKTRDY | EP0_DATAEND);
|
|
|
|
+
|
|
|
|
+ /* wait for ACK status sent by host */
|
|
|
|
+ readl_poll_timeout(mbase + U3D_EP0CSR, value,
|
|
|
|
+ !(value & EP0_DATAEND), 100, 5000);
|
|
|
|
+
|
|
mtu3_writel(mbase, U3D_USB2_TEST_MODE, mtu->test_mode_nr);
|
|
mtu3_writel(mbase, U3D_USB2_TEST_MODE, mtu->test_mode_nr);
|
|
|
|
|
|
mtu->ep0_state = MU3D_EP0_STATE_SETUP;
|
|
mtu->ep0_state = MU3D_EP0_STATE_SETUP;
|