diff options
author | Aidan MacDonald <amachronic@protonmail.com> | 2021-10-02 11:53:20 +0100 |
---|---|---|
committer | Aidan MacDonald <amachronic@protonmail.com> | 2021-10-02 15:09:46 +0100 |
commit | 3a89fdee96eadda10a6024bd1162fae696654ae6 (patch) | |
tree | 2b10f6da1d5575e5ff5831ed173f8daa7069a771 /firmware/usbstack | |
parent | d435bb77b57a2c3ec1f3e447101bb6bbb7d163e1 (diff) |
x1000: fix hang that may occur in USB mode
Upon getting a USB reset, the USB core will update charging
current by calling usb_charging_maxcurrent_change(). On all
current X1000 targets this may cause a hang, since changing
the charge current involves a blocking I2C transaction.
Eg. if the host issues a reset when we're already configured
as part of error recovery, the change from 500 mA -> 100 mA
will cause a hang.
Change-Id: I5b45272c01fa16b179ae3d16bbc50c7fab9a416b
Diffstat (limited to 'firmware/usbstack')
-rw-r--r-- | firmware/usbstack/usb_core.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/firmware/usbstack/usb_core.c b/firmware/usbstack/usb_core.c index bf73c58abc..65bf7293c8 100644 --- a/firmware/usbstack/usb_core.c +++ b/firmware/usbstack/usb_core.c @@ -928,8 +928,14 @@ void usb_core_bus_reset(void) usb_address = 0; usb_state = DEFAULT; #ifdef HAVE_USB_CHARGING_ENABLE +#ifdef HAVE_USB_CHARGING_IN_THREAD + /* On some targets usb_charging_maxcurrent_change() cannot be called + * from an interrupt handler; get the USB thread to do it instead. */ + usb_charger_update(); +#else usb_charging_maxcurrent_change(usb_charging_maxcurrent()); #endif +#endif } /* called by usb_drv_transfer_completed() */ |