AMD SB700 チップセットを Linux で使うと USB がハングする件

結論から言うと kernel に以下のパッチ当てれば OK.

2.6.27 に対するパッチで、2.6.28 から適用されるそうだけど 2.6.24 に当てても大丈夫だった。

このパッチに対するパッチでSB600 にも対応させるものも出ている。うちのマザーボードは SB700 なのでこちらは試していない。

どんな問題か


今のメインマシン(id:rna:20080821:p1)は、使い始めの頃 USB が調子悪くて、USB メモリにファイル転送すると失敗したり USB マウスが動かなくなったりすることがあったのだけど、いつのまにかなおったので、自動更新で fix されたんだと思っていたのだが、ここ3日ほどでまた似たような現象が再発した。

具体的には、メモリカードリーダを USB に挿すと USB 機器がハングして一切使えなくなる。マウスが動かなくなるので気づいた。一度ハングするとメモリカードリーダを抜いても復帰しない。PC を再起動すると復帰する。

メモリカードリーダは先日まで使えていた。気になるのは新しい USB ハブを繋いだことと、最近 linx-kernel のアップデートが続いたこと。メモリカードリーダをハブに繋いでも直結しても現象は変わらず。古いカーネルを試すと 2.6.24-21 だとハングしなくなった、と思ったら、これも SD カードをカードリーダに挿すとハング。

ハングの前後で /var/log/messages には「reset high speed USB device using ehci_hcd and address 3」とか大量に出ているので、これをキーワードにネットで検索してみたところ同様の現象があちこちで出ている。が、単なるハードウェアトラブルっぽいのも混じっていてどうもはっきりしない。

色々見ていて ehci_hcd モジュールが原因だよという話を見つける。

ここにあるように modprobe -r ehci_hcd でモジュールを外してやるとハングしていた USB 機器が復帰した。ehci_hcd は USB 2.0 のドライバなので、これをやると USB 機器はすべて USB 1.1 のドライバで制御されるようになる。つまり転送速度の上限が 12Mbps に。。。

それはさすがに困るので、ehci_hcd を検索語に入れて色々検索して最終的にたどり着いたのがここ。

うちと同じマザーボードで同じ現象。ここで紹介されていたのが冒頭のパッチ。どうも色んな USB 機器を繋いでいると発現する現象のようで、うちの場合は USB ハブがトドメをさしたっぽい。思えば最初にこの現象が解消されたと思った頃、USB ハブを外して別のマシンにつなぎかえていた。

カーネルのビルド/インストール

正式なパッチの作り方はちょっと調べる暇がなかったので、とりあえず Ubuntulinux-kernel-image パッケージにパッチを当ててそのままビルドした。これをやるとインストール後、アップデートマネージャから正式版のカーネルをインストールするように警告が出続ける(アイコンが赤い!マークの矢印に)のでウザいんですけど。

ビルドとインストールの仕方は以下を参照した。

まとめるとこんな感じ。

# ビルド用ツールのインストール
sudo apt-get install linux-kernel-devel fakeroot build-essential

# カーネルソースのインストール
sudo apt-get build-dep linux-image-2.6.24-23-generic
sudo apt-get source linux-image-2.6.24-23-generic

# パッチの適用
cd /usr/src/linux-2.6.24
sudo su
(20行程の小さな変更なので内容確認がてら手で編集した)

# ビルド
AUTOBUILD=1 NOEXTRAS=1 fakeroot debian/rules binary-generic

# インストール
echo vesafb | sudo tee -a /etc/initramfs-tools/modules
echo fbcon | sudo tee -a /etc/initramfs-tools/modules
sudo dpkg -i linux-image-2.6.24-23-generic_2.6.24-23.48_i386.deb
sudo dpkg -i linux-headers-2.6.24-23-generic_2.6.24-23.48_i386.deb

# ehci-hcd モジュールが更新されてるのを確認
ls -l /lib/modules/2.6.24-23-generic/kernel/drivers/usb/host/ehci-hcd.ko

これで再起動すると、USB 2.0 がフツーに動くようになった。ちゃんと high speed (480Mbps)で繋がっている。USB 接続の DVD ドライブから 4GB 程のファイル転送も問題なくできた。

まとめ。そうねぇ。

イスラエルが嫌いで Intel を避けて AMD を使っていて、かつ、マイクロソフトが嫌いで Linux 使っている、という人もこれで安心。