• Badhri Jagan Sridharan's avatar
    staging: typec: tcpm: Prevent TCPM from looping in SRC_TRYWAIT · 02d5be46
    Badhri Jagan Sridharan authored
    According to the spec the following is the condition
    for exiting TryWait.SRC:
    
    "The port shall transition to Attached.SRC when V BUS is at vSafe0V
    and the SRC.Rd state is detected on exactly one of the CC pins for at
    least tCCDebounce. The port shall transition to Unattached.SNK after
    tDRPTry if neither of the CC1 or CC2 pins are in the SRC.Rd state"
    
    TCPM at present keeps re-entering the SRC_TRYWAIT and keeps restarting
    tDRPTry if the CC presents Rp and disconnects within tCCDebounce.
    
    For example:
    [  447.164308] pending state change SRC_TRYWAIT -> SRC_ATTACHED @ 200 ms
    [  447.164386] CC1: 2 -> 0, CC2: 0 -> 0 [state SRC_TRYWAIT, polarity 0, disconnected]
    [  447.164406] state change SRC_TRYWAIT -> SRC_TRYWAIT
    [  447.164573] cc:=3
    [  447.191408] pending state change SRC_TRYWAIT -> SRC_TRYWAIT_UNATTACHED @ 100 ms
    [  447.191478] CC1: 0 -> 0, CC2: 0 -> 0 [state SRC_TRYWAIT, polarity 0, disconnected]
    [  447.207261] CC1: 0 -> 2, CC2: 0 -> 0 [state SRC_TRYWAIT, polarity 0, connected]
    [  447.207306] state change SRC_TRYWAIT -> SRC_TRYWAIT
    [  447.207485] cc:=3
    [  447.237283] pending state change SRC_TRYWAIT -> SRC_ATTACHED @ 200 ms
    [  447.237357] CC1: 2 -> 0, CC2: 0 -> 0 [state SRC_TRYWAIT, polarity 0, disconnected]
    [  447.237379] state change SRC_TRYWAIT -> SRC_TRYWAIT
    [  447.237532] cc:=3
    [  447.263219] pending state change SRC_TRYWAIT -> SRC_TRYWAIT_UNATTACHED @ 100 ms
    [  447.263289] CC1: 0 -> 0, CC2: 0 -> 0 [state SRC_TRYWAIT, polarity 0, disconnected]
    [  447.280926] CC1: 0 -> 2, CC2: 0 -> 0 [state SRC_TRYWAIT, polarity 0, connected]
    [  447.280970] state change SRC_TRYWAIT -> SRC_TRYWAIT
    [  447.281158] cc:=3
    [  447.307767] pending state change SRC_TRYWAIT -> SRC_ATTACHED @ 200 ms
    [  447.307838] CC1: 2 -> 0, CC2: 0 -> 0 [state SRC_TRYWAIT, polarity 0, disconnected]
    [  447.307858] state change SRC_TRYWAIT -> SRC_TRYWAIT
    
    In TCPM, tDRPTry is set tp 100ms (min 75ms and max 150ms)
    and tCCdebounce is set to 200ms (min 100ms and max 200ms).
    To overcome the issue, record the time at which the port
    enters TryWait.SRC(SRC_TRYWAIT) and re-enter SRC_TRYWAIT
    only when CC keeps debouncing within tDRPTry.
    Signed-off-by: default avatarBadhri Jagan Sridharan <Badhri@google.com>
    Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    02d5be46
tcpm.c 88.9 KB