naoyaの日記 RSSフィード

 | 

2007-05-29

r8169 が使えない 20:05

最近カーネルモジュールことはじめにはまっている優しいイケメンなお兄さんたちとかが教えてくれることを願いつつ。

オンボードNICRealtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller を Cent 4.4 + カーネル 2.6.19.2 で使っています。これは普通認識して動いている。

このチップを Cent 5 でも使いたいワーと思ったけど Cent 5 標準のカーネルではドライバ (r8169) が削除されてるのんで、Cent 4.4 で使ってる同じ 2.6.19.2 のソースから、.config を同じにしてコンパイルした。

が、どーにも認識しない。

% /sbin/lspci | grep Ether
02:00.0 Ethernet controller: Unknown device 0001:8168 (rev 01)
03:05.0 Ethernet controller: Intel Corporation 82541PI Gigabit Ethernet Controller (rev 05)

デバイスは見えてるし kudzu -p しても

class: NETWORK
bus: PCI
detached: 0
device: eth1
desc: "Unknown device 0001:8168"
vendorId: 0001
deviceId: 8168
subVendorId: 147b
subDeviceId: 2410
pciType: 1
pcidom:    0
pcibus:  2
pcidev:  0
pcifn:  0

確かに eth1、そこにあるッ!

しかしドライバがこのハードに当たらない。modprobe r8169 や insmod r8169.ko でカーネルにオロードしてもだめである。何が原因なのか!

認識してる Cent 4.4 では

% sudo /sbin/lspci | grep Ether
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 01)

であり、kudzu -p

class: NETWORK
bus: PCI
detached: 0
device: eth0
driver: r8169
desc: "Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller"
network.hwaddr: 00:50:8D:9D:88:9C
vendorId: 10ec
deviceId: 8168
subVendorId: 147b
subDeviceId: 2410
pciType: 1
pcidom:    0
pcibus:  3
pcidev:  0
pcifn:  0

と、ドライバもきっちり当たっている。modprobe.conf 見るに

alias eth0 r8169

これだけ。ハマリマクリスティだよ。

というかデバイスドライバ周りの仕組みがよくわかってないのがいけないんだなー。教えてエロいえらい人!

yasui0906yasui09062007/05/29 21:08http://wiki.centos.org/HardwareList/CentOS5/RealTek/r1000
Cent5ではr1000でいけたりしませんかね。
いえ、いけめんでもやさしくもない、通りすがりのおぢさんですが(^^;

naoyanaoya2007/05/29 21:59だめでんなー。つか何が原因なんでしょうねえ。

yasui0906yasui09062007/05/29 22:39
そすかあ、
あとはMODULE_DEVICE_TABLEにデバイスIDがないとか?
Cent4と5でカーネルソースの drivers/net/r8169.c に差分ってないすかねえ。
いかんせん、ここではカニさん飼育してないもので・・・

yasui0906yasui09062007/05/29 23:17あれ?よく見たら vendorId: 0001 になってますね。
なんででしょ(^^;;、Cent4と5って同じハードですか?
あてずっぽうですがBIOSでDisableになってたりとかしませんよね(^^;;
でもその場合は vendorId: FFFF になりそうな気もしますが・・・

naoyanaoya2007/05/30 09:06ソースは kernel.org の使ってていっしょです。ハードも一緒です。BIOS も向上出荷時設定のままなんでいっしょです。

なんなんでしょうなああああ

yasui0906yasui09062007/05/30 11:53なぞいすね、
でも口上出荷時の設定って必ずしも同じとは限らないので念のため確認してみてもいいかも?あとは、4が動いてるマシンと5が動いてるマシンでLiveCDかなんかでブートさしてみて、本当にハードに差がないか見てみるくらいでしょうか。
Cent5で認識しないマシンに4を入れたらちゃんと認識するのかな。
もしくはその逆をやると認識しなくなるのかな・・・

naoyanaoya2007/05/30 12:12Cent 4.4 いれてみるす

yasui0906yasui09062007/05/30 12:31指定したPCIバスに繋がっているデバイスのコンフィグレーションレジスタをダンプするツールとかあるとおもしろげかな。/proc/使わずに自分で見に行くやつ。
# pciviewconf 0000:00:02.0
VendorID=0xhhhh
DeviceID=0xhhhh
みたいな感じ?

yasui0906yasui09062007/05/30 13:51もし、4でも5でも認識しないなら、
BIOS設定で内蔵NICをDisable -> 再起動 -> BIOS設定で内蔵NICをDisable -> 再起動
するともしかすると認識するようになったりして。
だめもとで試してみてもらえるといいかも(^^;
基本的にディストリビューションの違いでPCIデバイスのベンダーIDが変わる事ってないと思うんですよねえ。

yasui0906yasui09062007/05/30 13:53レちょっとしたマチガイ
"BIOS設定で内蔵NICをDisable -> 再起動 -> BIOS設定で内蔵NICをEnable -> 再起動"

yasui0906yasui09062007/05/30 14:16五月雨でごめんなさい。
・BIOSのバージョンを確認してみる(上げてみる)
・可能ならハードウエア診断ツールをかけてみる
・可能ならNICのファームのバージョンを確認する
あとなんかあるかな

naoyanaoya2007/05/30 17:57ただいま Cent 4.4 入れてます。

ドライバ周りの本を読んでたんですが vendorId + deviceId がシグネチャになってドライバが決まるのですね。なので認識してないほうは vendorId が 0x0001 だから変、と。また一つ学んだ!!

問題はなんで vendorId が 0x0001 かですねえ。0x0001 って見るからに特別な値のような感じがするんですが...

dump するツールは sysfs 経由でならわりと簡単に作れそう?

yasui0906yasui09062007/05/30 18:06sysfs経由だとカーネルの配下なので VendorID=0x0001 のままのはずですわ。
なので、直接PCIデバイスとお話してみたほうがいいとおもうのねん。
で、ユーザ空間からできないかと頑張ってみたんだけどちとくるしいのね。
なのでカーネルモジュールで実装して、初期化時に全PCIデバイスに pci_bus_read_config_word() してベンダID:デバイスID の一覧をログに出すくらいならさくっと作れそう。
とりあえずは、Cent 4.4のインストールをがむばってくらさい。

hirose31hirose312007/05/30 18:09コメントの量>本文の量

yasui0906yasui09062007/05/30 18:17トラックバックできない気がするのは気のせいなのかなあ(^^;;

naoyanaoya2007/05/30 18:21Cent 4.4 にしたら動きやがりましたよ!!!

class: NETWORK
bus: PCI
detached: 0
device: eth1
driver: r8169
desc: "Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller"
network.hwaddr: 00:50:8D:9D:10:39
vendorId: 10ec
deviceId: 8168
subVendorId: 147b
subDeviceId: 2410
pciType: 1
pcidom: 0
pcibus: 2
pcidev: 0
pcifn: 0

この通り vendorId 0x10ec になってやがるでやんす。BIOS 設定とかはまったくいじってなす。

カーネルが vendorId 取るときにバグってるてこと? でも同じカーネルソースに同じ .config 使ってこねたのになああああ。意味不明。

naoyanaoya2007/05/30 18:26まじ意味わっかんねッ、くわわあああああああ

naoyanaoya2007/05/30 18:30Cent5 で r8169 動かしたいよ、頼むよ、動いてよ!!!

yasui0906yasui09062007/05/30 18:32ああ、そうなんだ、
そうするとモジュール読み込むまでのブートシーケンスを追うのがいいかもだけど、ちと面倒なんで、
とりあえずCent5でドライバをモジュールじゃなくて組み込みにするとどうなりますかね。

yasui0906yasui09062007/05/30 18:34もしくは、Cent4と5でブートローダのカーネルパラメータが違ってたりしませんかね

naoyanaoya2007/05/30 18:41あー、もしかして pci=nommconf のせいかも。Cent 4.4 はブートのときに nommconf つき。よくわからんけど nommconf だと PCI の検出の方法がかわるんですよね、これかもなあ、ちょっとやってみまんつ。

yasui0906yasui09062007/05/30 18:46AMDベースのマシンなんすか?

naoyanaoya2007/05/30 18:47いや、Intel です。

naoyanaoya2007/05/30 18:49というかビンゴ。Cent 4.4 で pci=nommconf 削って boot したら kudzu さんが NIC 削除されたとみなされました。

http://www.nvnews.net/vbulletin/showthread.php?t=75299

とかみると "The pci=nommconf kernel parameter disables the MMCONFIG PCI configuration space access method, which forces the kernel back to PCI type 1 configuration accesses. The MMCONFIG access method appears to be severely broken on a number of systems; on such systems, the NVIDIA Linux graphics driver can't reliably access the PCI configuration space of NVIDIA devices, which results in various stability problems, particularly if multi-core CPUs are used with multiple GPUs."

てなことが書いてるんですが、この NIC もその類なのかもですねえ。PCI 検出の周りを深追いするか。

yasui0906yasui09062007/05/30 18:50もし pci=nommconf をつけて動くなら、.config で CONFIG_PCI_MMCONFIG=n にするのがよさそうですかね。

naoyanaoya2007/05/30 18:50ということで原因はまだややブラックボックス気味ですが MMCONFIG PCI configuration だと vendorId をスルーしちゃうのが問題で、nommconf すればとりあえずはうまくいく...というのが分かったす!

naoyanaoya2007/05/30 18:51お、コメントかぶった。

カーネルで disable にできるんですな。MMCONFIG PCI configuration というのが何かは後で深追いします!

yasui0906yasui09062007/05/30 18:51おお、おめでとうございます。
あとはCent5で動くことを確認できればおっけーすな

naoyanaoya2007/05/30 18:55ういうい、どもでした!

Cent 5 は明日やります! 実はあした Google のカンファレンスにでるのに現実逃避でサーバーいじってて資料まだ作ってない! やばい!

トラックバック - http://naoya.g.hatena.ne.jp/naoya/20070529
 | 
この日記のはてなブックマーク数