Bug #632

Проблемы с сетевой Broadcom из-за старого модуля и некорректных настроек ядра

Added by Михаил Гагауз almost 6 years ago. Updated about 5 years ago.

Status:New Start:01/19/2014
Priority:High Due date:
Assignee:Alexander Tratsevskiy % Done:

0%

Category:- Spent time: -
Target version:-
Votes: 1

Description

Пару месяцев назад, устанавливая кальку на один из рабочих ноутбуков обнаружил следующую проблему - встроенная broadcom wifi-карта очень плохо ловила сигнал. Буквально стоило отойти от точки доступа на расстояние 20-30 см. и сигнал пропадал (с убунтой стоявшей на этом буке до того таких проблем небыло).

Проблему решил размасскировав нестабильную версию =net-wireless/broadcom-sta-6.30.223.141

Также, поскольку в дефолтном ядре включены ключи:
B43, SSB, MAC80211, PREEMPT_RCU, и при загрузке ядра подгружаются соответствующие модули - пришлось применить хитрость - выгружать ненужные модули, и загружать необходимый модуль нижеприведенным скриптом:
# cat /etc/local.d/broadcom_sta_modules.start

#!/bin/sh

/sbin/modprobe -rv b43 brcmsmac mac80211 bcma wl
/sbin/modprobe -v wl

Все эти игры с noload=... в параметрах ядра и blacklist в modprobe.d не дали должного результата.

В дальнейшем ядро собирал со следующим шаблоном на конфиг, и необходимость в этом костыле отпала:
# cat /var/calculate/templates/3.1/6_ac_install_patch/sys-kernel/calculate-sources/broadcom.config

# Calculate format=openrc name=.config

#### For details see the net-wireless/broadcom-sta ebuild
## CONFIG_CHECK
CONFIG_B43=n
CONFIG_SSB=n

## CONFIG_CHECK2
#?pkg(sys-kernel/calculate-sources)>=2.6.29#
CONFIG_LIB80211=m
CONFIG_MAC80211=n
CONFIG_LIB80211_CRYPT_TKIP=m
#pkg#

#?pkg(sys-kernel/calculate-sources)<2.6.29#
CONFIG_IEEE80211=y
CONFIG_IEEE80211_CRYPT_TKIP=y
#pkg#

#?pkg(sys-kernel/calculate-sources)<2.6.32&&pkg(sys-kernel/calculate-sources)>=2.6.29#
CONFIG_WIRELESS_EXT=y
#pkg#

#?pkg(sys-kernel/calculate-sources)<2.6.31&&pkg(sys-kernel/calculate-sources)>=2.6.29#
CONFIG_COMPAT_NET_DEV_OPS=y
#pkg#

#?pkg(sys-kernel/calculate-sources)>=2.6.32#
CONFIG_CFG80211=m
#pkg#

#?pkg(sys-kernel/calculate-sources)>=3.8.8#
#?os_linux_system==desktop#
CONFIG_PREEMPT_NONE=n
CONFIG_PREEMPT_VOLUNTARY=y
#os_linux_system#
#?os_linux_system==server#
CONFIG_PREEMPT_NONE=y
CONFIG_PREEMPT_VOLUNTARY=n
#os_linux_system#
CONFIG_PREEMPT=n
CONFIG_PREEMPT_RCU=n
#pkg#

Все эти хитрые условия созданы на основе ebuild-а broadcom-sta.
Эти "жонглирования" с CONFIG_PREEMPT* связаны с зависимостями:

# grep -A1 '^config PREEMPT_RCU' /usr/src/linux/init/Kconfig
config PREEMPT_RCU
        def_bool ( TREE_PREEMPT_RCU || TINY_PREEMPT_RCU )
# grep -EA2 '^config (TINY|TREE)_PREEMPT_RCU' /usr/src/linux/init/Kconfig
config TREE_PREEMPT_RCU
        bool "Preemptible tree-based hierarchical RCU" 
        depends on PREEMPT
--
config TINY_PREEMPT_RCU
        bool "Preemptible UP-only small-memory-footprint RCU" 
        depends on PREEMPT && !SMP

Т.е. переключить PREEMPT - это единственный способ отключить PREEMPT_RCU (этот ключ и его зависимости отключатся автоматически, иначе этого не сделать, можете попробовать сами).

Правила для старых ядер решил также включить, чтоб проще было портировать этот шаблон на старые sys-kernel/*-sources ядра для тех кому это необходимо.

Для себя проблему решил давно, и, к сожалению, забыл отписаться ))
О проблеме вспомнил благодаря этой теме на форуме(вангую - у него та же проблема)

Сетевая на которой замечена мною эта проблема - Broadcom Corporation BCM4313 802.11b/g/n Wireless LAN

History

Updated by Iurii Blokhin almost 6 years ago

В данный момент проверить нам не на чем, а слепо вносить изменения в ядро не хотелось бы. Подождем пока еще кто-нибудь проверит.

Updated by Андрей Сеник almost 6 years ago

Подтверждаю наличие проблемы с этими модулями.
Так же подтверждаю работающий рецепт от Михаила. За что ему большое спасибо.

Updated by Iurii Blokhin almost 6 years ago

Все эти переключения PREEMPT действительно необходимы или работает и с ними?

B43 и остальное кому мешает возможно маскировать, как описано здесь
Предположим гипотетическую ситуацию, что у кого-то железо, которое работает именно на b43 или кто-то хочет использовать именно b43 из каких-либо соображений. Что тогда будет с его системой?

Updated by Михаил Гагауз almost 6 years ago

Все эти переключения PREEMPT действительно необходимы или работает и с ними?

Пожалуй, необходимы:

# awk '/^pkg_setup\(\)/{p=1;} {if(1==p)print($0);} /^\}/{if(1==p)p=0;}' < /usr/portage/net-wireless/broadcom-sta/broadcom-sta-6.30.223.141.ebuild 
pkg_setup() {
        # bug #300570
        # NOTE<lxnay>: module builds correctly anyway with b43 and SSB enabled
        # make checks non-fatal. The correct fix is blackisting ssb and, perhaps
        # b43 via udev rules. Moreover, previous fix broke binpkgs support.
        CONFIG_CHECK="~!B43 ~!SSB" 
        CONFIG_CHECK2="LIB80211 ~!MAC80211 ~LIB80211_CRYPT_TKIP" 
        ERROR_B43="B43: If you insist on building this, you must blacklist it!" 
        ERROR_SSB="SSB: If you insist on building this, you must blacklist it!" 
        ERROR_LIB80211="LIB80211: Please enable it. If you can't find it: enabling the driver for \"Intel PRO/Wireless 2100\" or \"Intel PRO/Wireless 2200BG\" (IPW2100 or IPW2200) should suffice." 
        ERROR_MAC80211="MAC80211: If you insist on building this, you must blacklist it!" 
        ERROR_PREEMPT_RCU="PREEMPT_RCU: Please do not set the Preemption Model to \"Preemptible Kernel\"; choose something else." 
        ERROR_LIB80211_CRYPT_TKIP="LIB80211_CRYPT_TKIP: You will need this for WPA." 
        if kernel_is ge 3 8 8; then
                CONFIG_CHECK="${CONFIG_CHECK} ${CONFIG_CHECK2} CFG80211 ~!PREEMPT_RCU" 
        elif kernel_is ge 2 6 32; then
                CONFIG_CHECK="${CONFIG_CHECK} ${CONFIG_CHECK2} CFG80211" 
        elif kernel_is ge 2 6 31; then
                CONFIG_CHECK="${CONFIG_CHECK} ${CONFIG_CHECK2} WIRELESS_EXT ~!MAC80211" 
        elif kernel_is ge 2 6 29; then
                CONFIG_CHECK="${CONFIG_CHECK} ${CONFIG_CHECK2} WIRELESS_EXT COMPAT_NET_DEV_OPS" 
        else
                CONFIG_CHECK="${CONFIG_CHECK} IEEE80211 IEEE80211_CRYPT_TKIP" 
        fi

        linux-mod_pkg_setup

        BUILD_PARAMS="-C ${KV_DIR} M=${S}" 
        BUILD_TARGETS="wl.ko" 
}

B43 и остальное кому мешает возможно маскировать, как описано здесь

Скажите, а для чего нужно сохранить этот модуль ядра?
У вас есть на примере железо, которое работает с ядерным модулем, но не работает с проприетарным?
Если уж вносить изменения связанные с пересборкой ядра - может тогда лучше принять мой шаблон?
Посмотрите на секцию pkg_setup любой версии ebuildbroadcom-sta (эта секция во всех ebuild-ах одинаковая, кстати, а надо-бы в сорцах этого модуля посмотреть, что за зависимости там описаны) и увидите, почему у меня такой "мудреный" шаблон.

Справедливости ради, я должен сказать, что ключ ядра CONFIG_B44 также включает CONFIG_SSB, т.е. ключ SSB все-же не отключается.
Но похоже работает и с ним, а отключать CONFIG_B44 я не предлагаю, т.к. подозреваю, что обладатели "Broadcom 440x/47xx ethernet" сетевых интерфейсов будут не в восторге от этой идеи.

Updated by Андрей Сеник almost 6 years ago

А может пойти другим путем?

Если пользователю необходим broadcom-sta, то шаблоном внести изменения в .config текущего ядра и либо попросить, либо сразу пересобрать текущее ядро вместе с initrd.

Updated by Михаил Гагауз almost 6 years ago

Андрей Сеник wrote:

А может пойти другим путем?


Если пользователю необходим broadcom-sta, то шаблоном внести изменения в .config текущего ядра и либо попросить, либо сразу пересобрать текущее ядро вместе с initrd.

можно. я так и сделал, в моих iso-хах для внутреннего пользования так и сделано.
Но это не лучший вариант.
Повторюсь - для указанной выше карты (на довольно современном буке) драйвера из ядра работают, но работают довольно криво (ловит только точку расположенную в радиусе 20-30 см., к примеру, если рядом с буком положить телефон). Кстати, с более старыми моделями broadcom-овских карт ядерный модуль работает нормально.

Я решение нашел. Но большинство пользователей, не являющихся гиками, просто забьет на это, и либо будет искать usb-wifi (чтоб не решать проблему - попробовать ее обойти), либо вообще перейдет на ubuntu (на которой все работает, и работает при помощи broadcom-sta).

Есть еще вариант - подождать свежих версий ядра, в надежде что там эту проблему пофиксят. Но когда нужно решение здесь и сейчас - это не вариант.

Кстати, а можно узнать - чем PREEMPT_VOLUNTARY не подходит для десктопа, и чем PREEMPT лучше?

# awk '/^\S.*/{p=0;} /^config PREEMPT(_VOLUNTARY)?$/{p=1;} {if(1==p)print($0);}' \
 < usr/src/linux/kernel/Kconfig.preempt 
config PREEMPT_VOLUNTARY
        bool "Voluntary Kernel Preemption (Desktop)" 
        help
          This option reduces the latency of the kernel by adding more
          "explicit preemption points" to the kernel code. These new
          preemption points have been selected to reduce the maximum
          latency of rescheduling, providing faster application reactions,
          at the cost of slightly lower throughput.

          This allows reaction to interactive events by allowing a
          low priority process to voluntarily preempt itself even if it
          is in kernel mode executing a system call. This allows
          applications to run more 'smoothly' even when the system is
          under load.

          Select this if you are building a kernel for a desktop system.

config PREEMPT
        bool "Preemptible Kernel (Low-Latency Desktop)" 
        select PREEMPT_COUNT
        select UNINLINE_SPIN_UNLOCK if !ARCH_INLINE_SPIN_UNLOCK
        help
          This option reduces the latency of the kernel by making
          all kernel code (that is not executing in a critical section)
          preemptible.  This allows reaction to interactive events by
          permitting a low priority process to be preempted involuntarily
          even if it is in kernel mode executing a system call and would
          otherwise not be about to reach a natural preemption point.
          This allows applications to run more 'smoothly' even when the
          system is under load, at the cost of slightly lower throughput
          and a slight runtime overhead to kernel code.

          Select this if you are building a kernel for a desktop or
          embedded system with latency requirements in the milliseconds
          range.


Судя по help-у обоих опций ядра - разница между ними не существенная, но делать весь код ядра полностью прерываемым...
во первых - совсем ни к чему
во вторых - как видно из проблемы с broadcom-sta даже иногда вредно

Если кто-то укажет на плюсы использования именно CONFIG_PREEMPT - с удовольствием почитаю.

Updated by Igor Woznyi about 5 years ago

Андрей Сеник wrote:

А может пойти другим путем?


Если пользователю необходим broadcom-sta, то шаблоном внести изменения в .config текущего ядра и либо попросить, либо сразу пересобрать текущее ядро вместе с initrd.

уважаемый, а можно новичку подробнее? для 14й Кальки
не видит сетевуху Broadcom BCM43227 802.11b/g/n

Also available in: Atom PDF

Thank you!