WiFi: `IW Reg Set US` не имеет никакого эффекта

13

В процессе диагностики выпадения WiFi я обнаружил, что для регулирующего домена на моем WiFi-интерфейсе установлено значение "world" (00), и изменение его в моем регионе (США) должно помочь решить эту проблему. Однако каждая попытка сделать это была проигнорирована.

Бег iw reg set USне имеет очевидного эффекта:

$ iw reg get
country 00: DFS-UNSET
    (2402 - 2472 @ 40), (6, 20), (N/A)
    (2457 - 2482 @ 40), (6, 20), (N/A), PASSIVE-SCAN
    (2474 - 2494 @ 20), (6, 20), (N/A), NO-OFDM, PASSIVE-SCAN
    (5170 - 5250 @ 160), (6, 20), (N/A), PASSIVE-SCAN
    (5250 - 5330 @ 160), (6, 20), (0 ms), DFS, PASSIVE-SCAN
    (5490 - 5730 @ 160), (6, 20), (0 ms), DFS, PASSIVE-SCAN
    (5735 - 5835 @ 80), (6, 20), (N/A), PASSIVE-SCAN
    (57240 - 63720 @ 2160), (N/A, 0), (N/A)
$ sudo iw reg set US
$ iw reg get
country 00: DFS-UNSET
    (2402 - 2472 @ 40), (6, 20), (N/A)
    (2457 - 2482 @ 40), (6, 20), (N/A), PASSIVE-SCAN
    (2474 - 2494 @ 20), (6, 20), (N/A), NO-OFDM, PASSIVE-SCAN
    (5170 - 5250 @ 160), (6, 20), (N/A), PASSIVE-SCAN
    (5250 - 5330 @ 160), (6, 20), (0 ms), DFS, PASSIVE-SCAN
    (5490 - 5730 @ 160), (6, 20), (0 ms), DFS, PASSIVE-SCAN
    (5735 - 5835 @ 80), (6, 20), (N/A), PASSIVE-SCAN
    (57240 - 63720 @ 2160), (N/A, 0), (N/A)

После обширного поиска в Google по этому вопросу, кажется, что то, что должно произойти, iw reg setзаставляет ядро ​​выдавать событие udev, которое вызывает crdaвыполнение и выкашливает соответствующую нормативную информацию. Однако, насколько я могу судить udevadm, это событие никогда не генерируется. Отсутствие этого события подтверждается тем, что не работает следующий ключ:

$ sudo iw reg set US; sudo COUNTRY=US crda
Failed to set regulatory domain: -7

Сообщение об ошибке от crda. Ядро будет принимать нормативные изменения WiFi только в том случае, если оно отправило событие / запрос udev для них и ожидает ответа. Поскольку происходит crdaсбой, ядро ​​явно не ожидало этого, предполагая, что событие udev не было отправлено.

Интерфейс WiFi - это Intel 7265D; чей драйвер ядра iwlmvm. Я crdaи wireless-regdbустановил, и /etc/default/crdaсодержит REGDOMAIN=US. Удаление и перезагрузка iwlmvmдрайвера не имеет никакого эффекта.

Любые предложения, что еще проверить?

ewhac
источник
1
Вы проверили журнал ядра, чтобы увидеть, были ли внесены какие-либо изменения? Я получаю тот же вывод, что и вы на stdout, но в моих журналах говорится, что регулирующий домен действительно обновлен.
saiarcot895
Я ничего не могу найти в dmesgвыходных данных или каких-либо журналах, чтобы предположить, что была предпринята какая-либо попытка изменить регуляторный домен. Единственное сообщение об этом появляется при первой загрузке драйвера, сообщая: «
Основной
1
Ваше решение звучит хорошо. Пожалуйста, переместите его к ответу, а не к редактированию вопроса. Тогда вы тоже примете свой ответ.
Роайма

Ответы:

11

Я попытался вернуться к этой проблеме вчера, и все еще есть проблема даже с ядром 4.6.3. Установка последней версии прошивки вручную также не помогла. Тем не менее, попытка iw reg set USвторого ноутбука с тем же ядром работала нормально.

Проблемной машиной является Thinkpad X1 Carbon (Gen.3), в котором установлена ​​карта Intel 7265D WiFi; рабочая машина - Thinkpad T440p с Intel 7260. Поэтому я делаю вывод, что в драйвере или прошивке 7265D есть ошибка.

Временное решение

Я также обнаружил обходной путь для 7265D. Имейте в виду, что это обходной путь и может вызвать конфликты, если / когда будет выпущено реальное исправление:

  • Удалите все драйверы ядра WiFi и зависимые модули:
    sudo modprobe -r iwlmvm
  • Установите cfg80211модуль ядра, используя параметр ядра для принудительной настройки домена регулирования (в данном случае, «US»):
    sudo modprobe cfg80211 ieee80211_regdom=US
  • Переустановите драйверы ядра WiFi:
    sudo modprobe iwlmvm

Теперь вы должны увидеть интерфейс WiFi, настроенный для регулирующего домена США (или любого другого):

$ iw reg get
country US: DFS-FCC
    (2402 - 2472 @ 40), (N/A, 30), (N/A)
    (5170 - 5250 @ 80), (N/A, 17), (N/A)
    (5250 - 5330 @ 80), (N/A, 23), (0 ms), DFS
    (5490 - 5730 @ 160), (N/A, 23), (0 ms), DFS
    (5735 - 5835 @ 80), (N/A, 30), (N/A)
    (57240 - 63720 @ 2160), (N/A, 40), (N/A)

Обновление 2016.11.17: исправлено в ядре серии 4.8

Сегодня я впервые проверил эту проблему после того, как пару недель назад обновил ядро ​​4.8.x, и обнаружил, что интерфейс Wi-Fi теперь, похоже, правильно принимает регулирующий домен. Это произошло в версии ядра 4.8.5 или до нее.

$ iw reg get
global
country 00: DFS-UNSET
    (2402 - 2472 @ 40), (6, 20), (N/A)
    (2457 - 2482 @ 20), (6, 20), (N/A), AUTO-BW, PASSIVE-SCAN
    (2474 - 2494 @ 20), (6, 20), (N/A), NO-OFDM, PASSIVE-SCAN
    (5170 - 5250 @ 80), (6, 20), (N/A), AUTO-BW, PASSIVE-SCAN
    (5250 - 5330 @ 80), (6, 20), (0 ms), DFS, AUTO-BW, PASSIVE-SCAN
    (5490 - 5730 @ 160), (6, 20), (0 ms), DFS, PASSIVE-SCAN
    (5735 - 5835 @ 80), (6, 20), (N/A), PASSIVE-SCAN
    (57240 - 63720 @ 2160), (N/A, 0), (N/A)

phy#0 (self-managed)
country US: DFS-UNSET
    (2402 - 2482 @ 40), (6, 22), (N/A), AUTO-BW, NO-HT40PLUS, NO-80MHZ, NO-160MHZ
    (5170 - 5250 @ 80), (6, 22), (N/A), NO-OUTDOOR, AUTO-BW, IR-CONCURRENT, NO-HT40PLUS, NO-160MHZ, PASSIVE-SCAN
    (5250 - 5330 @ 80), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-160MHZ, PASSIVE-SCAN
    (5490 - 5730 @ 80), (6, 22), (0 ms), DFS, AUTO-BW, NO-HT40PLUS, NO-160MHZ, PASSIVE-SCAN
    (5735 - 5815 @ 80), (6, 22), (N/A), AUTO-BW, IR-CONCURRENT, NO-HT40PLUS, NO-160MHZ, PASSIVE-SCAN
    (5815 - 5835 @ 20), (6, 22), (N/A), AUTO-BW, IR-CONCURRENT, NO-HT40MINUS, NO-HT40PLUS, NO-80MHZ, NO-160MHZ, PASSIVE-SCAN
ewhac
источник
Это не сработало для моего Intel Wireless 7265D, в Интернете есть некоторые темы, в которых упоминается, что настройка 00-World жестко запрограммирована во встроенное ПО или аппаратное обеспечение заблокировано.
CMCDragonkai
6

После некоторого исследования кода я выяснил, в чем проблема:

Устройство Intel WiFi выглядит как самоуправляемое устройство, поэтому набор iw reg к нему не применяется.

Все, что вам нужно сделать, это установить iwlwifiпараметр lar_disable=1:

  1. Либо вручную: modprobe -r iwlwifi & modprobe iwlwifi lar_disable=1
  2. Автоматически: echo "options iwlwifi lar_disable=1" >/etc/modprobe.d/iwlwifi.conf
Филипп
источник
Спасибо; Я попробую это. Кстати, что такое "LAR"? Это то, что уклонение от радиолокатора для диапазона 5 ГГц?
Ewhac
Файл /etc/modprobe.d/iwlwifi.confможет существовать, поэтому его лучше добавить. Или используйте >>вместо >или echo "options iwlwifi lar_disable=1" | sudo tee -a /etc/modprobe.d/iwlwifi.conf(получает права root при необходимости).
Лукас
1
@ewhac unix.stackexchange.com/a/385590/3285
Эван Кэрролл,
-2
 #!/bin/bash

echo "hello root"
git clone git://git.kernel.org/pub/scm/linux/kernel/git/sforshee/wireless-regdb.git

echo ""
cd wireless-regdb/
sleep 3

echo ""
gedit db.txt
sleep 1

echo ""
make

echo ""
sudo rm /lib/crda/regulatory.bin

echo ""
sudo cp regulatory.bin /lib/crda/regulatory.bin

echo ""
sudo cp $USER.key.pub.pem /lib/crda/pubkeys/

echo ""
sudo iw reg get

echo ""
ip link set wlan1 down
sleep 3

echo "Boosting Tx Power To 30 Fixed"
iw dev wlan1 set txpower fixed 30mbm
sleep 3

echo "starting wlan1"
ip link set wlan1 up
sleep 2

echo "Checking wlan1 TxPower"
iw dev
sleep 3

echo "Checking Regulatory Domain"
iw reg get
sleep 2

echo "Good Luck"
Джоэл Круз
источник
Пожалуйста, сделайте описание представленного кода. Помогите пользователям научиться ловить рыбу, а не только дать им рыбу.
NotAnUnixNazi
Я знаю, что это не отвечает на вопрос, и Ян может быть прав. Но это подсказка в правильном направлении осведомленности об используемых файлах. Кроме того, у меня нет этой папки /lib/crda/regulatory.bin
JackGrinningCat