Primeiro de tudo, muitos agradecimentos ao chili555 pela sua resposta, eu dei +1, mas não é exatamente o que eu queria, depois de um dia encontrando eu consegui fazer isso ...
Eu sou um desenvolvedor de c ++, então depois de muita pesquisa eu decidi escrever um patch para este driver eu mesmo para que ele funcionasse no kernel 3.8.x. Por favor note que eu não sou um desenvolvedor do Ubuntu e rodar este patch é por sua conta e risco. Porque eu sou preguiçoso, eu não o otimizei para rodar no kernel antigo, você só pode compilá-lo rodando com o kernel 3.8 e mais novo. O patch está abaixo:
A raiz padrão para dkms é /var/lib/dkms/bcmwl/6.20.155.1+bdcom (isso pode ser diferente em sua instalação, dependendo da versão do driver):
open source / src / wl / sys / wl_cfg80211.c, altere:
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);
outras correções estão incluídas nos patches das pastas e devem ser suficientes. Depois de alterá-lo, salve todo o seu trabalho, porque no caso de algo dar errado, o seu PC pode travar e fazer:
cd /etc/kernel/postinst.d
sudo ./dkms 'yourkernel - for example 3.8.1'
sudo modprobe wl