Страница 1 из 2
Wi-Fi Broadcom
Добавлено: 20 мар 2014, 17:38
Olej
В новых ноутбуках часто стоят Wi-Fi чипы Broadcom ... 43xxx.
Например, Dell очень любит ставить, и HP в новых моделях.
Но многие модели 43xxx не совместимы с драйверами и не работают.
Вот картина неработающего Wi-Fi на свежем ноутбуке:
Код: Выделить всё
[Olej@modules ~]$ lspci
...
24:00.0 Network controller: Broadcom Corporation BCM43228 802.11a/b/g/n
Судя по
http://wireless.kernel.org/en/users/Dri ... ed_devices (очень интересная табличка!) этот девайс поддерживается только закрытым драйвером wl (rpmfusion).
А система Fedora 20 ставит для него групповой драйвер 43ххх:
Код: Выделить всё
[Olej@modules ~]$ lspci -n
...
23:00.1 0880: 197b:2392 (rev 30)
23:00.2 0805: 197b:2391 (rev 30)
24:00.0 0280: 14e4:4359
[Olej@modules ~]$ modprobe -c | grep -i 14e4 | grep 4359
alias pci:v000014E4d00004359sv*sd*bc*sc*i* bcma
[Olej@modules ~]$ lsmod | grep bcma
bcma 46142 0.
И в итоге:
Код: Выделить всё
[Olej@modules ~]$ rfkill list
0: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
[Olej@modules ~]$ iwconfig
lo no wireless extensions.
em1 no wireless extensions.
При этом кнопка включения Wi-Fi горит неактивным (жёлтым) и не включается.
я достаточно много убил времени (2 дня с перерывами на другие устройства), поэтому запишу как установить такие чипы...
Re: Wi-Fi Broadcom
Добавлено: 20 мар 2014, 17:41
Olej
Olej писал(а):я достаточно много убил времени (2 дня с перерывами на другие устройства), поэтому запишу как установить такие чипы...
На странице Broadcom
802.11 Linux STA driver:
These packages contain Broadcom's IEEE 802.11a/b/g/n hybrid Linux® device driver for use with Broadcom's BCM4311-, BCM4312-, BCM4313-, BCM4321-, BCM4322-, BCM43224-, and BCM43225-, BCM43227- and BCM43228-based hardware.
32-bit driver 6.30.223.141 09/10/2013 Download Zip File 1.1MB
64-bit driver 6.30.223.141 09/10/2013 Download Zip File 1.2MB
README.txt 6.30.223.141 09/10/2013 Download Text File 14KB
(конец 2013 года)
Там же в README.txt читаем, кроме прочего:
PRECOMPILED DRIVER
-------------------
Some distros (Ubuntu and Fedora at the least) already have a version of
this driver in their repositories precompiled, tested and ready to go.
You just use the package manager to install the proper package. If
its available for your distro, this is usually an easier solution. See
the end of this document for further discussion.
HOW TO INSTALL A PRE-COMPILED DRIVER
-----------------------------------
Some of the major linux distros already supply a version of this driver, so
you don't have to compile your own. Most of the distros keep this driver
along with other proprietary or non-GPL drivers in a separate repository.
For further information see the documentation for your specific distro.
Fedora:
------
su -c 'rpm -Uvh
http://download1.rpmfusion.org/free/fed ... noarch.rpm
http://download1.rpmfusion.org/nonfree/ ... noarch.rpm'
su -
yum update
yum install kmod-wl
Re: Wi-Fi Broadcom
Добавлено: 20 мар 2014, 17:53
Olej
Т.е. ставиться можно даже из репозитария, не занимаясь ручной сборкой проприетарного модуля:
Код: Выделить всё
[Olej@modules ~]$ sudo yum install kmod-wl
[sudo] password for Olej:.
...
Установлено:
kmod-wl.x86_64 0:6.30.223.141-5.fc20.14.......................................
Установлены зависимости:
broadcom-wl.noarch 0:6.30.223.141-2.fc20......................................
kmod-wl-3.13.6-200.fc20.x86_64.x86_64 0:6.30.223.141-5.fc20.14................
Выполнено!
Дальше в README.txt детально описано ... но примерно так:
Код: Выделить всё
[Olej@modules ~]$ lspci -n
...
23:00.2 0805: 197b:2391 (rev 30)
24:00.0 0280: 14e4:4359
[Olej@modules ~]$ modprobe -c | grep -i 14e4 | grep 4359
alias pci:v000014E4d00004359sv*sd*bc*sc*i* bcma
[Olej@modules ~]$ lsmod | grep bcma
bcma 46142 0
[Olej@modules ~]$ sudo rmmod bcma
[sudo] password for Olej:.
[root@modules ~]# echo "blacklist bcma" >> /etc/modprobe.d/blacklist.conf
[root@modules ~]# modprobe lib80211
[root@modules ~]# modprobe cfg80211
[root@modules ~]# modprobe wl
[Olej@modules ~]$ lsmod | grep wl
wl 4207671 0.
lib80211 13968 1 wl
cfg80211 474169 1 wl
Перезагрузка ...
Код: Выделить всё
[Olej@modules ~]$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default.
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: wlo1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DORMANT group default qlen 1000
link/ether 34:23:87:d6:85:0d brd ff:ff:ff:ff:ff:ff
3: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether a0:1d:48:f4:93:5c brd ff:ff:ff:ff:ff:ff
[Olej@modules ~]$ rfkill list
0: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
[Olej@modules ~]$ iwconfig
lo no wireless extensions.
em1 no wireless extensions.
wlo1 IEEE 802.11abg ESSID:"ZTE"..
Mode:Managed Frequency:2.437 GHz Access Point: C8:64:C7:8A:50:16...
Retry long limit:7 RTS thr:off Fragment thr:off
Power Management:off
Re: Wi-Fi Broadcom
Добавлено: 16 янв 2015, 15:51
Olej
Olej писал(а):
Т.е. ставиться можно даже из репозитария, не занимаясь ручной сборкой проприетарного модуля:
И всё это безукоризненно работало больше 9-ти месяцев ... пока сегодня новый трабл
...
Но, по порядку - работало
относительно безукоризненно, потому как:
- при обновлении ядра
этот модуль из репозитария не обновляется...
- почему? ... не знаю - возможно, потому, что это firmware...
- но в Fedora 20 стоит автообновление по умолчанию, в том числе и ядра...
- и я не дал себе труд разобраться и убрать автообновление ... да мне и нужны свежие версии ядра для экспериментов
- поэтому
каждые 1.5 месяца, примерно, предстояло напороться на неработоспособность WiFi (горит жёлтым фонарь WiFi и не включается) ...
- и проделать такое вот обновление:
Код: Выделить всё
[Olej@modules ~]$ lsmod | grep wl
[Olej@modules ~]$ sudo yum update kmod-wl
...
[Olej@modules ~]$ sudo modprobe wl
[Olej@modules ~]$ iwconfig
wlo1 IEEE 802.11abg ESSID:"ZTE"
Mode:Managed Frequency:2.462 GHz Access Point: C8:64:C7:8A:50:16
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:off
lo no wireless extensions.
em1 no wireless extensions.
Но! ... на сегодня:
Код: Выделить всё
[Olej@modules 16]$ u_n_a_m_e -a
Linux modules.localdomain 3.17.8-200.fc20.x86_64 #1 SMP Thu Jan 8 23:26:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Код: Выделить всё
[Olej@modules ~]$ lsmod | grep wl
[Olej@modules ~]$ yum list kmod-wl
...
Установленные пакеты
kmod-wl.x86_64 6.30.223.248-4.fc20.6 @rpmfusion-nonfree-updates
[Olej@modules ~]$ sudo modprobe wl
[sudo] password for Olej:
modprobe: FATAL: Module wl not found.
Re: Wi-Fi Broadcom
Добавлено: 17 янв 2015, 01:37
Olej
Начинаю разбираться... (
фиксирую это для себя, чтобы не забыть ... но может кому пригодится)
С вот этого:
Olej писал(а):
На странице Broadcom
802.11 Linux STA driver:
These packages contain Broadcom's IEEE 802.11a/b/g/n hybrid Linux® device driver for use with Broadcom's BCM4311-, BCM4312-, BCM4313-, BCM4321-, BCM4322-, BCM43224-, and BCM43225-, BCM43227- and BCM43228-based hardware.
32-bit driver 6.30.223.141 09/10/2013 Download Zip File 1.1MB
64-bit driver 6.30.223.141 09/10/2013 Download Zip File 1.2MB
README.txt 6.30.223.141 09/10/2013 Download Text File 14KB
(конец 2013 года)
Скачиваю:
Version Date Size
32-bit driver 6.30.223.248 07/08/2014
64-bit driver 6.30.223.248 07/08/2014
Как видно (по дате) они оперативно обновляют версию ... но недостаточно оперативно для ядра 3.17
Разархивируем ... собираем:
Код: Выделить всё
[Olej@modules hybrid_wl]$ make
KBUILD_NOPEDANTIC=1 make -C /lib/modules/`uname -r`/build M=`pwd`
make[1]: Вход в каталог `/usr/src/kernels/3.17.8-200.fc20.x86_64'
CFG80211 API is prefered for this kernel version
Using CFG80211 API
LD /home/Olej/2015-WORK/HISTORY/01/16/hybrid_wl/built-in.o
CC [M] /home/Olej/2015-WORK/HISTORY/01/16/hybrid_wl/src/shared/linux_osl.o
CC [M] /home/Olej/2015-WORK/HISTORY/01/16/hybrid_wl/src/wl/sys/wl_linux.o
/home/Olej/2015-WORK/HISTORY/01/16/hybrid_wl/src/wl/sys/wl_linux.c: В функции «wl_alloc_linux_if»:
/home/Olej/2015-WORK/HISTORY/01/16/hybrid_wl/src/wl/sys/wl_linux.c:1310:64: ошибка: для макроса «alloc_netdev» требуется 4 аргументов, но указано только 3
dev = alloc_netdev(sizeof(priv_link_t), intf_name, ether_setup);
... ^
О-о-о-о-о-пс!
Смотрим
http://lxr.missinglinkelectronics.com/l ... ce.h#L2992 (это ядро 3.16):
Код: Выделить всё
2992 #define alloc_netdev(sizeof_priv, name, setup) \
2993 alloc_netdev_mqs(sizeof_priv, name, setup, 1, 1)
И ядро 3.17:
Код: Выделить всё
3116 #define alloc_netdev(sizeof_priv, name, name_assign_type, setup) \
3117 alloc_netdev_mqs(sizeof_priv, name, name_assign_type, setup, 1, 1)
Было 3 параметра - стало 4
Но в том же файле ядра -
http://lxr.free-electrons.com/source/in ... v=3.17#L41:
Код: Выделить всё
40 /* interface name assignment types (sysfs name_assign_type attribute) */
41 #define NET_NAME_UNKNOWN 0 /* unknown origin (not exposed to userspace) */
42 #define NET_NAME_ENUM 1 /* enumerated by kernel */
43 #define NET_NAME_PREDICTABLE 2 /* predictably named by the kernel */
44 #define NET_NAME_USER 3 /* provided by user-space */
45 #define NET_NAME_RENAMED 4 /* renamed by user-space */
Можем выправить в файле wl_linux.c (сообщение ошибки показывает место):
- было:
Код: Выделить всё
dev = alloc_netdev(sizeof(priv_link_t), intf_name, ether_setup);
- стало:
Код: Выделить всё
dev = alloc_netdev(sizeof(priv_link_t), intf_name, NET_NAME_ENUM, ether_setup);
Ну или обложить эти различия:
Код: Выделить всё
#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0))
Re: Wi-Fi Broadcom
Добавлено: 17 янв 2015, 01:47
Olej
Olej писал(а):
- стало:
Повторяем:
Код: Выделить всё
[Olej@modules hybrid_wl]$ make
...
/home/Olej/2015-WORK/HISTORY/01/16/hybrid_wl/src/wl/sys/wl_cfg80211_hybrid.c:2074:4: ошибка: слишком мало аргументов в вызове функции «cfg80211_ibss_joined»
cfg80211_ibss_joined(ndev, (u8 *)&wl->bssid, GFP_KERNEL);
^
...
Теперь уже файл wl_cfg80211_hybrid.c
Отправляемся в ядро:
- 3.15, 3.16 (
http://lxr.free-electrons.com/source/in ... 3.16#L4002,
http://lxr.free-electrons.com/source/in ... 3.15#L3933):
Код: Выделить всё
3987 /**
3988 * cfg80211_ibss_joined - notify cfg80211 that device joined an IBSS
3989 *
3990 * @dev: network device
3991 * @bssid: the BSSID of the IBSS joined
3992 * @channel: the channel of the IBSS joined
3993 * @gfp: allocation flags
3994 *
3995 * This function notifies cfg80211 that the device joined an IBSS or
3996 * switched to a different BSSID. Before this function can be called,
3997 * either a beacon has to have been received from the IBSS, or one of
3998 * the cfg80211_inform_bss{,_frame} functions must have been called
3999 * with the locally generated beacon -- this guarantees that there is
4000 * always a scan result for this IBSS. cfg80211 will handle the rest.
4001 */
4002 void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid,
4003 struct ieee80211_channel *channel, gfp_t gfp);
- в 3.14 - там вообще
3 параметра ...
- 3.17 :
http://lxr.free-electrons.com/source/in ... 3.17#L3982
Код: Выделить всё
3967 /**
3968 * cfg80211_ibss_joined - notify cfg80211 that device joined an IBSS
3969 *
3970 * @dev: network device
3971 * @bssid: the BSSID of the IBSS joined
3972 * @channel: the channel of the IBSS joined
3973 * @gfp: allocation flags
3974 *
3975 * This function notifies cfg80211 that the device joined an IBSS or
3976 * switched to a different BSSID. Before this function can be called,
3977 * either a beacon has to have been received from the IBSS, or one of
3978 * the cfg80211_inform_bss{,_frame} functions must have been called
3979 * with the locally generated beacon -- this guarantees that there is
3980 * always a scan result for this IBSS. cfg80211 will handle the rest.
3981 */
3982 void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid,
3983 struct ieee80211_channel *channel, gfp_t gfp);
http://lxr.free-electrons.com/source/in ... =3.17#L167
Код: Выделить всё
142 /**
143 * struct ieee80211_channel - channel definition
144 *
145 * This structure describes a single channel for use
146 * with cfg80211.
147 *
148 * @center_freq: center frequency in MHz
149 * @hw_value: hardware-specific value for the channel
150 * @flags: channel flags from &enum ieee80211_channel_flags.
151 * @orig_flags: channel flags at registration time, used by regulatory
152 * code to support devices with additional restrictions
153 * @band: band this channel belongs to.
154 * @max_antenna_gain: maximum antenna gain in dBi
155 * @max_power: maximum transmission power (in dBm)
156 * @max_reg_power: maximum regulatory transmission power (in dBm)
157 * @beacon_found: helper to regulatory code to indicate when a beacon
158 * has been found on this channel. Use regulatory_hint_found_beacon()
159 * to enable this, this is useful only on 5 GHz band.
160 * @orig_mag: internal use
161 * @orig_mpwr: internal use
162 * @dfs_state: current state of this channel. Only relevant if radar is required
163 * on this channel.
164 * @dfs_state_entered: timestamp (jiffies) when the dfs state was entered.
165 * @dfs_cac_ms: DFS CAC time in milliseconds, this is valid for DFS channels.
166 */
167 struct ieee80211_channel {
168 enum ieee80211_band band;
169 u16 center_freq;
170 u16 hw_value;
171 u32 flags;
172 int max_antenna_gain;
173 int max_power;
174 int max_reg_power;
175 bool beacon_found;
176 u32 orig_flags;
177 int orig_mag, orig_mpwr;
178 enum nl80211_dfs_state dfs_state;
179 unsigned long dfs_state_entered;
180 unsigned int dfs_cac_ms;
181 };
Назначение и состав структуры не понятен...
Но как это очень часто бывает в ядре - новую структуру пробуем "на ура" заменить указателем NULL... файл wl_cfg80211_hybrid.c :
Код: Выделить всё
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
cfg80211_ibss_joined(ndev, (u8 *)&wl->bssid, GFP_KERNEL);
#else
cfg80211_ibss_joined(ndev, (u8 *)&wl->bssid, NULL, GFP_KERNEL);
#endif
Код: Выделить всё
[Olej@modules hybrid_wl]$ make
...
CFG80211 API is prefered for this kernel version
Using CFG80211 API
MODPOST 1 modules
WARNING: modpost: missing MODULE_LICENSE() in /home/Olej/2015-WORK/HISTORY/01/16/hybrid_wl/wl.o
see include/linux/module.h for more information
WARNING: modpost: Found 1 section mismatch(es).
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
CC /home/Olej/2015-WORK/HISTORY/01/16/hybrid_wl/wl.mod.o
LD [M] /home/Olej/2015-WORK/HISTORY/01/16/hybrid_wl/wl.ko
make[1]: Выход из каталога `/usr/src/kernels/3.17.8-200.fc20.x86_64'
Всё! Собралось.
Re: Wi-Fi Broadcom
Добавлено: 17 янв 2015, 01:50
Olej
Olej писал(а):Всё! Собралось.
Код: Выделить всё
[Olej@modules hybrid_wl]$ sudo insmod wl.ko
[sudo] password for Olej:
[Olej@modules hybrid_wl]$ lsmod | grep wl
wl 6363567 0
cfg80211 493592 1 wl
Код: Выделить всё
[Olej@modules hybrid_wl]$ ifconfig wlo1
wlo1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.21 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::3623:87ff:fed6:850d prefixlen 64 scopeid 0x20<link>
ether 34:23:87:d6:85:0d txqueuelen 1000 (Ethernet)
RX packets 8 bytes 2029 (1.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 24 bytes 4820 (4.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 19
[Olej@modules hybrid_wl]$ iwconfig
wlo1 IEEE 802.11abg ESSID:"ZTE"
Mode:Managed Frequency:2.462 GHz Access Point: C8:64:C7:8A:50:16
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:off
lo no wireless extensions.
em1 no wireless extensions.
Код: Выделить всё
[Olej@modules НАРОД]$ ping -I wlo1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 192.168.1.21 wlo1: 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=80.6 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=81.3 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=79.8 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=44 time=81.5 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=44 time=80.7 ms
^C
--- 8.8.8.8 ping statistics ---
6 packets transmitted, 5 received, 16% packet loss, time 5003ms
rtt min/avg/max/mdev = 79.895/80.851/81.576/0.590 ms
Работает!
Re: Wi-Fi Broadcom
Добавлено: 17 янв 2015, 01:52
Olej
Olej писал(а):Работает!
Но интересно тогда что там сборщики дистрибутива насобирали в качестве пакетного драйвера?
Re: Wi-Fi Broadcom
Добавлено: 20 янв 2015, 17:10
Olej
Olej писал(а):
Было 3 параметра - стало 4
Вот это "маленькое изменение" приводит к тому, что
все сетевые драйверы (устройств, протоколов, виртуализации, ...) - должны быть
переписаны с учётом нового синтаксиса.
Разработчики ядра, естественно, для своих драйверов это сделали ... правда сделали, как я увидел пересмотрев пару десятков файлов - только формально подставив везде 3-м параметром NET_NAME_UNKNOWN.
Но все
проприетарные драйвера и драйвера
от производителей оборудования - становятся неработоспособными...
Начиная с ядра
3.17 - возьмём это на заметку.
P.S. Если бы это понимать, как ... жест в конкурентной борьбе разработчиков ядра Linux (например, между free драйвером NVIDIA и проприетарным от NVIDIA) - то лучше фокуса и придумать нельзя бы было
Вот только беда, что free драйверы практически всегда
хуже, чем драйверы от производителей!
Re: Wi-Fi Broadcom
Добавлено: 20 фев 2015, 17:50
Olej
Olej писал(а):Работает!
Немного поработали и ... в ядре 3.18 -
я вас поздравляю:
Код: Выделить всё
[Olej@modules hybrid_wl]$ uname -a
Linux modules.localdomain 3.18.5-101.fc20.x86_64 #1 SMP Mon Feb 2 20:58:23 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[Olej@modules hybrid_wl]$ make
KBUILD_NOPEDANTIC=1 make -C /lib/modules/`uname -r`/build M=`pwd`
make[1]: Вход в каталог `/usr/src/kernels/3.18.5-101.fc20.x86_64'
CFG80211 API is prefered for this kernel version
Using CFG80211 API
LD /home/Olej/2015-WORK/devices/hybrid_wl/built-in.o
CC [M] /home/Olej/2015-WORK/devices/hybrid_wl/src/shared/linux_osl.o
CC [M] /home/Olej/2015-WORK/devices/hybrid_wl/src/wl/sys/wl_linux.o
CC [M] /home/Olej/2015-WORK/devices/hybrid_wl/src/wl/sys/wl_iw.o
CC [M] /home/Olej/2015-WORK/devices/hybrid_wl/src/wl/sys/wl_cfg80211_hybrid.o
...
/home/Olej/2015-WORK/devices/hybrid_wl/src/wl/sys/wl_cfg80211_hybrid.c:2015:3: ошибка: несовместимый тип аргумента 3 функции «cfg80211_inform_bss»
(const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL);
^
...
/home/Olej/2015-WORK/devices/hybrid_wl/src/wl/sys/wl_cfg80211_hybrid.c:2015:3: ошибка: слишком мало аргументов в вызове функции «cfg80211_inform_bss»
(const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL);
...
Начинаем разгребаться в этом
новом месте.