Realtek RTL8139C(8139too)カード導入
今回、PCMCIAカードのネットワークカードを導入します。
選択したのはPlanexのFNW-3800-TXです。このカードを選択した理由はチップセットが分かっていた事、比較的安かった事の2点です。同じくらいの値段でいくつもカードがでていますが、搭載されているチップが分からないとドライバを組み込むことが出来ないのでそういったカードはすべて検討しませんでした。本当なら3comのカードとかがほしかったのですが値段が高めなので...。
このPCMCIAカードはチップセットとしてRealtek RTL8139Cを使用しています。

購入後、早速使おうと思ってPCに挿入したのですが全然使うことが出来ませんでした。
Realtek RTL8139Cならば、ドライバも入っているし、このカードを挿せば直ぐに使えるだろうと思っていたのですが、実際はそんなことはなく、ちょっとばかし手を加える必要がありました。

Realtek RTL8139Cチップはドライバとして8139tooを使用します。
Turbo Linux 8 Serverにもこのドライバは入っているのですが、そのままの状態ではドライバが正常に読み込まれません。

lspciで確認すると、pcmciaのカードは認識されています。
[root@ryocho /tmp]# lspci
〜省略〜
02:00.0 Ethernet controller: Planex Communications, Inc: Unknown device ab07 (rev 10)
しかし、lsmodで確認するとドライバが読み込まれていないことが確認できます。
また、手動で8139tooを手動で読み込もうとしても該当するデバイスが無いといわれてしまいます。
[root@ryocho /tmp]# insmod 8139too
Using /lib/modules/2.4.18-5/kernel/drivers/net/8139too.o
/lib/modules/2.4.18-5/kernel/drivers/net/8139too.o: init_module: No such device
Hint: insmod errors can be caused by incorrect module parameters, including invalid IO or IRQ parameters.
You may find more information in syslog or the output from dmes
g


まず、8139tooの最新版のドライバをダウンロードしてきました。
http://sourceforge.net/projects/gkernel/
私がダウンロードしたドライバのバージョンは0.9.26でした。
ソースコードを参照すると「Planex FNW-3800-TX 10/100 CardBus」などとあるので、このカードが対応されていることが分かります。
※ソースコードをコンパイルするためにはカーネルソースコードが必要です。
makeしてみたのですが、エラーが発生してコンパイルが通りません。
[root@ryocho /tmp]# tar zxvf 8139too-0.9.26.tar.gz
[
root@ryocho /tmp]# cd 8139too-0.9.26
makeする前にMakefileを一部訂正します。
#INCLUDES=/usr/src/linux/include
KINCLUDES=/spare/cvs/linux_2_3/include
    ↓ /usr/src/linux/includeの方を有効にします。
KINCLUDES=/usr/src/linux/include
#KINCLUDES=/spare/cvs/linux_2_3/include
[
root@ryocho 8139too-0.9.26]# make
gcc -O2 -fomit-frame-pointer -D__KERNEL__ -I/usr/src/linux/include -DCPU=586 -march=i586 -Wall -Wstrict-prototypes -O2
-fomit-frame-pointer -fno-strict-aliasing -pipe -DMODULE -c 8139too.c
8139too.c: In function `netdev_ethtool_ioctl':
8139too.c:2407: `ETHTOOL_GSTATS' undeclared (first use in this function)
8139too.c:2407: (Each undeclared identifier is reported only once
8139too.c:2407: for each function it appears in.)
8139too.c:2408: variable `estats' has initializer but incomplete type
8139too.c:2408: warning: excess elements in struct initializer
8139too.c:2408: warning: (near initialization for `estats')
8139too.c:2408: storage size of `estats' isn't known
8139too.c:2408: warning: unused variable `estats'
make: *** [8139too.o] Error 1
カーネルのヘッダを検索してもETHTOOL_GSTATSなんて定数はどこにも宣言されていません。
仕方がないので、カーネルソースコードに存在する/usr/src/linux/drivers/net/8139too.cファイルにFNW-3800-TX対応部分を書き写してコンパイルすることにしました。 これなら、コンパイル出来ないことはあり得ないはず。
手を加えるのは3カ所です。
/usr/src/linux/drivers/net/8139too.c
typedef enum {
        RTL8139 = 0,
        RTL8139_CB,
       
  〜省略〜
        RTL8129,
       
FNW3800TX,   <-- この1行を追加します。(任意の文字列でよいですが、赤色の2カ所は同じ値を指定します。)
} board_t;



/* indexed by board_t, above */
static struct {

       const char *name;
       u32 hw_flags;
       } board_info[] __devinitdata = {
       { "RealTek RTL8139 Fast Ethernet", RTL8139_CAPS },
       
〜省略〜
       { "RealTek RTL8129", RTL8129_CAPS },
       { "
Planex FNW-3800-TX 10/100 CardBus", RTL8139_CAPS },  <-- この1行を追加します。(青色で指定した箇所は任意の文字列です。)
};


static struct pci_device_id rtl8139_pci_tbl[] __devinitdata = {
        {0x10ec, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
     
〜省略〜
        {0x1259, 0xa117, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ALLIED8139 },
        {
0x14ea, 0xab07, PCI_ANY_ID, PCI_ANY_ID, 0, 0, FNW3800TX }, <-- この1行を追加します。(赤色は先と同じ値、緑色はlspci -nで取得できる値)
     
〜省略〜
 };

余談になりますが、ここで重要なのはベンダーを表す0x14eaとデバイスIDの0xab07です。(pci_deveice_id構造体の1,2番目)
これは、lspci -nとすることで知ることが出来ます。
[root@ryocho tmp]# lspci -n
02:00.0 Class 0200: 14ea:ab07 (rev 10)
FNW-3800-TX以外のRealtek RTL8139Cチップを使うカードでも、今回の方法で認識出来ると思われます。

/usr/src/linux/drivers/net/8139too.cを作業ディレクトリにコピーし、上記改修を加え、再びmakeをすればコンパイルは通りました。しかし、depmodすると警告がでます。
(※2.4.18は私の利用しているカーネルバージョンです。環境により値が異なります。uname -aでバージョンの確認ができます。)
ソースファイルのコピー
[root@ryocho 8139too-0.9.26]# cp /usr/src/linux/drivers/net/8139too.c .
8139too.cに上記の修正を加えます。
makeします。

[root@ryocho 8139too-0.9.26]# make
作成されたモジュールを所定のディレクトリへコピーします。
[root@ryocho 8139too-0.9.26]# cp 8139too.o /lib/modules/2.4.18/kernel/drivers/net/8139too.o
モジュールの依存関係を解決します。
[
root@ryocho 8139too-0.9.26]# depmod -a
depmod: *** Unresolved symbols in /lib/modules/2.4.18-5/kernel/drivers/net/8139too.o
depmodでエラーがでてしまいましたが、まずはコンパイルしたものが正常に動作するか確認する為、先へ進みます。
8139tooドライバは以下の通り組み込みます。
8139tooにはmiiが必要なので、先に組み込む必要があります。
[root@ryocho 8139too-0.9.26]# insmod mii
[root@ryocho 8139too-0.9.26]# insmod 8139too
miiを組み込む前に8139tooを組み込もうとすると以下の様なエラーがでます。
[root@ryocho 8139too-0.9.26]# insmod 8139too
Using /lib/modules/2.4.18-5/kernel/drivers/net/8139too.o
olved symbol mii_ethtool_sset
/lib/modules/2.4.18-5/kernel/drivers/net/8139too.o: unresolved symbol mii_link_ok
/lib/modules/2.4.18-5/kernel/drivers/net/8139too.o: unresolved symbol mii_ethtool_gset
/lib/modules/2.4.18-5/kernel/drivers/net/8139too.o: unresolved symbol mii_nway_restart

エラーがでなければモジュールが組み込まれたことを確認します。
[root@ryocho root]# lsmod
Module              Size    Used by       Not tainted
8139too         14528       1
mii                 1200       0 [8139too]

〜省略〜
早速、ネットワークを開始します。
[root@ryocho root]# ifup eth0
Determining IP information for eth0... done.
ネットワークの設定がまだの場合は ifupする前にturbonetcfgを起動するか、/etc/sysconfig/network-scripts/ifcfg-eth0ファイルを編集(作成)して下さい。

これで、カードが使えるようになっているはずです。 さて、先ほどのdepmodした際のエラーを取り除きます。
おそらく、makeした際のコンパイルオプションのせいだと思うのですが、何が悪いかはよく分かりません。
仕方ないので、make modulesして実際にカーネルソースコードをコンパイルする際にどの様なオプションが使われているか調べてみました。
gcc -D__KERNEL__ -I/usr/src/linux-2.4.18/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -pipe -mpreferred-stack-boundary=2 -march=k6 -DMODULE -DMODVERSIONS -include /usr/src/linux-2.4.18/include/linux/modversions.h -nostdinc -I /usr/lib/gcc-lib/i586-pc-linux/2.96/include -DKBUILD_BASENAME=8139too -c -o 8139too.o 8139too.c

調べた結果、次のオプションを追加すればよいみたいです。
”-include /usr/src/linux-2.4.18/include/linux/modversions.h”
Makefileを以下の通り修正します。
KERNFLAGS= \
        -D__KERNEL__ -I$(KINCLUDES) $(CPUFLAGS) $(SMPFLAGS) \
        -Wall -Wstrict-prototypes \
        -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe \
        -DMODULE
\<--追加
        -include /usr/src/linux/include/linux/modversions.h
<--追加
もし、カーネルソースコード内にmodversions.hが無い場合は、以下の手順で作成します。
カーネルを一度もmakeした事がない環境ではおそらく無いです。
[root root]# cd /usr/src/linux
今までに一度もmakeした事がないのならばmake menuconfigでメニューを立ち上げ、
何もせずExitする。この時の、保存確認はYesを選択すること

[
root linux]# make menuconfig
依存関係の構築。この時modversions.hが作成されるようです。
[
root linux]# make dep
これで、modversions.hが作成されています。

これでコンパイルしたものをさきと同じディレクトリ(/lib/modules/2.4.18/kernel/drivers/net/)へ組み込めばdepmodでのエラーは無くなりました。
依存関係が解決されているので、先ほどみたいにinsmodでmii,8139tooの両方を組み込まなくても、
modprobe 8139too
とするだけで、自動的にmiiも組み込まれるはずです。
これでドライバの問題は解決しました。


次は、カードを挿入しただけで、自動的にドライバが読み込まれるようにしたいと思います。
/etc/pcmcia/configに以下の3行を加えます。
card "FNW-3800-TX"     <-- 名前は適当です。
    pci 0x14ea, 0xab07    
<-- ドライバ改修でも使用したベンダーIDとデバイスIDです。
    bind "8139too"
         <-- ドライバです。
これでカードを挿入するだけで認識されるようになります。
ただし、HotPlugに対応させる為にはmurasakiを起動しておく必要があります。起動されていない場合は起動して下さい。

また、PCの起動時にPCカードが認識される為には、murasaki,pcmcia,networkの順番に起動される必要があります。以下の手順で正しい順番に起動するようにして下さい。
/etc/rc3.dや/etc/rc5.dを確認して次のようにSに続く数字がmurasaki < pcmcia < networkになるようにしてください。(頭文字のSは起動することを意味します。Sに続く数字は起動する順番を表します。)
[root@ryocho rc3.d]# ls
S02kparam@ S09pcmcia@ S20random@ S40atd@ S75keytable@ S99local@
S08murasaki@ S10network@ S30syslog@ S50xinetd@ S90crond@
私の環境でははpcmciaがS45pcmicaとなっていたので、S09pcmciaとしています。
murasakiについてもS35murasakiだったので、S08murasakiとしました。
私の環境では、S08〜,S09〜,S10〜と数字が続いていますがその必要はありません。順番さえ守られればOKです。

設定は以上です。!(^^)!

お問い合わせはwebmaster@ryouto.jpまで。
Copyright (C)2003 ryouto.jp. All Rights Reserved.