Форум программистов, компьютерный форум, киберфорум
Железо в Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Почетный модератор
 Аватар для Humanoid
11560 / 4354 / 453
Регистрация: 12.06.2008
Сообщений: 12,455

В новом ядре WiFi в режиме AP перестал работать в диапазоне 5 ГГц

08.04.2023, 10:23. Показов 1289. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. У меня WiFi-адаптер TPE-N300PCIED на чипе AR93xx (используется драйвер ядра ath9k). Он работает в режиме точки доступа с hostapd. Раньше проблем не было, но начиная примерно с ядра 5.15 он перестал работать в 5-гигагерцовом диапазоне. Из-за этого не обновлял ядро до новых веток, но в последнем обновлении они и в ядро 5.10 добавили это обновление. Команда "iw phy0 info" для всех каналов в этом диапазоне показывает "no IR" (судя по интернетам, это запрет первому начинать передачу... т.е. в режиме точки доступа работать не будет). Пробовал указывать "iw reg set RU", но безрезультатно.

Так же находил в интернете упоминание, что на всех WiFi-адаптерах должна быть EEPROM, в которой прошит регион, для которого этот адаптер предназначен. Видимо, раньше драйвер игнорировал этот прошитый регион, а теперь, наверное, начал его проверять. Возможно, в моём адаптере ничего не прошито, либо прошит неверный регион, и поэтому драйвер на всякий случай блокирует весь диапазон 5 ГГц.

Пока выкрутился тем, что отредактировал драйвер drivers/net/wireless/ath/regd.c (указал без флага NL80211_RRF_NO_IR все диапазоны, разрешённые в России). Но это какой-то извращённый способ... тем более, после обновления ядра всё придётся повторить, либо создавать скрипт для dkms.
Наверняка, я чего-то не понимаю. Может, что-то нужно дополнительно настроить в системе?

P.S. меня вообще удивило, что в драйвере устройства описаны разрешённые диапазоны для некоторых регионов. Я всегда считал, что драйвер устройства только обеспечивает интерфейс для работы с устройством, а все региональные запреты должны быть реализованы либо в отдельном драйвере, либо в userspace'ных библиотеках. А тут получилось, что ему наплевать, какой регион выставлен в userspace, драйвер устройства сам выставляет какие-то запреты, опираясь на свои собственные правила.

ОС Manjaro, ядро 6.1
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.04.2023, 10:23
Ответы с готовыми решениями:

Перестал работать привод на новом ноуте
На днях купил новый тошибовский ноутбук (win 7 HB) сразу поставил несколько игрушек с дисков и скоро начались проблемы: вставляю...

Перестал работать первый порт в WiFi
В общем ударила молния и монитор на мгновение погас, клавиатура перестала работать, её я переподключил, перезагрузил пк но оказалось что...

После восстановления ХР, перестал работать интернет по wifi
Всем доброго времени суток! У меня проблемка,решил восстановить винду на своем нетбуке и после удачных маневров у меня пропал...

6
Windows must die
663 / 863 / 103
Регистрация: 23.11.2021
Сообщений: 5,112
Записей в блоге: 18
08.04.2023, 13:33
Похоже, какой-то вредитель залез в модуль. Сделай Линусу пуллриквест с правильными изменениями. Вроде бы, он не страдал фашизмом и должен принять...
0
Почетный модератор
 Аватар для Humanoid
11560 / 4354 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
08.04.2023, 20:17  [ТС]
Я не знаю, как это сделать правильно. Я сделал изменения тупо под себя. Подозреваю, что авторы пытались добавить какую-то новую фичу, но по какой-то причине (возможно, из-за неправильной прошивки EEPROM) она либо не работает, либо требует каких-то настроек.
Вообще, надо будет поискать, в каком коммите сломали.
0
Windows must die
663 / 863 / 103
Регистрация: 23.11.2021
Сообщений: 5,112
Записей в блоге: 18
09.04.2023, 11:34
Нужно клонировать репу с ядром, сделать изменения, коммит, пуш, потом - пуллриквест.
0
Почетный модератор
 Аватар для Humanoid
11560 / 4354 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
09.04.2023, 14:24  [ТС]
Это я понимаю. Я не знаю, какие изменения надо туда вносить. Разбираться подробно с этим драйвером у меня никакого желания нет. Вообще, стараюсь избегать подсистем wireless и sound... они очень громоздкие
Кстати, на сколько я знаю, в ядро патчи по e-mail отправляются... на каждую подсистему там свои мэйлинг-листы. На github у них просто зеркало и вряд ли они там пуллреквесты принимают.
0
Почетный модератор
 Аватар для Humanoid
11560 / 4354 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
15.04.2023, 22:59  [ТС]
В общем, не стал я разбираться, а просто захардкодил в драйвер диапазон, который разрешён в России. А что бы этого не приходилось делать при каждом обновлении ядра, добавил хук для pacman, который применяет патч и пересобирает проблемный модуль ядра. Всё это лютые костыли, но нормальное решение не удалось сходу нагуглить.

Внимание! Это решение может потребоваться только если у вас WiFi от Atheros и только если он используется в режиме точки доступа (если ваш компьютер выступает роутером и сам раздаёт WiFi). Для других адаптеров и если ваш компьютер является клиентом и сам подключается к другому роутеру, это решение будет бесполезным.
Так же обратите внимание, что в патче указаны диапазоны частот, которые разрешены в России. Если вы из другой страны, то отредактируйте его в соответствии с местными законами.
Скрипт предназначен для Manjaro. Для других дистрибутивов его придётся изменить (там версии ядер называются иначе и способ сборки ядра будет отличаться).

Смысл патча такой: драйвер пытается прочитать из EEPROM WiFi-адаптера какой-то код. Если этот код отсутствует (как у меня), то драйвер устанавливает его как 0x64 и далее начинает использовать структуру ath_world_regdom_64. Именно эту структуру я изменил.

Хук для pacman

Создайте директории /etc/pacman.d/hooks и /etc/pacman.d/hooks.bin (не знаю, зачем нужна и нужна ли вторая директория, но она была в той рекомендации, которую я читал... у меня она остаётся пустой).
В /etc/pacman.d/hooks создайте любой файл с раширением ".hook". Например: ath-driver-fix.hook с содержимым:
Code
1
2
3
4
5
6
7
8
9
[Trigger]
Operation = Upgrade
Type = Package
Target = linux*
 
[Action]
Description = Fix Atheros driver
When = PostTransaction
Exec = /usr/bin/su <username> /home/<username>/ath/build.sh
Измените <username> на имя своего пользователя... либо можно убрать "/usr/bin/su <username>", но тогда скрипт будет запускаться из под рута и я не уверен, что он будет так работать. И вообще, можете исправить директорию на ту, где у вас будет лежать скрипт build.sh

Скрипт для сборки

Так как скрипт предназначен для Manjaro, поэтому добавил подробные комментакии, что бы было проще его изменить для другого дистрибутива.
Когда ядро устанавливается через pacman, то все модули хранятся в сжатом виде. В старых ядрах это был xz (например, ath.ko.xz), а в новых ядрах zst (например, ath.ko.zst). В скрипте я не стал заморачиваться со сжатием и поэтому наличие несжатого файла (ath.ko) считаю как признак того, что для этой версии ядра модуль уже пересобран.
Для сборки вначале выкачиваю репозиторий со скриптами и патчами, с помощью которого надо собирать ядро для Manjaro (например, https://gitlab.manjaro.org/packages/core/linux61 ).
Затем запускаю
Bash
1
makepkg --nobuild
что бы автоматически скачать ядро и наложить патчи от Manjaro.
Накладываю свой патч в ядро:
Bash
1
patch -i atheros-rus-band.patch -p 1
После этого подготавливаю ядро и собираю модуль ath.ko (только его, т.к. пересобирать всё ядро не требуется)
Bash
1
2
make modules_prepare
make ath.ko M=drivers/net/wireless/ath -j8
После этого просто копирую ath.ko в /lib/modules, удаляю старый модуль (ath.ko.zst) и запускаю depmod, что бы перегенерировать файлы зависимостей и символов для модулей (без этого ядро будет пытаться загрузить старый файл ath.ko.zst вместо нашего нового).
Сам скрипт build.sh :
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/bin/bash
 
# Директория, в которой будет производиться сборка
BUILD_DIR=$HOME/ath
 
# Путь, откуда брать патч
PATH_FILE=$HOME/ath/atheros-rus-band.patch
 
function build_for_module() {
        local MODULE=$1
 
        # VERNUM содержит 510 для ядра 5.10.x, 61 для 6.1.x и т.д.
        local VERNUM=$(echo $MODULE | awk -F "." '{print $1$2}')
 
        # VER2DIG содержит первые две цифры от версии. Например: 5.10 или 6.1
        local VER2DIG=$(echo $MODULE | awk -F "." '{printf $1"."$2}')
 
        # VER2DIG содержит первые две цифры от версии. Например: 5.10.176-2 или 6.1.23
        local VER3DIG=$(echo $MODULE | awk -F "-MANJARO" '{printf $1}')
        local VER3DIG=$(echo $VER3DIG | awk -F "-1" '{printf $1}')
 
        # Просто имя директории со сборкой от Manjaro, что бы карждый раз не писать
        local DIR1="$BUILD_DIR/linux$VERNUM"
 
        mkdir -p $BUILD_DIR
        if [ ! -d "$DIR1" ]; then
                # Клонируем репозиторий, если этого ещё не сделали ранее
                pushd $BUILD_DIR
                git clone https://gitlab.manjaro.org/packages/core/linux$VERNUM.git
                popd
        fi
        pushd "$DIR1"
 
        # OUTPUT - это результат поиска в 'git log' номера версий.
        # Они не используют теги, а просто в сообщении к коммиту указывают версию ядра, для которой предназначен этот коммит
        local OUTPUT=$(git log --grep "$VER3DIG")
        if [ -z "$OUTPUT" ]; then
                # Если в локальной истории нет этого коммита, то переходим на ветку master и стягиваем все коммиты
                git checkout master
                git pull
        fi
        
        # Ещё раз ищем после "git pull"
        local OUTPUT=$(git log --grep "$VER3DIG")
        if [ -z "$OUTPUT" ]; then
                popd
                echo "Kernel version $VER3DIG not found"
                return
        fi
 
        # Переходим на коммит, предназначенный для нашей версии ядра
        git checkout $(echo $OUTPUT | awk '{print $2}')
 
        # Удаляем старую сборку (архив с базовым ядром остаётся и он не будет скачиваться заново).
        # makepkg скачает только патч для минорной версии. Т.е. архив для 6.1 останется, а будет скачен патч для 6.1.23, относительно 6.1
        rm -r ./src
        makepkg --nobuild
 
        # Копируем наш патч в директорию ядра и применяем его
        cp -f $PATH_FILE "$DIR1/src/linux-$VER2DIG"
        cd src/linux-$VER2DIG
        patch -i atheros-rus-band.patch -p 1
 
        # Подготовка к сборке модуля
        make modules_prepare
 
        # Сборка одного модуля внутри ядра. И копирование собранного модуля в /lib/modules и удаление старого модуля
        make ath.ko M=drivers/net/wireless/ath -j8
        sudo cp drivers/net/wireless/ath/ath.ko /lib/modules/$MODULE/kernel/drivers/net/wireless/ath && sudo rm /lib/modules/$MODULE/kernel/drivers/net/wireless/ath/ath.ko.*
        sudo depmod
        popd
}
 
# Список установленных версий ядра (точнее, модулей для этих версий)
MODULES=$(ls /lib/modules | grep -P "^\d")
for MODULE in $MODULES; do
    # Если файл ath.ko уже существует, значит мы уже собрали его для этой версии и пересобирать не требуется
    # Изначально файл называется ath.ko.xz (для версий 5.10) или ath.ko.zst (для версий 6.1), поэтому наличие
    # несжатого файла можно считать как признак того, что это наш пересобранный файл
    RES=0
    ls "/lib/modules/$MODULE/kernel/drivers/net/wireless/ath/ath.ko" &> /dev/null || RES=$?
    if [ $RES == 0 ]; then
        echo "Skip for $MODULE"
        continue
    fi
    echo "Rebuild module for $MODULE"
    build_for_module "$MODULE"
done
0
Почетный модератор
 Аватар для Humanoid
11560 / 4354 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
16.04.2023, 10:22  [ТС]
Печально, что на форуме нельзя отредактировать своё же сообщение, если прошло определённое время.
В общем, там в патче ошибка была в третьем диапазоне... я вчера его просто вырезал, но n_reg_rules забыл исправить. В общем, что бы патч заново не генерировать, просто вернул третий диапазон, но с флагом NL80211_RRF_NO_IR, который означает, что нельзя первому начинать передачу в этом диапазоне (т.е. в режиме точки доступа он работать не будет). Этот диапазон нельзя использовать в квартирах и офисах, а можно только на борту летящих самолётов.
Вот правильный патч:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
--- b/drivers/net/wireless/ath/regd.c   2022-12-12 01:15:18.000000000 +0300
+++ a/drivers/net/wireless/ath/regd.c   2023-04-08 00:04:17.886990231 +0300
@@ -50,6 +50,10 @@
 #define ATH_5GHZ_5725_5850     REG_RULE(5725-10, 5850+10, 80, 0, 30,\
                                         NL80211_RRF_NO_IR)
 
+#define ATH_RUS_BAND           REG_RULE(2400, 2483, 40, 0, 20, 0),\
+                               REG_RULE(5150, 5350, 80, 0, 20, 0),\
+                               REG_RULE(5650, 5850, 80, 0, 20, NL80211_RRF_NO_IR)
+
 #define ATH_2GHZ_ALL           ATH_2GHZ_CH01_11, \
                                ATH_2GHZ_CH12_13, \
                                ATH_2GHZ_CH14
@@ -86,10 +90,9 @@
 /* Can be used by 0x64 only */
 static const struct ieee80211_regdomain ath_world_regdom_64 = {
        .n_reg_rules = 3,
-       .alpha2 =  "99",
+       .alpha2 =  "RU",
        .reg_rules = {
-               ATH_2GHZ_CH01_11,
-               ATH_5GHZ_NO_MIDBAND,
+               ATH_RUS_BAND,
        }
 };
 
@@ -260,7 +263,7 @@
 {
        if (reg->country_code == CTRY_INDIA)
                return (center_freq >= 5500 && center_freq <= 5700);
-       return (center_freq >= 5260 && center_freq <= 5700);
+       return (center_freq >= 5500 && center_freq <= 5650);
 }
 
 static void ath_force_clear_no_ir_chan(struct wiphy *wiphy,
Вложения
Тип файла: zip atheros-rus-band.patch.zip (692 байт, 2 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.04.2023, 10:22
Помогаю со студенческими работами здесь

Перестал работать интернет через wifi. linux mint
просто так взял и в один прерасный момент перестал выходить в нет. к wifi нормально подключается. что могло послужить причиной?

Samsung np350e5c-s0aru перестал работать wifi адаптер на ноутбуке
недавно перестал работать wifi адаптер ar9485wb-eg wireless network adapter на ноутбуке samsung. пропали все сети wifi. зашел в &quot;Центр...

Wl500g.premiumv2 умеет ли работать в режиме клиент wifi
Здравствуйте. мне отдали хитрый роутер. На нем написано d-link dir-320. Но в него запихана прошивка от asus wl500g.premiumv2. Реально ли...

HDD (IDE) после разгона перестал работать в UDMA режиме
Здравствуйте, после разгона перестал грузиться диск, доходит до POST-code 0078 и всё. Но если зайти в BIOS и выставить PIO Mode: и DMA...

Обновила с Windows 7 на Windows 10, перестал работать WiFi, требует пароль для входа в ОС
Нечаянно обновила с Windows 7 на Windows 10 перестал работать WiFi и через пару дней вообще перезагрузился комп и теперь спрашивает пароль...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru