Сара Шарп, одна из разработчиков ядра для Линукс, посыпает голову пеплом. За все восемь лет, когда она и ее коллеги сталкивались с самыми разными проблемными ситуациями, но чаще всего устройства USB почему-то всегда выключались постоянно после того, как выходишь из режима ожидания и когда включена функция auto-suspend. Тогда эту проблему списали на китайских производителей, которые делают дешевые флешки, клавиатуру и мышки. Даже серьезно обсуждали идею внедрить в ядро черный список моделей этих устройств, чтобы именно для них не происходила активация режима энергосбережения. Но от идеи пришлось отказаться, поскольку список был бы просто огромен.
Но теперь стало известно, что сбои были аппаратными далеко не всегда.
Когда проходил хост-контроллер Интел, то там есть строчка, в котором содержится весьма лаконичный комментарий TRSMRCY = 10 msec. Согласно пункту 7.1.7.7. система USB System Software непременно должна обеспечивать восстановление работы устройства за десять миллисекунд. В течение этого времени никаких запросов отправлять нельзя. Таким образом, ядро Линукс просто-напросто вставили тайм-аут на этот промежуток времени. Однако специалисты, которые занимались программным обеспечением, наверное, не поставили в известность разработчиков ядра о том, что перерыв должен быть минимум десять миллисекунд, а никак не максимум. Другими словами, устройство может потребовать больше времени на установку, чем установлено сейчас в строчке TRSMRCY в Linux USB.
Тесты показали, что устройства из спящего режима не выходят более семнадцати милисекунд, что в восьми процентах превышает десять. И чтобы исправить баг, достаточно будет увеличить тайм-аут с десяти до двадцати милисекунд, и проблема может быть решана.
Ссылки по теме