Fedora 7 で Broadcom bcm43xx を使う

Fedora core 6 時代にそこそこ安定していた Broadcom BCM4306 チップが,Fedora 7 にしてからうまく動かなくなりました。苦闘の末 core 6 時代と同様に動くようにできました。

前説

Broadcom の無線 LAN チップは残念ながら仕様がオープンになっていませんし,オープンソースなドライバもありません(でした)。なので,かつては Windows 用のドライバスタック(NDIS)へのブリッジを使ったアプローチ(ndiswrapper)を使って利用するしかありませんでした。しかし,クリーンルームでのリバースエンジニアリングによって仕様がいくつかわかってき,オープンソースなドライバが開発されるようになってきました。

ただし,(プロプラ OS 用)ドライバにデバイス用のファームウェアが含まれており,動かすためにはそのファームウェアが必要になります。

Broadcom bcm43xx 用の Linux ドライバの変遷です。

  1. ndiswrapper + Windows 用ドライバ【Fedora core 5 以前】
  2. bcm43xx (with SoftMAC) + V3 firmware【kernel 2.6.17 以降・Fedora core 6; Fedora 7 にも付属】
  3. bcm43xx-mac80211 (on Devicescape MAC layer) + V4 firmwareFedora 7】
  4. b43 (on Devicescape MAC layer) + V4 firmwareFedora 7】(上記と同じ;改名しました)

BCM4306 であるためか SSID ステルスな WEP でやっているためか bcm43xx-mac80211 だとどうしてもうまく使えないので(しかも最初は wlassistant でうまく設定できていたのに最近カーネルのアップデートとともにうまくいかなくなった),FC6 と同様の bcm43xx ドライバを利用することにします。

下準備

後々必要になる Broadcom の無線 LAN チップの PCIバイス ID 等を調べておきます。

# lspci -nn

00:00.0 Host bridge [0600]:
  Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge [8086:7190] (rev 03)

... snip ...

06:00.0 Network controller [0280]:
  Broadcom Corporation BCM4306 802.11b/g Wireless LAN Controller [14e4:4320] (rev 03)

Broadcom BCM4306 を搭載した無線 LAN チップの,デバイスクラスコードが 0280 / ベンダ ID が 14e4 / デバイスコードが 4320 であることがわかります。

下にあげるステップは Fedora メーリングリストの投稿(Updated bcm43xx-old-config script (was Re: Need help w/ bcm43xx-mac80211)を参考にしつつちょっと改変してあります。

Step 1. bcm43xx-mac80211 ドライバが読み込まれないようにする

modprobe.conf に blacklist として bcm43xx-mac80211 を指定します。RedHat 系の流儀としては /etc/modprobe.d/blacklist に追加するべきみたいです。ということで,末尾に

blacklist bcm43xx-mac80211

を追加しました。

Step 2. Version 3 の firmware を抜き出す

bcm43xx ドライバでは bcm43xx-mac80211 ドライバと異なり V3 firmware を利用します*1。/lib/firmware/ から既存の V4 firmware を削除してもいいんですが,引用元にならって共存させることにします。

# bcm43xx-fwcutter -w /lib/firmware -p .v3 CBG54.sys

のように,.v3 というポストフィックス付きでファームウェアを解凍します。

一方,bcm43xx ドライバが .v3 というポストフィックス付きのファームウェアをロードできるように modprobe.conf にてオプションを与えます。

options bcm43xx fwpostfix=.v3 

Step 3. bcm43xx ドライバを読み込む

参照記事では rc.local に modprobe を書いて起動時に自動的に読み込まれるようにしています。私が利用しているものは内蔵ではなく Cardbus アダプタですので,該当する PCIバイスが接続されたときに自動的に読み込まれるようにしてみます。

本来的には /lib/modules/バージョン/modules.pcimap の内容を書き換えるべきですが,カーネルのバージョンがあがるたびに書き換えなきゃいけないですし,ちょっと触るにはシステム寄りすぎで躊躇したので別の方法を探してみました。modules.pcimap ではなく modules.alias を眺めていたところ,適切な alias を指定すれば,指定した PCIバイス ID に対応してカーネルモジュールを読み込んでくれそうです。

具体的には,

alias pci:v000014E4d00004320sv*sd*bc*sc*i* bcm43xx

という内容を /etc/modprobe.conf に加えます。太字の部分はお使いのチップのデバイスコードにあわせて変更してください。

Step 4. bcm43xx ドライバにハードウェアを認識させる

これで bcm43xx なチップを接続すると自動的にドライバモジュールが読み込まれるようになりましたが,そのドライバがデバイスを認識してくれません。ので,強制的にデバイス ID を教えてあげることにします。それが参照元の /sys/bus/pci/drivers/bcm43xx/new_id への echo なのですが,これをドライバロード時に自動的に行われるようにします。

具体的には,

install bcm43xx /sbin/modprobe --first-time --ignore-install bcm43xx &&
  /bin/echo "14e4 4320" > /sys/bus/pci/drivers/bcm43xx/new_id

という行を加えます(実際は一行)。詳しく説明しないので man modprobe.conf(5) するか,おまじないだとおもってあきらめてください。

まとめ

最終的に /etc/modprobe.conf に追加した内容は

#blacklist bcm43xx-mac80211

options bcm43xx fwpostfix=.v3 
alias pci:v000014E4d00004320sv*sd*bc*sc*i* bcm43xx
install bcm43xx /sbin/modprobe --first-time --ignore-install bcm43xx
  && /bin/echo "14e4 4320" > /sys/bus/pci/drivers/bcm43xx/new_id

このような感じになりました。

これで無線 LAN デバイスが wlan0 ではなく Fedore Core 6 時代のように eth1 として認識されるようになりました。このため system-config-network を使って静的に設定できますし,NetworkManager サービスを起動して動的に設定されるようにもできます。

*1:私の利用している WLI-CB-G54 では Windows 98 用が V3 firmwareWindows 2000 用が V4 firmware でした。bcm43xx-fwcutter -i でリビジョンをたしかめることができます