Commit 4a757547 authored by Li Jun's avatar Li Jun Committed by Felipe Balbi

usb: chipidea: otg: add A idle to B disconnect timer

B-device detects that bus is idle for more than TB_AIDL_BDIS min and
begins HNP by turning off pullup on DP, this allows the bus to discharge
to the SE0 state. This timer was missed and failed with PET test:
6.8.5 B-UUT HNP of USB OTG and EH automated compliance plan v1.2,
this patch is to fix this timing issue.
Acked-by: default avatarPeter Chen <peter.chen@nxp.com>
Signed-off-by: default avatarLi Jun <jun.li@nxp.com>
Signed-off-by: default avatarFelipe Balbi <balbi@kernel.org>
parent 9c527f49
...@@ -209,6 +209,7 @@ static unsigned otg_timer_ms[] = { ...@@ -209,6 +209,7 @@ static unsigned otg_timer_ms[] = {
TA_AIDL_BDIS, TA_AIDL_BDIS,
TB_ASE0_BRST, TB_ASE0_BRST,
TA_BIDL_ADIS, TA_BIDL_ADIS,
TB_AIDL_BDIS,
TB_SE0_SRP, TB_SE0_SRP,
TB_SRP_FAIL, TB_SRP_FAIL,
0, 0,
...@@ -320,6 +321,12 @@ static int a_bidl_adis_tmout(struct ci_hdrc *ci) ...@@ -320,6 +321,12 @@ static int a_bidl_adis_tmout(struct ci_hdrc *ci)
return 0; return 0;
} }
static int b_aidl_bdis_tmout(struct ci_hdrc *ci)
{
ci->fsm.a_bus_suspend = 1;
return 0;
}
static int b_se0_srp_tmout(struct ci_hdrc *ci) static int b_se0_srp_tmout(struct ci_hdrc *ci)
{ {
ci->fsm.b_se0_srp = 1; ci->fsm.b_se0_srp = 1;
...@@ -364,6 +371,7 @@ static int (*otg_timer_handlers[])(struct ci_hdrc *) = { ...@@ -364,6 +371,7 @@ static int (*otg_timer_handlers[])(struct ci_hdrc *) = {
a_aidl_bdis_tmout, /* A_AIDL_BDIS */ a_aidl_bdis_tmout, /* A_AIDL_BDIS */
b_ase0_brst_tmout, /* B_ASE0_BRST */ b_ase0_brst_tmout, /* B_ASE0_BRST */
a_bidl_adis_tmout, /* A_BIDL_ADIS */ a_bidl_adis_tmout, /* A_BIDL_ADIS */
b_aidl_bdis_tmout, /* B_AIDL_BDIS */
b_se0_srp_tmout, /* B_SE0_SRP */ b_se0_srp_tmout, /* B_SE0_SRP */
b_srp_fail_tmout, /* B_SRP_FAIL */ b_srp_fail_tmout, /* B_SRP_FAIL */
NULL, /* A_WAIT_ENUM */ NULL, /* A_WAIT_ENUM */
...@@ -655,9 +663,9 @@ static void ci_otg_fsm_event(struct ci_hdrc *ci) ...@@ -655,9 +663,9 @@ static void ci_otg_fsm_event(struct ci_hdrc *ci)
break; break;
case OTG_STATE_B_PERIPHERAL: case OTG_STATE_B_PERIPHERAL:
if ((intr_sts & USBi_SLI) && port_conn && otg_bsess_vld) { if ((intr_sts & USBi_SLI) && port_conn && otg_bsess_vld) {
fsm->a_bus_suspend = 1; ci_otg_add_timer(ci, B_AIDL_BDIS);
ci_otg_queue_work(ci);
} else if (intr_sts & USBi_PCI) { } else if (intr_sts & USBi_PCI) {
ci_otg_del_timer(ci, B_AIDL_BDIS);
if (fsm->a_bus_suspend == 1) if (fsm->a_bus_suspend == 1)
fsm->a_bus_suspend = 0; fsm->a_bus_suspend = 0;
} }
......
...@@ -62,6 +62,8 @@ ...@@ -62,6 +62,8 @@
/* SSEND time before SRP */ /* SSEND time before SRP */
#define TB_SSEND_SRP (1500) /* minimum 1.5 sec, section:5.1.2 */ #define TB_SSEND_SRP (1500) /* minimum 1.5 sec, section:5.1.2 */
#define TB_AIDL_BDIS (20) /* 4ms ~ 150ms, section 5.2.1 */
#if IS_ENABLED(CONFIG_USB_OTG_FSM) #if IS_ENABLED(CONFIG_USB_OTG_FSM)
int ci_hdrc_otg_fsm_init(struct ci_hdrc *ci); int ci_hdrc_otg_fsm_init(struct ci_hdrc *ci);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment