Если вдруг кто пропустил, у меня вчера было День Рождения. Если кто забыл или не знал, можете поздравлять. :)
Хотя чем может заниматься такой красноглазый как я, в свой день рождения? Правильно! Драйверами в ядре. :) Поскольку нагрузка на новом месте пока упала и появилось достаточно много свободного времени, решил заняться парочкой багов на своём рабочем лаптопе дабы не скучать. Первая проблема — не работали клавиши для отключения Wi-Fi и изменения яркости подсветки экрана. Заняться для начала решил именно второй проблемой, поскольку я что-то про эту тему уже знал и откуда копать понимание имелось.
Про некоторые особенности работы ACPI, связанные с подсветкой в Linux даже писал уже, но тут проблема оказалась зарыта гораздо глубже. После изучения весьма добротно написанной вики и некоторого копания в Интернете, решение нашлось достаточно быстро. Им оказалась опция ядра "acpi_osi=" без каких-либо параметров. Если почитать этот занимательный файл, то станет ясно, что мы в данном случае принудительно сказали ядру какую таблицу ACPI мы будет подсовывать BIOS/EFI для того, чтобы управлять питанием. Связано это с тем, что стандарты ACPI весьма нечёткие и ядру нередко приходится заниматься угадыванием (помимо этого, на данные стандарты очень часто забивают, в угоду Windows), каким образом он будет управлять питанием устройств. В данном случае мы попросту отключили это угадывание и берём некие условно-стандартные значения. В результате, в лаптопе не только заработали клавиши управления подсветкой экрана, но и стал корректно включаться-отключаться Wi-Fi по нажатию клавиши.
Но это только одна проблема. Вторая проблема заключалась в самой карте Wi-Fi. В лаптопе используется MTK7630E. В mainline этого драйвера нет. Есть лишь код не очень хорошего качества, выложенный на github. Данный драйвер изначально написан для LTS версии ядра 3.14, но без проблем собирается и на более новых. В частности, версии 4.1.6. И вот с ним выяснилась проблема. Если включить в настройках NetworkManager автоматическое подключение к сети, ОС наглухо виснет почти сразу после начала сеанса. Не спасает даже Magic SysRQ. Если не ставить — может совершенно непредсказуемо проработать час, два или десять минут. В качестве ближайшего решения — закомментировать или выкинуть из драйвера функцию Set_BtDump_Proc(), в файле rt2x00/rt2800lib.c. Так как она, похоже, на новых версиях ядра пытается вызывать метод, которого уже не существует. Да и сама функция на самом деле чисто отладочная и, в общем-то, ненужная в обычной жизни. Но это планирую протестировать позднее, пока не изучу работу данного драйвера на ядре 3.14. Поскольку на нём всё работает хорошо (вроде бы). О результатах попозже расскажу.
Примерно так и развлекаюсь, да.
Хотя чем может заниматься такой красноглазый как я, в свой день рождения? Правильно! Драйверами в ядре. :) Поскольку нагрузка на новом месте пока упала и появилось достаточно много свободного времени, решил заняться парочкой багов на своём рабочем лаптопе дабы не скучать. Первая проблема — не работали клавиши для отключения Wi-Fi и изменения яркости подсветки экрана. Заняться для начала решил именно второй проблемой, поскольку я что-то про эту тему уже знал и откуда копать понимание имелось.
Про некоторые особенности работы ACPI, связанные с подсветкой в Linux даже писал уже, но тут проблема оказалась зарыта гораздо глубже. После изучения весьма добротно написанной вики и некоторого копания в Интернете, решение нашлось достаточно быстро. Им оказалась опция ядра "acpi_osi=" без каких-либо параметров. Если почитать этот занимательный файл, то станет ясно, что мы в данном случае принудительно сказали ядру какую таблицу ACPI мы будет подсовывать BIOS/EFI для того, чтобы управлять питанием. Связано это с тем, что стандарты ACPI весьма нечёткие и ядру нередко приходится заниматься угадыванием (помимо этого, на данные стандарты очень часто забивают, в угоду Windows), каким образом он будет управлять питанием устройств. В данном случае мы попросту отключили это угадывание и берём некие условно-стандартные значения. В результате, в лаптопе не только заработали клавиши управления подсветкой экрана, но и стал корректно включаться-отключаться Wi-Fi по нажатию клавиши.
Но это только одна проблема. Вторая проблема заключалась в самой карте Wi-Fi. В лаптопе используется MTK7630E. В mainline этого драйвера нет. Есть лишь код не очень хорошего качества, выложенный на github. Данный драйвер изначально написан для LTS версии ядра 3.14, но без проблем собирается и на более новых. В частности, версии 4.1.6. И вот с ним выяснилась проблема. Если включить в настройках NetworkManager автоматическое подключение к сети, ОС наглухо виснет почти сразу после начала сеанса. Не спасает даже Magic SysRQ. Если не ставить — может совершенно непредсказуемо проработать час, два или десять минут. В качестве ближайшего решения — закомментировать или выкинуть из драйвера функцию Set_BtDump_Proc(), в файле rt2x00/rt2800lib.c. Так как она, похоже, на новых версиях ядра пытается вызывать метод, которого уже не существует. Да и сама функция на самом деле чисто отладочная и, в общем-то, ненужная в обычной жизни. Но это планирую протестировать позднее, пока не изучу работу данного драйвера на ядре 3.14. Поскольку на нём всё работает хорошо (вроде бы). О результатах попозже расскажу.
Примерно так и развлекаюсь, да.
Комментариев нет:
Отправить комментарий