Мне нужно установить любой работающий драйвер для беспроводной связи для этого ноутбука, однако после переустановки bcmwl-kernel-source, который был установлен с ОС, я получаю следующее:
modprobe wl
FATAL: Error inserting wl (/lib/modules/3.5.0-25-generic/updates/dkms/wl.ko): Invalid argument
этот драйвер ранее работал но я пытался найти какую-то альтернативу, потому что этот драйвер проприетарный и не работал с ядром 3.8.1, которое я хотел установить (я использую файловую систему btrfs, и это новое ядро исправляет некоторые проблемы с этим).
Итак, я перезагружен обратно к официальному ядру 3.5.0, но не могу заставить этот драйвер снова работать. Теперь каждый раз, когда я пытаюсь загрузить его с помощью modprobe, он возвращает эту ошибку
dmesg:
[ 1966.302971] wl: disagrees about version of symbol cfg80211_scan_done
[ 1966.302983] wl: Unknown symbol cfg80211_scan_done (err -22)
[ 1966.303062] wl: disagrees about version of symbol cfg80211_disconnected
[ 1966.303067] wl: Unknown symbol cfg80211_disconnected (err -22)
[ 1966.303112] wl: disagrees about version of symbol wiphy_register
[ 1966.303116] wl: Unknown symbol wiphy_register (err -22)
[ 1966.303130] wl: disagrees about version of symbol wiphy_new
[ 1966.303134] wl: Unknown symbol wiphy_new (err -22)
[ 1966.303143] wl: disagrees about version of symbol cfg80211_put_bss
[ 1966.303147] wl: Unknown symbol cfg80211_put_bss (err -22)
[ 1966.303156] wl: disagrees about version of symbol cfg80211_roamed
[ 1966.303160] wl: Unknown symbol cfg80211_roamed (err -22)
[ 1966.303179] wl: disagrees about version of symbol lib80211_get_crypto_ops
[ 1966.303184] wl: Unknown symbol lib80211_get_crypto_ops (err -22)
[ 1966.303201] wl: disagrees about version of symbol cfg80211_ibss_joined
[ 1966.303205] wl: Unknown symbol cfg80211_ibss_joined (err -22)
[ 1966.303224] wl: disagrees about version of symbol cfg80211_michael_mic_failure
[ 1966.303228] wl: Unknown symbol cfg80211_michael_mic_failure (err -22)
[ 1966.303236] wl: disagrees about version of symbol cfg80211_connect_result
[ 1966.303240] wl: Unknown symbol cfg80211_connect_result (err -22)
[ 1966.303270] wl: disagrees about version of symbol wiphy_unregister
[ 1966.303274] wl: Unknown symbol wiphy_unregister (err -22)
[ 1966.303293] wl: disagrees about version of symbol cfg80211_get_bss
[ 1966.303297] wl: Unknown symbol cfg80211_get_bss (err -22)
[ 1966.303311] wl: disagrees about version of symbol __ieee80211_get_channel
[ 1966.303315] wl: Unknown symbol __ieee80211_get_channel (err -22)
[ 1966.303356] wl: disagrees about version of symbol ieee80211_channel_to_frequency
[ 1966.303360] wl: Unknown symbol ieee80211_channel_to_frequency (err -22)
[ 1966.303383] wl: disagrees about version of symbol cfg80211_inform_bss_frame
[ 1966.303387] wl: Unknown symbol cfg80211_inform_bss_frame (err -22)
[ 1966.303417] wl: disagrees about version of symbol wiphy_free
[ 1966.303421] wl: Unknown symbol wiphy_free (err -22)
Я знаю, что проприетарные драйверы не очень поддерживаются в Ubuntu, но есть ли другой работающий драйвер с этим?
Было ли одно из исправлений, которые вы попробовали linux-backports-modules? Если так, я бы удалил его:
sudo apt-get remove --purge linux-backports-modules-cw*
Далее я бы переустановил драйвер Broadcom:
sudo apt-get install --reinstall linux-headers-generic
sudo apt-get install --reinstall bcmwl-kernel-source
sudo modprobe wl
У вас все должно быть в порядке.
В первую очередь, большое спасибо chili555 для его ответа, я дал его +1, но это не точно, что я хотел, после дня нахождения мне удалось сделать это...
Я - разработчик C++, поэтому после партии поиска я решил записать патч для этого драйвера сам так, чтобы это работало в 3.8.x ядро. Обратите внимание, что я не разработчик человечности, и выполняющий этот патч находится на Вашем собственном риске. Поскольку я ленив, я не оптимизировал его для работы старого ядра, можно только скомпилировать выполненный с ядром 3.8 и более новый. Патч является ревом:
Значение по умолчанию поддерживает dkms,/var/lib/dkms/bcmwl/6.20.155.1+bdcom (это может отличаться на Вашей установке, в зависимости от версии драйвера), оттуда:
открытый исходный код/src/wl/sys/wl_cfg80211.c, изменение:
diff previous new
49,50c49
< static s32 wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
< struct cfg80211_scan_request *request);
---
> static s32 wl_cfg80211_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request);
55c54
< static s32 wl_cfg80211_get_station(struct wiphy *wiphy,
---
> static int wl_cfg80211_get_station(struct wiphy *wiphy,
485,486c484
< wl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
< struct cfg80211_scan_request *request)
---
> wl_cfg80211_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)
488c486
< struct wl_cfg80211_priv *wl = ndev_to_wl(ndev);
---
> struct wl_cfg80211_priv *wl = wdev_to_wl(request->wdev);
532c530
< err = wl_dev_ioctl(ndev, WLC_SCAN, &sr->wl_scan_req, param_size);
---
> err = wl_dev_ioctl(request->wdev->netdev, WLC_SCAN, &sr->wl_scan_req, param_size);
705c703,704
< wl_ch_to_chanspec(params->channel, &join_params, &join_params_size);
---
>
> wl_ch_to_chanspec(params->chandef.chan, &join_params, &join_params_size);
1388c1387
< static s32
---
> static int
1960,1961c1959,1960
< size_t ie_len;
< u8 *ie;
---
> size_t ie_len = 0;
> u8 *ie_data = NULL;
1987c1986
< ie = ((u8 *)bi) + bi->ie_offset;
---
> ie_data = ((u8 *)bi) + bi->ie_offset;
1991,1992c1990,1991
< ie = bss->information_elements;
< ie_len = bss->len_information_elements;
---
> ie_len = (size_t) bss->ies->len;
> ie_data = bss->ies->data;
1996c1995
< tim = bcm_parse_tlvs(ie, ie_len, WLAN_EID_TIM);
---
> tim = bcm_parse_tlvs(ie_data, ie_len, WLAN_EID_TIM);
другие патчи включены в патчи папки и должны быть достаточными. После того, как Вы изменяете его, сохраняете всю Вашу работу, потому что в случае, если что-то пошло не так, как надо, Ваш ПК может разрушить и сделать:
cd /etc/kernel/postinst.d
sudo ./dkms 'yourkernel - for example 3.8.1'
sudo modprobe wl