Отладка USB selective suspend: случайные отключения, сбои sleep/resume и пропавшие передачи
Как USB selective suspend может вызывать случайные отключения устройств, пропавшие передачи, сбои resume и баги простоя, и как это диагностировать по USB-доказательствам.
USB selective suspend должен экономить энергию. Когда он работает, idle-устройства входят в low-power и возобновляют работу, когда нужно. Когда он ломается, пользователи видят случайные отключения, пропавшие данные, зависшие камеры, serial-порты, которые не отвечают, HID-устройства, теряющие ввод, или устройства, исчезающие после сна. Запросы вроде «USB selective suspend random disconnect», «USB device stops working after idle», «USB resume failure», «disable USB selective suspend» обычно идут от людей, которые уже попробовали кабели и драйверы.
Отключение selective suspend может быть обходным решением, но это не диагноз. Настоящий вопрос — кто сбоит: устройство, драйвер, концентратор, хост-контроллер или приложение — во время suspend/resume или восстановления после простоя.
Bus Scope помогает, потому что у сбоя есть таймлайн. Нужно знать, какой трафик шёл до простоя, приостановил ли хост путь, какой запрос возобновил устройство и какая передача упала после resume.
Что делает selective suspend
Selective suspend позволяет ОС приостановить отдельное USB-устройство или интерфейс, пока остальная система остаётся активной. Это не то же самое, что полный сон системы. USB-устройство может быть уснуто, потому что оно выглядит idle, даже когда компьютер в целом бодрствует.
Это касается:
- USB serial-адаптеров
- HID-устройств
- USB-камер
- аудиоинтерфейсов
- отладочных пробников
- токенов безопасности
- кастомных вендорных устройств
- bus-powered-датчиков
Если прошивка устройства не обрабатывает suspend/resume корректно, первая передача после простоя может упасть.
Типичные симптомы
Проблемы selective suspend часто выглядят как:
- Устройство работает после подключения, но падает через несколько минут.
- Первая команда после простоя тайм-аутит.
- Чтение из serial блокируется навсегда после неактивности.
- Превью камеры зависает после блокировки экрана.
- HID-репорты останавливаются до переподключения.
- Устройство переподключается с новым адресом.
- Приложение говорит, что устройство отключено, хотя физически оно на месте.
- Windows или Linux логируют reset или сообщения, связанные с resume.
Ключевой паттерн — время. Если сбой следует за простоями, sleep/resume, выключением дисплея или сменами power-state ноутбука, в расследование должен войти power management.
Сбой suspend vs сбой resume
Две разные проблемы:
- Сбой suspend: устройство или драйвер не могут корректно войти в low power.
- Сбой resume: устройство вошло в low power, но не возвращается корректно.
С точки зрения пользователя оба выглядят как «устройство отключено». USB-трасса может разделить их, показав, чисто ли остановился трафик и упал ли следующий запрос после простоя.
Если устройство исчезает только когда приложение посылает команду после простоя — подозрение на resume или восстановление состояния в прошивке. Если устройство сбрасывается во время простоя без запроса от приложения — подозрение на хост power management, поведение концентратора или watchdog прошивки.
Первая передача после простоя
Первая передача после простоя часто самое важное доказательство. Это может быть:
- Управляющий запрос.
- bulk-чтение или запись.
- interrupt IN-поллинг.
- Класс-управляющий запрос.
- Вендорная команда.
- Запрос перезапуска потока.
Если первая передача тайм-аутит, ставит stall или вызывает reset, скорее всего устройство не возобновилось в ожидаемое состояние. Решение может быть в обработке resume прошивкой, политике питания драйвера, retry-поведении приложения или отключении selective suspend для этого устройства.
Runtime power management в Linux
В Linux есть USB runtime power management. Устройства могут автоприостанавливаться после idle-задержки. Поведение устройства может отличаться в зависимости от драйвера, версии ядра, настроек autosuspend и того, держит ли приложение устройство открытым.
Для расследований в Linux захватите трафик и сопоставьте с системными логами. Если устройство возобновляется и тут же сбрасывается, трасса шины полезнее, чем общий «I/O error» из приложения.
Selective suspend в Windows
В Windows поведение selective suspend зависит от плана питания, поддержки драйвера, настроек USB-концентратора и класса устройства. Пользователи часто отключают «USB selective suspend setting» в опциях питания. Это может быть практическим обходным решением, но профессиональный диагноз всё равно должен объяснить, упало ли устройство во время восстановления после простоя.
Проблемы USB в Windows также могут быть затронуты Modern Standby, поведением дока ноутбука, концентраторами и драйверами хост-контроллера. Устройство может работать на десктопе, но падать на доке ноутбука из-за разного поведения suspend/resume.
Стратегия захвата
Чтобы захватить баг selective suspend:
- Начинайте захват, пока устройство работает.
- Выполните известную успешную операцию.
- Оставьте устройство в idle достаточно долго, чтобы триггернуть проблему.
- Выполните операцию, которая обычно падает.
- Продолжайте захват через тайм-аут, reset или переподключение.
- Сохраните полное временное окно.
Не начинайте захват, когда устройство уже упало. Нужен переход от активности к простою к сбою.
Что искать
В трассе изучите:
- Последнюю передачу до простоя.
- Временной зазор до сбоя.
- Первую передачу после простоя.
- Тайм-аут, stall, reset или отключение.
- Пере-нумерация после сбоя.
- Изменение адреса устройства.
- Класс-управляющий запрос после resume.
- Восстановление halt конечной точки.
- Смены alternate setting для потоковых устройств.
Тайминг здесь — не шум. Тайминг — это доказательство.
Чек-лист отладки
Действуйте в таком порядке:
- Подтвердите, коррелируют ли сбои с временем простоя.
- Проверьте на питании от сети и от батареи.
- Проверьте прямой порт против концентратора или дока.
- Захватите до простоя и через сбой.
- Определите первую сбойную передачу после простоя.
- Проверьте, сбрасывается ли устройство или падает только одна передача.
- Сравните с отключённым selective suspend.
- Сравните другую ОС или хост-контроллер.
- Проверьте обработку resume в прошивке.
- Проверьте политику питания драйвера и retry-поведение приложения.
Итоговый диагноз
Проблемы USB selective suspend плохо решаются догадками. Отключение power management может уменьшить симптомы, но реальный инженерный ответ идёт из USB-таймлайна: активный трафик, idle-зазор, попытка resume, сбой передачи, reset или восстановление.
Bus Scope помогает сохранить и изучить эти доказательства, чтобы «случайное отключение USB» можно было диагностировать как конкретный сбой suspend/resume, драйвера, прошивки, концентратора или power management.