Broadcom ワイヤレス
イントロダクション
GNU/Linux における自社製品の Wi-Fi カードのサポートについて Broadcom は(悪い意味で)有名でした。最近になるまで、ほとんどの Broadcom のチップは全くサポートがなかったり、ユーザー自身がファームウェアを弄る必要があったのです。当時はリバースエンジニアリングによるドライバー (brcm4xxx
, b43
など) によって限られた数のワイヤレスチップだけがサポートされていました。リバースエンジニアリングの b43 ドライバーは 2.6.24 からカーネルに入りました。
2008年の8月に、Broadcom は GNU/Linux で Broadcom の無線ハードウェアをサポートする 802.11 Linux STA ドライバー を公式にリリースします。それらは制限的なライセンスのドライバーでしたが、Broadcom は将来もっとオープンなアプローチを目指すことを約束しました。なお、このドライバーは隠蔽された ESSID では動作しません。
2010年9月、Broadcom は彼らのハードウェアのための完全にオープンソースなドライバーを 最終的にリリース しました。このドライバー、brcm80211 はカーネル 2.6.37 から含まれています。2.6.39 のリリース時に、これらのドライバーは brcmsmac
と brcmfmac
に名前が変更されています。
執筆時点で、Broadcom Wi-Fi チップセットを使っているユーザーには3つの選択肢が存在します:
ドライバー | 説明 |
---|---|
brcmsmac/brcmfmac | オープンソースのカーネルドライバー |
b43 | リバースエンジニアリングによるカーネルドライバー |
broadcom-wl | プロプライエタリな Broadcom STA ドライバー |
どのドライバーが必要で使用可能なのか確かめる
まず、あなたの使っているカードの PCI-ID を確認してください。コンソールに次のコマンドを入力 (大文字小文字の違いに気をつけて下さい):
$ lspci -vnn | grep 14e4:
それから、あなたのカードを b43 でサポートされている デバイスのリスト と brcm80211 でサポートされているデバイスのリスト を見て確認してください。
ドライバーの取得
brcmsmac/brcmfmac
brcm80211
ドライバーはカーネルに含まれています。PCI カードには brcmsmac
、SDIO デバイスには brcmfmac
という名前が付けられています。
これらのドライバーは起動時に自動的にロードされるためユーザーがやらなくてはならない操作はありません。ドライバーが自動的にロードされない場合は、手動でドライバーをロードしてください。
b43/b43legacy
このドライバーは 2.6.24 からカーネルにマージされています。
b43/b43legacy カーネルモジュールのロード
あなたの使っているデバイスを こちら で検索してどちらのモジュールが必要なのか確認してください。ここ でコンピュータの機種で検索することもできます。問題が発生しないようにもう片方のモジュールはブラックリストに入れます (b43
または b43legacy
)。ブラックリスト化の方法は、カーネルモジュール#ブラックリスト を参照。
AUR から b43-firmwareAUR か b43-firmware-legacyAUR のどちらか適切な方をインストールしてください。
b43 によってサポートされているデバイスの低電圧版を使っている場合、特別なファームウェアをインストールする必要があります。低電圧版のチップを使っているのかどうかは lspci | grep Broadcom | grep LP-PHY
を実行することですぐに確認できます。ファームウェアのインストールは、下で説明しているように 適切なパッケージ をダウンロードして b43-fwcutter
を使うか、このインストールスクリプトを使用することで可能です。
LP-PHY ファームウェアをインストールするには、以下を実行:
curl -LO http://downloads.openwrt.org/sources/broadcom-wl-4.178.10.4.tar.bz2 tar xjf broadcom-wl-4.178.10.4.tar.bz2 cd broadcom-wl-4.178.10.4/linux b43-fwcutter -w /lib/firmware wl_apsta.o
ファームウェアをインストールしたら、デバイスを設定することができるようになります。
broadcom-wl
broadcom-wl
ドライバーを使いたい人のために、AUR には broadcom-wlAUR という名前でパッケージが存在します。DKMS を使いたい場合は broadcom-wl-dkmsAUR があります。
wl カーネルモジュールのロード
他の使用可能なモジュールが存在しない場合、wl
モジュールを手動でロードする必要があります。wl
モジュールをロードする前に、b43
など他のモジュールを取り除いて下さい、おそらく自動的にロードされています:
# rmmod b43
ssb
がロードされている場合も、アンロードしてください:
# rmmod ssb
wl
モジュールをロード:
# modprobe wl
wl
モジュールは lib80211
または lib80211_crypt_tkip
を自動的にロードします。lsmod
でロードされているか確認してください。ロードされていない場合は、2つのモジュールのどちらかを追加してください:
# modprobe lib80211
または:
# modprobe lib80211_crypt_tkip
Broadcom から直接ドライバーをインストールしたときは、依存関係を更新する必要があるかもしれません:
# depmod -a
起動時にモジュールがロードされるようにする方法は、カーネルモジュールを見て下さい。
/etc/modprobe.d/modprobe.conf
で使わないモジュールを (干渉しないように) ブラックリストに入れることができます。モジュールをブラックリスト化する方法は、カーネルモジュール#ブラックリスト を見て下さい。
トラブルシューティング
Wi-Fi カードが存在しないかのように扱われる
Broadcom BCM43241 などの新しいカードを使っているユーザーは lspci や lsusb でカードの情報が何も表示されないという問題に遭遇することがあります。
カーネルをアップグレードした後に Wi-Fi カードが動作しなくなった又は認識されなくなった (brcmsmac)
カーネルが brcmsmac
モジュールの代わりに bcma
モジュールを使用することで起こります。解決方法は bcma
モジュールをブラックリストに入れることです。方法は、カーネルモジュール#ブラックリスト を見て下さい。
Wi-Fi カードが動作しない又は認識されない (broadcom-wl)
適切なモジュールがロードされているか確認してください。不要なモジュールが自動的にロードされないように brcm80211
, b43
, ssb
カーネルモジュールをブラックリスト化させる必要があるかもしれません。ブラックリストの方法については、カーネルモジュール#ブラックリスト を参照。
モジュールの依存関係が更新されたか確認:
# depmod -a
ip addr
で無線インターフェイスが表示されることを確認。iwconfig
やip addr
でデバイスが表示されるようにするにはマシンを再起動する必要があるかもしれません。- 最近カーネルをアップグレードしていた場合は、新しくインストールしたカーネルで
broadcom-wl
パッケージを再ビルドしてモジュールを更新する必要があります。
インターフェイスが取り替わる (broadcom-wl)
broadcom-wl
ドライバーのユーザーは Ethernet と Wi-Fi のインターフェイスが変わってしまう問題が起こることがあります。解決方法は ネットワーク#デバイス名 を見て下さい。
b43 ドライバーと Linux 3.8+
b43 ドライバーは Linux 3.8 から重大な問題を抱えています、すなわちアクセスポイントを表示したり接続することができません。
解決方法: 上記を参照して、最新の broadcom-wl ドライバー (バージョン 6+) を試してみて下さい。
コンソールのメッセージを少なくする
起動中に、以下のような無駄に長くてうっとおしいメッセージが断続的に流れることがあります:
phy0: brcms_ops_bss_info_changed: arp filtering: enabled true, count 0 (implement) phy0: brcms_ops_bss_info_changed: qos enabled: false (implement) phy0: brcms_ops_bss_info_changed: arp filtering: enabled true, count 1 (implement) enabled, active
このメッセージは /etc/systemd/journald.conf
の MaxLevelConsole
を設定するなど、通常の方法で消すことはできません。メッセージを消すためには、dmesg
がコンソールにメッセージを表示するレベルを低く設定する必要があります。シンプルな systemd サービスを作ることでこの設定を起動時に行うことが可能です。
/etc/systemd/system/
に brcms_suppression.service
というような名前のファイルを作成してください:
brcms_suppression.service
[Unit] Description=Broadcom console message suppression script [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/sh -c 'dmesg -n 3' [Install] WantedBy=multi-user.target
他の systemd サービスと同じように、次のコマンドで有効にします:
# systemctl enable brcms_suppression
インターフェイスは表示されるのに接続ができない
以下をカーネルコマンドラインに追加:
b43.allhwsupport=1
b43 が応答しない
b43
ドライバーの電源管理は BCM43228 チップ (やその他の Broadcom チップセット) で想定に少しだけ誤差があって、カーネルログに "(Reason: 3=DEAUTH_LEAVING)" を残して切断してしまうことがあります。電源管理を無効化することで解決します。一時的に修正するには、root で次を実行: iw <interface> set power_save off
。
このコマンドで解決した場合は、udev ルールを新しく追加することで修正を永続的にできます:
/etc/udev/rules.d/70-b43.rules
ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="your_mac_address", RUN+="/usr/bin/iw dev %k set power_save off"
雑多なノート
Talk:Broadcom wireless を見て下さい。