Linux : Broadcom rilascia i drivers ufficiali per le sue schede. Ecco come installarli

Jessica Lambiase
2 mag 2010

Rieccoci a parlare di nuovo di schede wireless Broadcom! Bene, a differenza del tutorial che scrissi qualche tempo fa, oggi andiamo ad installare direttamente i drivers originali forniti da Broadcom… o meglio, costruiremo insieme un modulo per il Kernel partendo da questi, e diremo al sistema come riconoscerlo.

Vi ho terrorizzati? Naaaah… è molto molto più semplice a farsi che a dirsi! In realtà il tutto si riduce ad una decina di comandi sequenziali che, però, tengo a spiegare uno per uno.

Andiamo per gradi:

Step 0: verificare la compatibilità della nostra scheda.

Apriamo una shell e diamo il seguente comando (preleviamo la lista delle periferiche connesse al sistema, mostrando però soltanto quelle che contengono la stringa “i4e4″):

lspci -vnn | grep 14e4

L’output del comando dovrebbe essere del tutto simile a questo:

0001:01:01.0 Network controller [0280]: Broadcom Corporation BCM4311 [AirForce One 54g] 802.11g Wireless LAN Controller [14e4:4311] (rev 02)

Attenzione a questa stringa “[14e4:4311]” , in particolare a ciò che c’è scritto dopo 14e4 (nel nostro caso 4311): tramite quel numeretto, guardando la tabella sottostante, possiamo sapere se la scheda è  pienamente supportata.

4311 2.4 Ghz

4311 Dualband

4311 5 Ghz

4312 2.4 Ghz

4313 2.4 Ghz

4321 Dualband

4321 Dualband

4321 2.4 Ghz

4321 5 Ghz

4322 Dualband

4322 2.4 Ghz

4322 5 Ghz

43224 Dualband

43225 2.4 Ghz

Non disperate, però : questo modulo potrebbe funzionare anche con schede non elencate di sotto.

Step 1: Installare gli headers del kernel.

Bene, come vi ho già detto stiamo andando a costruire un modulo per il kernel : e come facciamo se non abbiamo gli headers, i sorgenti e i tools di sviluppo del nostro kernel stesso?

Vediamo, innanzitutto, se ci sono già installati. Aprite un terminale, e date il seguente comando:

ls /lib/modules/`uname -r`/build

Se l’output dovesse essere positivo (la cartella esiste, e viene fatta la lista di tutti i files contenuta in essa) allora potrete tranquillamente saltare allo Step 2. Se, invece,l’output dovesse essere qualcosa come “/lib/modules/”release”/build: No such file or directory” non vi resta che continuare a leggere, e installare il tutto.

Questa volta, ragazzi miei, però dovrete darmi una mano… non c’è una procedura standard per tutte le distribuzioni di Linux, e purtroppo ho avuto a che fare (a livello di kernel) soltanto con Fedora, Slackware, Ubuntu/Debian e Gentoo, ragion per cui mi limiterò a illustrare le procedure d’installazione degli strumenti di sviluppo soltanto per loro (chiaramente, valgono anche per i loro “derivati”). Dovrebbero esserci informazioni in proposito sulla documentazione di tutte le altre distribuzioni. Qualora doveste avere difficoltà,non esitate a contattarmi.

Fedora/Red Hat:

su -c 'yum install kernel-devel'

su -c ‘yum install kernel-headers’

Ubuntu:

sudo apt-get install build-essential linux-headers-generic

sudo apt-get build-dep linux

Gentoo:

su -c ‘emerge gentoo-sources’

Slackware :

Inseriamo il CD/DVD del sistema operativo, eseguiamo il tool pkgtool e selezioniamo per l’installazione “kernel sources”.

Adesso, una volta installati i tools necessari, procediamo.

Step 2 : creazione del modulo.

Scarichiamo i drivers, a seconda della vostra architettura (32 o 64 bit) dal link in basso. Creiamo una cartella (ad es. “Drivers” ) ed estraiamo lì dentro il contenuto dell’archivio scaricato. Apriamo cioè un terminale,e scriviamo:

sudo -s

[inseriamo la password di root]

oppure

su

[inseriamo la password di root]

e poi:

mkdir Drivers

cd Drivers

wget url_dell’archivio_appropriato_al_vostro_sistema

ls

[vi apparirà il nome dell'archivio scaricato]

tar xovfz nome_dell’archivio_scaricato

Ora creiamo il modulo, digitando:

make clean

make

O, qualora doveste avere un kernel personalizzato, passate a make, come parametro, il percorso dei vostri headers/sorgenti. Solitamente ciò equivale a sostituire il make precedente con


make --include-dir=/usr/src/linux-source-`uname -r`

Oppure con

make –include-dir=/usr/src/linux-headers-`uname -r`

(o, in generale, --include-dir=percorso_dei_vostri_sorgenti_del_kernel). (Un ringraziamento va ad Angelo che ha segnalato (ed anche risolto) il problema.)

Attendiamo la procedura di creazione del modulo e, una volta terminata , lasciamo aperto il nostro terminale (ci servirà ancora) ed andiamo avanti.

NB : nel caso vi si dovesse presentare un errore di questo tipo : “make: *** /lib/modules/”release”/build: No such file or directory. Stop.” non disperate : vuol dire che la suite di sviluppo del kernel non è stata correttamente installata. Ritornate allo Step 1 e ripetete il procedimento.

Dovrebbe, intanto, apparire un file wl.ko nella vostra directory : abbiamo creato il nostro preziosissimo modulo. Adesso andiamo ad installarlo.

Step 3:Installazione del modulo wl

Se avete già tentato di installare i drivers Broadcom con altre procedure, oppure se siete da Ubuntu, NON dimenticate di eseguire il passo seguente! Infatti, nel malaugurato caso in cui il modulo che abbiamo appena creato dovesse coesistere con altri moduli simili, si scatenerà una guerra all’ultimo sangue nel vostro sistema (ahaha! =P ), e il vostro nuovissimo modulo si rifiuterà di funzionare! Andiamo quindi a verificare se avete installate altre versioni/avete tracce di precedenti installazioni. Riprendiamo il nostro terminale,e digitiamo:

lsmod | grep “b43\|ssb\|wl”

Lsmod è il comando che restituisce in output la lista dei moduli installati, e grep preleva dall’output le stringhe che gli abbiamo passato. Se lsmod non dovesse restituire nulla potete saltare la prossima sfilza di comandi ed andare a caricare direttamente il modulo. Nel caso contrario in cui, però, lsmod vi dice che avete qualcosa del genere installato, dovete innanzitutto eliminarlo, e poi mettere in blacklist ( = la lista nera dei moduli,che il sistema non proverà mai più a caricare) i moduli che non vi servono. Per fare ciò, riprendiamo il nostro terminale root e diamo in sequenza i seguenti comandi:

rmmod b43

rmmod ssb

rmmod wl

echo “blacklist ssb” >> /etc/modprobe.d/blacklist.conf

echo “blacklist b43″ >> /etc/modprobe.d/blacklist.conf

[non metteremo wl, invece, in blacklist,in quanto è proprio il modulo che dovremo ricaricare]

Sempre per precauzione, cerchiamo nelle directories /lib e /var altre eventuali versioni di wl.ko, e rinominiamole. E facciamo ciò copiando questo stralcio di script nel nostro terminale (permette, in una sola riga di comando, di scandire tutti i files wl.ko che trova nelle directories /var e /lib e rinominarli in wl.ko.orig … fiQo no?)

sh: for i in `find /lib /var -name wl\.ko`; do mv $i ${i}.orig; done

Abbiamo terminato anche la nostra opera di pulizia. Non ci resta che inserire - finalmente – il modulo al nostro kernel, ed inventarci qualche piccola miglioria per evitarci un po’ di lavoro immediatamente dopo ogni avvio del sistema.

Prima di inserire il modulo in sè, alcuni sistemi richiedono l’inserimento di un altro sotto-modulo per la sicurezza. Riprendiamo il nostro bel terminale di root, e inseriamolo:

modprobe lib80211

Se non dovesse funzionare, sappiate che lo stesso risultato può essere ottenuto caricando un modulo molto,molto simile (è una cosa che varia da sistema a sistema,se non funziona uno allora sicuramente funziona l’altro). Prendiamo nota di quale dei due, per noi, funziona.

modprobe ieee80211_crypt_tkip

Ed ora, finalmente, inseriamo il nostro modulo appena creato:

insmod wl.ko

La vostra scheda wireless sarà operativa dopo circa un minuto.

Step 4: autoload del modulo all’avvio

Credete che sia finita? Beh, se volete potrebbe esserlo ma..se terminate adesso, dovrete ripetere tutti i modprobe e gli insmod ad ogni avvio del sistema! Vi conviene? Certo che no! Cerchiamo, quindi, di dire al sistema “senti, prima di portarmi al login devi caricare il modulo della scheda di rete”. Ed è arrivato il momento di spiegarvi un’altra sottigliezza dei sistemi Unix.

Durante la sequenza di boot del sistema, vi sono delle routine che vengono sempre eseguite e, in tutti i sistemi unix, c’è sempre un file che permette di definire ulteriori operazioni da eseguire prima dell’accesso alla sequenza di login. Questo file differisce da sistema a sistema,ma ecco la lista di quelli più importanti:

  • Slackware (e derivati) /Mandriva : /etc/rc.d/rc.local
  • Fedora/Red Hat (e derivati)/SuSe/OpenSuSe: /etc/rc.local
  • Gentoo (e derivati) / Debian (e derivati) / Ubuntu (e derivati) : /etc/init.d/rc.local

Prendiamo nota del nome del nostro file.

Riprendiamo il nostro bel terminale di root, e scriviamo:

cp wl.ko /lib/modules/`uname -r`/kernel/drivers/net/wireless

depmod -a

echo modeprobe lib80211 >> /etc/rc.local

(o, in alternativa, echo modeprobe ieee80211_crypt_tkip >> /etc/rc.local)

echo modeprobe wl >> /etc/rc.local

Da questo momento in poi, i moduli saranno finalmente caricati automaticamente all’avvio e, all’atto del login, avremo finalmente pronta la nostra scheda wireless funzionante.

Abbiamo finalmente terminato! Il procedimento è stato un po’ ostico questa volta, lo so, ma l’importante è esserne usciti vincitori!

Ovviamente, per ogni problema, chiarimento o spiegazione,potrete contattarmi. Ecco i links e..al prossimo tutorial!

Articoli molto simili

  • http://www.chimerarevo.com Jessica Lambiase

    Volendo puoi installare i drivers “non ufficiali” ma funzionantissimi, se trovi difficoltà a compilarti a mano il modulo: puoi seguire questa guida nella sua parte relativa ai sistemi non ubuntu :)

  • http://www.chimerarevo.com Jessica Lambiase

    Certo! Ho soltanto bisogno di sapere che tipi di errore ti vengono restituiti/ cosa non ti è chiaro, resto a disposizione :)

  • Pingback: Disponibili i driver Open Source Wireless per schede Broadcom - Chimera Revo

  • http://www.chimerarevo.com Jessica Lambiase

    @Stefano
    Fondatissima,errore mio, correggo.

  • Stefano

    Ho una perplessità, non bisogna fare insmod wl.ko ? facendo cosi mi ha funzionato, con l’underscore mi dava file non trovato.

  • angelo

    Ok sono nuovamente qua…allora il modulo con la procedura indicata prima non funziona (almeno per me) girando e rigirando ho trovato il problema e cioè che dal kernel 2.6.33 autoconf.h se ne va a spasso per le cartelle con il risultato di compilazione fallita…alla fine in maniera un po’ rozza ho semplicemente modificato a mano il file linuxver.h (che si trova nella cartella /src/include all’ interno dei sorgenti dei driver) cancellando queste due righe;
    #else
    #include
    che si trovano alla riga 22 e 23….
    Ho rifatto tutta la procedura della guida e finalmente tutto funziona come dovrebbe…
    P.s esistono varie patch per ovviare a questo problema ma a me non hanno funzionato…
    ciao

  • http://www.chimerarevo.com Jessica Lambiase

    @angelo
    Giustissimo, quale cosa migliore di passare il path degli headers (che io pensavo non avessi proprio) al make? Ottima osservazione,aggiorno! :) Ciao,alla prossima!

  • http://www.chimerarevo.com Tanino Rulez

    @angelo
    Questo aiuterà molto anche gli utenti, provvederemo ad aggiornare la guida ringraziandoti ;)

  • angelo

    Ok scusa il doppio post ma ci sono riuscito….posto qui come ho fatto chissà puo’ essere d’ aiuto a qualcuno…in pratica gli headers per kernel custom o meglio vanilla si trovano all’ interno dei sorgenti quindi in /usr/src/linux-2.6.xx quindi la compilazione dei driver falliva perchè ovviamente non trovava gli headers, la soluzione consiste nell’ aggiungere al comando make la directory della sorgente del kernel…nel mio caso il comando era “make –include-dir=/usr/src/linux-source-2.6.33″…tutto qua…grazie del tempo dedicatomi e alla prossima…ciauuuuu

  • angelo

    Ciao jessica grazie per la risposta…scusa l ignoranza ma cosa intendi per headers base??? io ho installato gli headers che sono stati creati dopo la creazione del kernel con il classico comando “sudo make-kpkg –append-to-version=-custom –initrd kernel_image kernel_headers
    modules_image” se c’è altro da installare potresti gentilmente dirmi dove reperirlo??? grazie per lo sbattimento…ciao

  • http://www.chimerarevo.com Jessica Lambiase

    @angelo
    Si, certo che puoi, a patto che installi gli headers del kernel base del tuo kernel ricompilato… leggo che hai il 2.6.33, quindi stai bene attento ad installare gli headers del kernel 2.6.33 : in linea teorica non dovresti avere nessun tipo di problema, ma – giusto per precauzione – fai un backup dell’immagine del tuo kernel, dell’initrd e della mappa di sistema.

  • Stefano

    Aggiungo che con la 4315 su ubuntu 10.04 questo metodo funziona.

  • angelo

    Ciao, ho provato a compilare i driver come descritto nella tua guida ma la compilazione fallisce….il problema per quanto mi riguarda sono gli header poichè utilizzo un kernel custom (da premettere che gli headers per il mio kernel sono installati)…la mia domanda è questa, esiste un modo per installarli su kernel custom???questo è l errore che mi da…
    14:00:36 root@angelo-laptop ~/Scaricati/hybrid-portsrc-x86_32-v5.60.48.36 # makeKBUILD_NOPEDANTIC=1 make -C /lib/modules/`uname -r`/build M=`pwd`
    make[1]: ingresso nella directory «/usr/src/linux-source-2.6.33»
    LD /home/angelo/Scaricati/hybrid-portsrc-x86_32-v5.60.48.36/built-in.o
    CC [M] /home/angelo/Scaricati/hybrid-portsrc-x86_32-v5.60.48.36/src/shared/linux_osl.o
    In file included from /home/angelo/Scaricati/hybrid-portsrc-x86_32-v5.60.48.36/src/shared/linux_osl.c:19:
    /home/angelo/Scaricati/hybrid-portsrc-x86_32-v5.60.48.36/src/include/linuxver.h:23:28: error: linux/autoconf.h: Nessun file o directory
    make[2]: *** [/home/angelo/Scaricati/hybrid-portsrc-x86_32-v5.60.48.36/src/shared/linux_osl.o] Errore 1
    make[1]: *** [_module_/home/angelo/Scaricati/hybrid-portsrc-x86_32-v5.60.48.36] Errore 2
    make[1]: uscita dalla directory «/usr/src/linux-source-2.6.33»
    make: *** [all] Errore 2

  • http://www.chimerarevo.com Jessica Lambiase

    @DaDo
    E’ esatto, saltato un tag. Il comando è proprio

    lspci -vnn | grep 14e4

    Grazie per la segnalazione, guida aggiornata.

  • http://www.chimerarevo.com Tanino Rulez

    @DaDo
    credo si riferisca al comando

    lspci -vnn | grep 14e4

    Grazie per la segnalazione, magari appena torna gli segnalerò la cosa e ti farò dare conferma correggendo anche l’articolo

  • DaDo

    il comando del passo 0 qual’è???

  • Pingback: Linux : Broadcom rilascia i drivers ufficiali per le sue schede. Ecco come installarli | Bloggosite