В Toshiba Satellite A100-811 встроен WiFi-адаптер Intel PRO/Wireless 3945ABG. В принципе, поиск драйвера для этого устройства не представляет собой проблемы. Драйвер можно скачать с официального сайта intel. На данный момент доступны 2 разновидности драйвера: 1-я - это ipw3945. Строго говоря, драйвер состоит из трёх компонентов - собственно, модуль ядра ipw3945, бинарный образ микрокода (firmware) - ipw3945-ucode и демон, работающий в пространстве пользователя - ipw3945d (управляет драйвером).
2-я разновидность - экспериментальный драйвер iwlwifi: это собственно модуль ядра и образ firmware (iwlwifi-ucode). Управляющего демона здесь уже нет (к счастью). Этот драйвер также доступен для загрузки с сайта intel. Кстати, несмотря на предупреждение в документации, что драйвер имеет статус экспериментальный, у меня он работает без каких-либо нареканий.
Изначально, чтобы заставить работать адаптер, я использовал 1-й драйвер (ipw3945). Сложностей с его установкой в общем-то нет никаких (версия ядра, с которой согласен собираться модуль - 2.6.13+). Выкачал драйвер: ipw3945-1.2.0, демон ipw3945d-1.7.22 + firmware не-помню-какой-точно-версии (последняя). Собрал модуль (без проблем), положил firmware в /usr/lib/hotplug/firmware. Положил демон в куда-надо (/sbin), добавил в /etc/modprobe.d файлик, чтобы оно пускало демон при загрузке модуля (файл /etc/modprobe.d/ipw3945):
install ipw3945 /sbin/modprobe --ignore-install ipw3945 ; sleep 0.5 ; /sbin/ipw3945d-start
remove ipw3945 /sbin/ipw3945d --kill ; /sbin/modprobe -r --ignore-remove ipw3945-stop
Скрипты взяты из тарбола с демоном - ipw3945d:
ipw3945-start
#!/usr/bin/env /bin/bash
# If no parameter is provided then set user to 'root'
[ "$1" ] && user=$1 || user=root
wait_for_cmd() {
# First, wait for sysfs entry to show up, timing out after 10 seconds:
count=0
while [ ! -e /sys/bus/pci/drivers/ipw3945/*/cmd ]; do
sleep 0.5
count=$((count+1))
((count > 20)) && return 1
done
return 0
}
wait_for_cmd && {
# Set ownership of sysfs entry:
chown $user /sys/bus/pci/drivers/ipw3945/*/cmd
chmod a-w,u+rw /sys/bus/pci/drivers/ipw3945/*/cmd
# Verify/set up PID directory
[ ! -d /var/run/ipw3945d ] && {
mkdir -m 0775 /var/run/ipw3945d
chown $user /var/run/ipw3945d
}
# Launch the regulatory daemon:
/sbin/ipw3945d --quiet --pid-file=/var/run/ipw3945d/ipw3945d.pid
}
ipw3945-stop
#!/usr/bin/env /bin/bash
PIDPATH=/var/run/ipw3945d
# Kill the regulatory daemon if it is running:
/sbin/ipw3945d --isrunning --pid-file=${PIDPATH}/ipw3945d.pid &&
/sbin/ipw3945d --kill --pid-file=${PIDPATH}/ipw3945d.pid
# Remove the PID directory
[ -d ${PIDPATH} ] && rm -rf ${PIDPATH}
К слову, директорию /var/run/ipw3945d, где демон будет держать файл со своим PID, желательно создать вручную.
Сам модуль грузится нормально, тянет за собой ieee80211 (который должен быть включен в ядре - по идее, в документации требуется загрузить более новую версию ieee80211, но я не патчил ядро). Выделяется ирка (IRQ18). В общем, всё как-будто нормально. Но демон грузиться отказывается и вываливает сообщение: Could not find Intel PRO/Wireless connection. Модуль при загрузке рапортовар: Intel PRO/Wireless connection detected, но не показывал при этом Detected geography ... Как результат, нет второго eth-интерфейса и вообще, девайс неработает. Начал грешить на hotplug, а именно, что он не грузит firmware, но, как выяснилось позже, hotplug здесь совершенно ни при чём. В конечном счёте, виновным был признан демон. Согласно всё той же документации, демон сперва деинициализирует драйвер при загрузке, затем инициализирует по-новому и если его что-то не устраивает, просто отваливается. В противном случае, если всё нормально - производит калибровку.
Одним словом, я просто плюнул на всякие дальнейшие разбирательства. Тем более, что инстинктивно мне почему-то очень не нравилась такая модель драйвера, где присутствует управляющий user-space демон.
Итак, заменяем неблагонадёжный ipw3945 + ipw3945d на новый iwlwifi. В документах написано, что этот драйвер экспериментальный и может не работать. Но у меня он во всяком случае заработал. Для работы (и сборки?) понадобится подсистема mac80211 (по докам - это кучка фиксов для уже имеющейся в ванильном ядре подсистемы ieee80211 и "ставится" она без проблем на ядра 2.6.18+). Находим и сливаем по возможности последнюю версию, в моём случае это был тарбол mac80211-4.0.4. Распаковываем, говорим make. В ответ на это нам выплёвывают список изменений, которые будут предприняты в ядре. Затем, если всё удачно (этой приблуде может понадобиться rsync - мне пришлось доустанавливать его, т.к. до этого никакой потребности в нём я не испытывал и, соответственно, не ставил) говорим make patch_kernel. В каталоге, где распакован тарбол получаем несколько новых подкаталогов (некоторые были и до этого, но в них появилось новое содержимое): compatible, modified, origin, patches, stubs. В compatible лежат пропатченные куски кода. Копируем содержание compatible в /lib/modules/`uname -r`/build. Затем натравливаем на /lib/modules/`uname -r`/build скрипт ieee80211_ptr.sh из <unpacked_tarball>/scripts. Если этого не сделать, компилятор при пересборке ядра под конец начнёт вопеть как резанный, что structure has no member 'ieee80211_ptr' (На самом деле, странно, но в пропатченном коде просто не делается правильное приведение к типу). В любом случае, ядро придётся пересобирать полностью, естественно. Перед сборкой в конфиге должны быть определены символы CONFIG_CFG80211=m && CONFIG_MAC80211=m (Через menuconfig CONFIG_MAC80211 это Networking -> Generic IEEE 802.11 Networking Stack (dscape) где находится CONFIG_CFG80211, сейчас точно не вспомню, но при желании можно найти).
Если всё прошло успешно, ставим модули, ядро. Перезагружаемся. Тащим тарбол с интеловским firmware: iwlwifi-ucode-2.14.1 или выше. Кладём его в /usr/lib/hotplug/firmware (или /lib/firmware, в зависимости от того, где Ваш hotplug хотел бы всё это хозяйство видеть).
Тащим тарбол с самим драйвером: wlwifi-0.0.11 или выше. Распаковываем, говорим make, make install. После того, как модуль собран и установлен, проверяем:
# ./load debug=0x43fff
<SKIPPED>
выплёвывает кучу всякой полезной и не очень информации, главнй смысл в фразах, что соединение найдено, информация о каналах и тому подобное
</SKIPPED>
# iwconfig
wmaster0 IEEE 802.11a Channel:0
RTS thr:off Fragment thr=2346 B
wlan0 IEEE 802.11a ESSID:""
Mode:Managed Channel:0 Access Point: 00:00:00:00:00:00
RTS thr:off Fragment thr=2346 B
Encryption key:off
Link Quality:0 Signal level:0 Noise level:0
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
Что и требовалось доказать. Демон здесь не нужен, поэтому, установка практически завершена.
PS: последовательность моих действий несколько отличается от той, что описана в документации. Например, мне не удалось запустить даже make menuconfig после пропатчивания ядра на предмет mac80211, т.к. make ругался на отсутствие конфига в net/mac80211 (самого каталога тоже не было). Поэтому я просто порывшись определил, где и что находится и скопировал содержимое compatible /lib/modules/`uname -r`/build. Про то, что в пропатченных сырцах компилятор начнёт жаловаться на неприведение к нужному типу, тоже сказано ничего не было (по поводу ieee80211_ptr.sh) Ещё один момент: утилиты выдают предупреждения по поводу стека wireless-расширений:
devel:/home/f0x/tmp# iwconfig wlan0
Warning: Driver for device wlan0 has been compiled with version 21
of Wireless Extension, while this program supports up to version 17.
Some things may be broken...
Но у меня пока проблем не наблюдалось никаких. Возможно, этот чисто внешний дефект устраняется апгрейдом пакета утилит, но меня эти сообщение особо не смущают, так что я ничего не апгрейдил.
2 comments:
привет
У меня похожая проблема на Toshiba U200 с ipw3945d. Комбинированием версий драйвера, демона и подсистемы wifi я таки добился работы его на ноуте, но не могу сказать чтобы она меня удовлетворяла. При первом старте демона интерфейс поднимается и соединяется в сетью. Но при рестарте демона интерфейс то соединяется с сетью то отваливается, показывая уровень сигнала 0. Может меня бы и не воловал рестарт этой службы, но после хибернейта демон не поднимает вайфай корректно
Вячеслав Худяков, slavochka@gmail.com
Странно. А какие симптомы помимо самого отваливания? У меня теперь всё работает на ура и при просыпании (s2ram, s2disk). В принципе, можно попробовать перейти на iwlwifi - там драйвер "более монолитный" и не требует наличия демона. Хотя, желательно сначала определиться, кто виноват, а потом уж принудительно лечить.
Post a Comment