usb: chipidea: otg: add A idle to B disconnect timer
authorLi Jun <jun.li@nxp.com>
Fri, 19 Feb 2016 02:04:49 +0000 (10:04 +0800)
committerFelipe Balbi <balbi@kernel.org>
Fri, 4 Mar 2016 13:14:38 +0000 (15:14 +0200)
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: Peter Chen <peter.chen@nxp.com>
Signed-off-by: Li Jun <jun.li@nxp.com>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
drivers/usb/chipidea/otg_fsm.c
drivers/usb/chipidea/otg_fsm.h

index 9a963a7494675f932f7ec69145e99dfbbc744084..de8e22ec39024edf0cf7d5d04e5ab55547e2658e 100644 (file)
@@ -209,6 +209,7 @@ static unsigned otg_timer_ms[] = {
        TA_AIDL_BDIS,
        TB_ASE0_BRST,
        TA_BIDL_ADIS,
+       TB_AIDL_BDIS,
        TB_SE0_SRP,
        TB_SRP_FAIL,
        0,
@@ -320,6 +321,12 @@ static int a_bidl_adis_tmout(struct ci_hdrc *ci)
        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)
 {
        ci->fsm.b_se0_srp = 1;
@@ -364,6 +371,7 @@ static int (*otg_timer_handlers[])(struct ci_hdrc *) = {
        a_aidl_bdis_tmout,      /* A_AIDL_BDIS */
        b_ase0_brst_tmout,      /* B_ASE0_BRST */
        a_bidl_adis_tmout,      /* A_BIDL_ADIS */
+       b_aidl_bdis_tmout,      /* B_AIDL_BDIS */
        b_se0_srp_tmout,        /* B_SE0_SRP */
        b_srp_fail_tmout,       /* B_SRP_FAIL */
        NULL,                   /* A_WAIT_ENUM */
@@ -655,9 +663,9 @@ static void ci_otg_fsm_event(struct ci_hdrc *ci)
                break;
        case OTG_STATE_B_PERIPHERAL:
                if ((intr_sts & USBi_SLI) && port_conn && otg_bsess_vld) {
-                       fsm->a_bus_suspend = 1;
-                       ci_otg_queue_work(ci);
+                       ci_otg_add_timer(ci, B_AIDL_BDIS);
                } else if (intr_sts & USBi_PCI) {
+                       ci_otg_del_timer(ci, B_AIDL_BDIS);
                        if (fsm->a_bus_suspend == 1)
                                fsm->a_bus_suspend = 0;
                }
index 262d6ef8df7c494e4f7f364647fbc1da620eec54..6366fe398ba67c36aa1d92d3c5c738d82def3403 100644 (file)
@@ -62,6 +62,8 @@
 /* SSEND time before SRP */
 #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)
 
 int ci_hdrc_otg_fsm_init(struct ci_hdrc *ci);