| Предыдущий | Следующий |
| kIOUSBDevicePortWasNotSuspended | kIOUSBDeviceNotHighSpeed |
kIOUSBClearPipeStallNotRecursive
Восстановление вызвано из небезопасного пути
kIOUSBClearPipeStallNotRecursive — ошибка жизненного цикла IOUSBFamily: тот же канал уже обрабатывается функцией ClearPipeStall , когда другой вызов пытается войти в этот путь восстановления. Это не новый аппаратный отказ. Ошибка находится в последовательности действий вызывающей стороны, часто когда обработчик завершения пытается немедленно очистить stall, пока предыдущее восстановление всё ещё владеет каналом.
Восстановление остановленного канала может вернуть незавершённые операции их обработчикам завершения. Поэтому повторный вход особенно опасен: обратный вызов может запустить второй запрос восстановления до завершения изменения состояния канала первым. Повторение вызова в цикле не делает восстановление безопасным и способно скрыть исходную ошибку порядка.
Что сохранить и изменить
- Запишите адрес конечной точки, направление передачи, идентичность канала, стек обратного вызова и операцию, первой обнаружившую остановленное состояние.
- Сериализуйте восстановление для каждого канала. Используйте одно явное состояние — active, draining, clearing или ready — вместо разрешения каждому обработчику завершения запускать сброс.
- Вынесите восстановление из callback, обнаружившего ошибку. Завершите или учтите незавершённые запросы до следующего изменения состояния канала.
- Проверьте протокол устройства, чтобы решить, достаточно ли очистки на стороне контроллера или устройству также нужен стандартный запрос снятия halt конечной точки.
Ссылки
- Apple: коды ошибок IOUSBFamily
- Apple: обработка stall, halt и повторная синхронизация data toggle
- Исходный код IOUSBFamily: обработка stall в IOUSBPipe
Нужно найти другой код? Найти другой код состояния или ошибки.
