Luca
Модератор
Зарегистрирован: 05.10.2012
Сообщений: 1193
Один из разработчиков ядра Linux Сара Шарп из компании Intel посыпает голову пеплом: за восемь лет работы над стеком Linux USB они неоднократно сталкивались с ситуацией, когда USB-устройство внезапно отключалось после выхода из режима ожидания при включенной функции auto-suspend. Все это время проблему списывали на китайских производителей дешевых флэшек, мышек и клавиатур. Обсуждалась даже идея внедрить «черный список» моделей таких устройств прямо в ядро, чтобы для них не активировался режим энергосбережения. От идеи отказались только когда стало ясно, что список будет слишком большим: так много было USB-устройств, которые вели себя некорректно.

Сейчас выяснилось, что сбои не всегда были аппаратными.

В коде хост-контроллера Intel xHCI (drivers/usb/core/hub.c) есть строчка с лаконичным комментарием «TRSMRCY = 10 msec». В соответствии с пунктом 7.1.7.7 спецификаций USB 2.0, система USB System Software должна обеспечить время в 10 миллисекунд для восстановления работы устройства, в течение которых не отправлять на него никаких запросов. В ядро Linux просто вставили таймаут 10 мс. Но специалисты по аппаратному обеспечению сейчас обратили внимание разработчиков ядра Linux, что в таблице 7-14 спецификаций USB 2.0 указано, что таймаут должен быть минимум 10 миллисекунд, а не максимум. Это означает, что устройство может восстанавливаться дольше, чем сейчас установлено в строке TRSMRCY в Linux USB. В таких случаях при попытке обратиться к нему может возникнуть ошибка передачи данных — тогда операционная система считает устройство отключенным.

Тесты показали, что выход устройства из спящего режима никогда не занимает больше 17 мс, но в 8% случаев превышает 10 мс. Для исправления бага достаточно увеличить значение таймаута с 10 до 20 мс, после чего все USB-устройства начнут нормально работать. Сара Шарп уже подготовила патч.

Разработчики говорят, что больше всего от бага страдают пользователи ChromeOS, потому что эта система очень агрессивно использует режим энергосбережения для USB, активируя auto-suspend для всех внутренних USB-устройств, включая WiFi и Bluetooth.
Источник | Теги: USB , Баги  

Комментарии6

0 0

Altair
Пользователь
Зарегистрирован: 24.07.2013
Сообщений: 470
Починили, молодцы.

0 0

MOP3E
Золотой пользователь
Зарегистрирован: 11.01.2013
Сообщений: 1510
за восемь лет работы над стеком Linux USB
Тяжесть ошибки определяется не сложностью её исправления, а тем вредом, который ошибка успела нанести.

В соответствии с пунктом 7.1.7.7 спецификаций USB 2.0, система USB System Software должна обеспечить не менее 10 миллисекунд для восстановления работы устройства, в течение которых не отправлять на него никаких запросов.
Миллионы зорких глаз за восемь лет не смогли правильно прочитать спецификацию USB 2.0! Эттапять!

0 0

logmein
Новичок
Зарегистрирован: 18.02.2013
Сообщений: 709
Сообщение от MOP3E Миллионы зорких глаз за восемь лет не смогли правильно прочитать спецификацию USB 2.0! Эттапять!

Хи-хи-хи!!!
-- Walking In My Shoes

0 0

OldHer
Новичок
Зарегистрирован: 29.05.2013
Сообщений: 13
Вы будете смеяться, но... http://ubuntu-news.ru/comment/15737#comment-15737

0 0

RedEyedMan
Новичок
Зарегистрирован: 05.11.2013
Сообщений: 7
Ведро с этим багом до сих пор висит в портреджах моего конструктора и считается как стабильное.
Ослоёбы-клоуны. Накуй, ухожу на максималочку.

0 0

RedEyedMan
Новичок
Зарегистрирован: 05.11.2013
Сообщений: 7