VolgogradLUG : ГраблеВодство/TandT/usbportdisable

У меня возникла мелкая, но вредная неприятность – видимо, из-за статики испортился контроллер USB в ноутбуке. Это, судя по интернету, довольно частая беда ноутбуков выпуска первых лет тысячелетия. Проявляется беда в том, что при подгрузке модуля ehci_hcd система начинает сыпать в логи сообщениями о потерянных кадрах и прерываниях, потом начинает регулярно замирать, а потом виснет намертво.

Известны и варианты лечения:
1. Перепаять чип на материнской плате
2. Использовать опцию ядра irqpoll (говорят, что acpi=noirq тоже помогает, но у меня ноутбук)
3. Не грузить ehci_hcd и жить только на USB-1.0, который обычно выживает.

У каждого есть недостатки
1. Стоит денег, плюс потенциально кривые руки мастера в недрах ноутбука – дешевле новый купить.
2. Все существенно тормозит.
3. Скорость максимум 1,2 Мб/с

Я выбрал 3 пункт как самый легкий и полностью меня устраивающий – мыши и USB-1 для нормальной работы за глаза.

Однако в последнее время мне часто нужно работать с внешними накопителями. Пришлось купить PCMCIA USB 2.0 контроллер. И сразу вылезла проблема – ehci_hcd при загрузке захватывает все порты, как собственно ноутбука, так и внешние. Это чревато зависанием системы или нестабильной работой.

Придуманный мной метод обхода
1. При загрузке использовать опцию irqpoll
2. В rc.local вставить строку вида echo -n 0000\:00\:1d.7 > /sys/bus/pci/drivers/ehci_hcd/unbind, где 0000\:00:\1d.7 – номер функции PCI того контроллера, который мы хотим отключить от USB 2.0

То есть система грузится c USB-2 на всех портах (irqpoll нужно, чтобы вообще загрузилась), а потом отключает поддержку USB-2 на сгоревшем контроллере (и тем самым проблемы, требующие irqpoll, устраняются).

Достоинства – теперь на портах встроенного USB-контроллера USB-1, а на портах внешнего контроллера – USB-2.
Недостатки – при загрузке системы нужно вытащить все USB-устройства, иначе опять-таки не загрузится. И использование irqpoll

Чего не получилось сделать – не умею отвязать порты на стадии загрузки модуля или формирования систем /sys или /dev. Это позволило бы избавиться от необходимости использовать irqpoll при загрузке ядра и не выдергивать все из USB-портов ноутбука при перезагрузке.