New issue
Advanced search Search tips

Issue 909761 link

Starred by 1 user

Issue metadata

Status: Untriaged
Owner: ----
Cc:
Components:
EstimatedDays: ----
NextAction: ----
OS: Chrome
Pri: 2
Type: Bug



Sign in to add a comment

servo: V4: errors during init: sbu_uart_sel & atmega_rst controls

Project Member Reported by tbroch@google.com, Nov 28

Issue description

To repro,

1. connect servo V4 to CCD capable device (I'm using careena).
2. do something that causes CCD USB device to disappear.  Dead battery seems to be reliable but there are also other occasions it seems to fall off rails
3. sudo servod --product 0x501b

2018-11-28 09:04:01,705 - Servod - ERROR - Problem initializing sbu_uart_sel -> ccd
Traceback (most recent call last):
  File "/usr/lib64/python2.7/site-packages/servo/servo_server.py", line 850, in hwinit
    if self.get(control_name) != value:
  File "/usr/lib64/python2.7/site-packages/servo/servo_server.py", line 764, in get
    val = drv.get()
  File "/usr/lib64/python2.7/site-packages/servo/drv/tca6416.py", line 78, in get
    value = self._i2c_obj._read_reg(self.REG_INP + self._port)
  File "/usr/lib64/python2.7/site-packages/servo/drv/i2c_reg.py", line 95, in _read_reg
    rlist = self._wr_rd(reg, [], self._reg_len)
  File "/usr/lib64/python2.7/site-packages/servo/drv/i2c_reg.py", line 172, in _wr_rd
    rlist = self._i2c.wr_rd(self._slave, wlist, rcnt)
  File "/usr/lib64/python2.7/site-packages/servo/i2c_base.py", line 57, in wr_rd
    return self._raw_wr_rd(slave_address, write_list, read_count)
  File "/usr/lib64/python2.7/site-packages/servo/stm32i2c.py", line 138, in _raw_wr_rd
    data = self._susb._read_ep.read(read_count + 4, self._susb.TIMEOUT_MS)
  File "/usr/lib64/python2.7/site-packages/usb/core.py", line 300, in read
    return self.device.read(self.bEndpointAddress, size, self.interface, timeout)
  File "/usr/lib64/python2.7/site-packages/usb/core.py", line 670, in read
    self.__get_timeout(timeout)
  File "/usr/lib64/python2.7/site-packages/usb/backend/libusb1.py", line 780, in bulk_read
    timeout)
  File "/usr/lib64/python2.7/site-packages/usb/backend/libusb1.py", line 889, in __read
    _check(retval)
  File "/usr/lib64/python2.7/site-packages/usb/backend/libusb1.py", line 571, in _check
    raise USBError(_str_error[ret], ret, _libusb_errno[ret])
USBError: [Errno 110] Operation timed out
2018-11-28 09:04:01,812 - Servod - ERROR - Problem initializing atmega_rst -> on
Traceback (most recent call last):
  File "/usr/lib64/python2.7/site-packages/servo/servo_server.py", line 850, in hwinit
    if self.get(control_name) != value:
  File "/usr/lib64/python2.7/site-packages/servo/servo_server.py", line 764, in get
    val = drv.get()
  File "/usr/lib64/python2.7/site-packages/servo/drv/tca6416.py", line 78, in get
    value = self._i2c_obj._read_reg(self.REG_INP + self._port)
  File "/usr/lib64/python2.7/site-packages/servo/drv/i2c_reg.py", line 95, in _read_reg
    rlist = self._wr_rd(reg, [], self._reg_len)
  File "/usr/lib64/python2.7/site-packages/servo/drv/i2c_reg.py", line 172, in _wr_rd
    rlist = self._i2c.wr_rd(self._slave, wlist, rcnt)
  File "/usr/lib64/python2.7/site-packages/servo/i2c_base.py", line 57, in wr_rd
    return self._raw_wr_rd(slave_address, write_list, read_count)
  File "/usr/lib64/python2.7/site-packages/servo/stm32i2c.py", line 138, in _raw_wr_rd
    data = self._susb._read_ep.read(read_count + 4, self._susb.TIMEOUT_MS)
  File "/usr/lib64/python2.7/site-packages/usb/core.py", line 300, in read
    return self.device.read(self.bEndpointAddress, size, self.interface, timeout)
  File "/usr/lib64/python2.7/site-packages/usb/core.py", line 670, in read
    self.__get_timeout(timeout)
  File "/usr/lib64/python2.7/site-packages/usb/backend/libusb1.py", line 780, in bulk_read
    self.__get_timeout(timeout)
  File "/usr/lib64/python2.7/site-packages/usb/backend/libusb1.py", line 780, in bulk_read
    timeout)
  File "/usr/lib64/python2.7/site-packages/usb/backend/libusb1.py", line 889, in __read
    _check(retval)
  File "/usr/lib64/python2.7/site-packages/usb/backend/libusb1.py", line 571, in _check
    raise USBError(_str_error[ret], ret, _libusb_errno[ret])
USBError: [Errno 110] Operation timed out


Looks like USB gets wedged perhaps from the CCD disappearance.  Haven't found means to remotely recover ATM.
 
See this same failure even before CCD goes away when switching servo_v4_role between src & snk

When this occurs it also becomes impossible to toggle servo_v4_role despite dut-control appearing to succeed.

dut-control servo_v4_role:src servo_v4_role
servo_v4_role:snk
Tried rebooting servo V4 via its console and while I no longer see init warnings for atmega_rst & sbu_uart_sel ... servo_v4_role is still stuck-at 'snk'
Cc: nsanders@chromium.org
Labels: -Pri-3 Pri-2
After the servo V4 reboot via console I'm now seeing the following on servo_v4_console_pty,

C0 st2
C0 st3
C0 st5
C0 st30
<repeat sequence of 4 every ~1sec indefinitely>

Which I believe translates to:

+       "SNK_DISCONNECTED", // 2
+       "SNK_DISCONNECTED_DEBOUNCE", // 3
+       "SNK_DISCOVERY", // 5
+       "SRC_SWAP_STANDBY", // 30

Not recalling details of USBPD spec it seems strange that this should at some point result in a USBPD reset (soft or hard) at some point.


Tried getting a little nastier via the servo_v4 console itself,

> pd 0 soft

Seemed to send the soft reset and was then accompanied by the receipt of a hard (presumably from zinger PSU)

softC0 st5 ## Note 'soft' is me typing

C0 st30
> C0 st2
C0 st3
C0 st31
C0 st2
C0 st3
C0 st5
C0 HARD RST RX
C0 st4
C0 st2
C0 st3
C0 st5
C0 st2
C0 st3
C0 st5
<repeat last 3 ~every 1sec indefinitely>

Then I believe I tried forcing the role on the port

pd 0 dualrole source
pd 0 dualrole sink

At that point the USBPD state transitions of

C0 st2
C0 st3
C0 st5

stopped repeating but I still did not have a power contract between zinger & servo v4.

At that point I tried another 'reset' on servo V4 console and that did recover things

dut-control servo_v4_role:src servo_v4_role servo_v4_role:snk servo_v4_role servo_v4_role:src
servo_v4_role:src
servo_v4_role:snk

So good news is that there is a means to hopefully recover from this error state programmatically however ATM I don't know what triggers the failure nor a more elegant way to recover from it than quieting the USBPD transactions followed by rebooting servo V4.




Cc: mqg@chromium.org
Components: OS>Hardware

Sign in to add a comment