Управляем чем угодно откуда угодно

Глюки Wi-Fi

Виртурилка, 3G/4G, WiFi, моторчики, датчики, GPS и прочее - питание, драйвера, совместимость и т.д.

Глюки Wi-Fi

Сообщение Gol » 17 фев 2014, 08:26

Очень много нервов попортил наш злополучный мезонинчик с вайфаем. Для тех кто не в курсе - мезонинами у нас называются мелкие платки, надеваемые на беленькие колодки на лицевой стороне Виртурилки. Т.е. это не "шылд"... Знаю что жи, ши - пиши через "И", но по ардуинской традиции шилд пишется как "шылд" :-) Так вот, это не шылд, не второй этаж, а именно мезонин, эдакий промежуточный этаж.

Этот самый вайфай, несмотря на простоту схемы, оказался самым капризным узлом. Сначала оказалось что кетайцы намудрили с собссно wlan-модулем WM-G-MR-09, в результате чего много плат просто не определяются Виртурилкой. Симптомы простые - при загрузке железки на этапе подключения драйвера в консоли появляются сообщения

Код: Выделить всё
libertas_sdio: Libertas SDIO driver
libertas_sdio: Copyright Pierre Ossman


и всё, далее идут сообщения остальных драйверов. Это означает что драйвер запустился но не смог найти вайфай.

Ещё возможет вариант - в строке параметров ядра uEnv.txt (при загрузке с microSD карты) не указана инициализация вайфая (т.е. нет параметра wifi=on). Но это ошибкой не считаем, так что в этой заметке не рассматриваю.

В общем, если мезонин вайфая подключён, его инициализация включена в uEnv.txt, а в консоли на этапе загрузки драйвера только эти две строчки - это однозначно означает что вайфай дохлый. Что именно дохлое (сам чип или обвязка) - пока не искали, просто собираем такие платы и откладываем их в специальную коробочку для последующего изучения.

При нормальном функционировании должны появиться примерно такие сообщения в консоли

Код: Выделить всё
libertas_sdio: Libertas SDIO driver
libertas_sdio: Copyright Pierre Ossman
libertas_sdio mmc0:0001:1 (unregistered net_device): 00:24:7e:b7:49:f0, fw 9.70.20p0, cap 0x00000303
libertas_sdio mmc0:0001:1 wlan0: Marvell WLAN 802.11 adapter
cfg80211: Calling CRDA for country: JP
cfg80211: Regulatory domain changed to country: JP


Т.е. драйвер загрузился, обнаружил девайс (mmc0), загрузил фирмварь, определил параметры и т.д. Это означает что с вайфаем всё ок.

Но далее проблемы продолжались. Проблемы были двух типов - при действии и при бездействии.

При бездействии
Если к вайфай интерфейсу долгое (около минуты) время не было никакого обращения - чип вайфая отправлялся в спячку. Причины понятны - этот чип был сделан для мобильных устройств, в которых важна экономия энергии. Однако в драйвере процесс отправки в спячку с какого-то момента был поломан, в итоге этот функционал перестал толком работать. Чип отправлялся в спячку, а выйти из неё мог только при обращении к интерфейсу ИЗНУТРИ, т.е. с самой виртурилки. А при обращении снаружи, с любого другого девайса - вайфай не просыпался, хотя должен. Именно по этой причине в прошивку был добавлен костыль в виде скрипта dont_sleep.sh, который только и делает что раз в минуту пингует дефолтный роутер.

При действии
Если через интерфейс вайфая шёл большой трафик, особенно это заметно было при передаче по TCP. При приёме проявлялось намного реже. При использовании UDP - ещё реже. Это доставляло больше всего геморроя и что делать с этим долгое время было непонятно. Однозначно только что это проблема не железа а драйвера (ну или фирмвари).

Долгое время бились над решением второй проблемы, были перепробованы альтернативные драйвера (libertas_tf), но толку было мало. Буквально вчера наш аппаратчик Саня выдвинул идею что тут не только драйвер виноват, но и настройки ядра в целом. Были проштудированы мануалы
https://www.kernel.org/doc/Documentatio ... /NO_HZ.txt
http://man7.org/linux/man-pages/man7/time.7.html
из которых поняли что параметр HZ в конфиге ядра это коварный типан. Значение этого самого HZ было изменено на 1000 (раньше был 100), параметры NO_HZ и HIGH_RES_TIMERS были вообще отключены. В драйвере libertas было отключено дёргание интерфейса.

Попробовали эти изменения в действии, при трансляции RTMP (раньше при этом вифи умирал почти сразу, а рекорд был 14 минут). Два часа, полёт нормальный :-) А логика работы оказалась такая - при ухудшении связи увеличивалось время подтверждения отправки пакета (ибо TCP), в результате чего срабатывал таймер, который зависел как раз от параметра HZ. В итоге при таймауте в 500мс вайфай отправлялся в даун. А что такое 500мс, это тьфу. После увеличения HZ в десять раз таймаут вырос до пяти секунд и стали видны "провисания" коннектов, из-за которых раньше вайфай и отрубался. То же самое происходило при резкой загрузке процессора, драйвер вайфая, вместо того чтоб чуток потормозить, сразу резетил чип.

Короче, причину проблемы нашли, пути решения понятны (пока понятны, если новые нюансы не всплывут), испытания ещё проводятся. Это же должно повлиять и на уход вайфая в спячку, так что есть надежда что и её победили.

Выкладывать пофиксенную прошивку буду только когда убежусь что всё ок.

UPD> с драйвером libertas_tf, похоже, ситуация аналогичная. Его тоже постараюсь починить, ибо он использует совсем другую фирмварь, где есть mesh сети (уже даже опробовал, работает меш) и прочие вкусняшки. А в фирмвари, которая используется обычным драйвером, такого функционала нет (хотя странно, почему так).
Аватара пользователя
Gol
 
Сообщения: 507
Зарегистрирован: 17 фев 2012, 01:44
Откуда: Тула-Свободный-Щёкино-Тула-Москва

Re: Глюки Wi-Fi

Сообщение realizator » 17 фев 2014, 09:44

Серега, ты еще не указал, что при работе в режиме AP (точка доступа) таких проблем не наблюдалось - это подтвердило гипотезу о том, что проблема в драйвере а не в железе.
Аватара пользователя
realizator
virt2real team
 
Сообщения: 652
Зарегистрирован: 17 фев 2012, 23:18

Re: Глюки Wi-Fi

Сообщение bigbn » 23 апр 2014, 18:51

Код: Выделить всё
[  682.119752] libertas_sdio mmc1:0001:1 wlan0: Timeout submitting command 0x0024
[  682.129629] libertas_sdio mmc1:0001:1 wlan0: PREP_CMD: command 0x0024 failed: -110
[  682.143194] libertas_sdio: error -110 sending packet to firmware
[  687.152960] libertas_sdio mmc1:0001:1 wlan0: TX lockup detected
[  687.160822] libertas_sdio: error -110 sending packet to firmware
[  690.160992] libertas_sdio mmc1:0001:1 wlan0: command 0x0024 timed out
[  690.167807] libertas_sdio mmc1:0001:1 wlan0: Timeout submitting command 0x0024
[  690.177663] libertas_sdio mmc1:0001:1 wlan0: PREP_CMD: command 0x0024 failed: -110
[  690.187201] libertas_sdio: error -110 sending packet to firmware
[  693.192943] libertas_sdio mmc1:0001:1 wlan0: command 0x0010 timed out
[  693.199818] libertas_sdio mmc1:0001:1 wlan0: Timeout submitting command 0x0010

rmmod libertas_sdio
modprobe libertas_sdio
Код: Выделить всё
[  730.673289] libertas_sdio: Libertas SDIO driver
[  730.679685] libertas_sdio: Copyright Pierre Ossman
[  730.691289] libertas_sdio: probe of mmc1:0001:1 failed with error -110
[  791.602260] libertas_sdio: Libertas SDIO driver
[  791.608664] libertas_sdio: Copyright Pierre Ossman
[  791.615577] libertas_sdio: probe of mmc1:0001:1 failed with error -110

Это при подключенном мезонине, после 2х минут работы, что это значит? Все, конец?
bigbn
 
Сообщения: 24
Зарегистрирован: 05 окт 2013, 21:33

Re: Глюки Wi-Fi

Сообщение bigbn » 23 апр 2014, 19:06

Эх, печалька, похоже и вправду все. У меня 2 виртурилки и мезонина соответсвенно два, на той-же виртурилке второй мезонин работает без сбоев, а с этим уже что-то не так. Причем, какое-то время он работал прекрасно. Какое-то время это до подзарядки аккумуляторов виртурилки. Стоят 2 банки литий-онные банки 3.7в, походу они после подзарядки выдали лишенего и подпортили мезонин.
bigbn
 
Сообщения: 24
Зарегистрирован: 05 окт 2013, 21:33

Re: Глюки Wi-Fi

Сообщение shebeko » 27 май 2014, 20:47

Похоже деградирует WiFi :(
У меня есть предположение, что это из-за катушки. Может просто греется сильно.
Пару месяцев работал без сбоев.

Потом во время работы скрипта повис. Сверху был моторшилд.

Сейчас вай-фай работает минут 5, потом затыкается.
Из процессов только top. Т.е. Wifi не в idle но и не с супер нагрузкой.
Тяжело сказать, работает ли при этом виртурилка.

Катушка питания после зависания начинает ощутимо греться.

Ещё подскажите как подключить разъём ethernet на моторшилд.
Из ethernet торчит один шнурок на несколько пинов и несколько шнурков по одному пину.
Я так понимаю надо шнурок на несколько пинов подключать к J2 моторшилда а остальные можно оставить болтаться?
Вопрос какой стороной подключать его к J2?
shebeko
 
Сообщения: 13
Зарегистрирован: 18 апр 2014, 17:41

Re: Глюки Wi-Fi

Сообщение eagafonov » 12 июн 2014, 00:24

похоже, один из моих модулей тоже йок... Работает немного, потом в UART-консоле сыплется пачкой

Код: Выделить всё
[ 7575.904437] libertas_sdio mmc1:0001:1 wlan0: TX lockup detected
[ 7575.912211] libertas_sdio: error -110 sending packet to firmware
Аватара пользователя
eagafonov
 
Сообщения: 175
Зарегистрирован: 18 сен 2013, 23:39
Откуда: Нижненовгородск


Вернуться в Железо - заставляем работать

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron