K8V Pro 3rd Eye マザーボードの GbE-LANを Linux2.6系で使う

検証環境

下記の環境で オンボード GbE-LAN の動作を確認しました

CPU Turion64 MT-37 (Socket754)
マザーボード K8V Pro 3rd Eye
NIC VIA Velocity
OS Linux kernel 2.6.11

kernel 2.6.11 では VIA6122 がサポートされていないようで ABIT社提供のドライバを入れました
ドライバはソースコードが提供されていて修正が必要でした 備忘録を兼ねてここにまとめます

ABIT社からドライバを取得

ABIT社のホームページ
から 「マザーボード」「ダウンロード-ドライバ」を選択します

ドライバ選択
続いて マザーボードを選択

ドライバ選択
マザーボード選択
GbEのドライバを選択してダウンロードします

ドライバ選択
ドライバは圧縮ファイルになっていて展開すると linux のディレクトリが
見えるのでこれを Linux上に転送します

ドライバ選択

velocityget.tgz なるファイルがありますが これが ABIT社提供のソースコードです
Linux上で解凍すると 以下のようなファイルが確認できます

root@localhost 1.19 # ls
Makefile        velocity_desc.h  velocity_proc.h   velocityget.ko
kcompat.h       velocity_mac.h   velocity_proc.o   velocityget.mod.c
linux.txt       velocity_main.c  velocity_stats.h  velocityget.mod.o
velocity.h      velocity_main.o  velocity_wol.c    velocityget.o
velocity_cfg.h  velocity_mii.h   velocity_wol.h
velocity_dbg.h  velocity_proc.c  velocity_wol.o

linux.txt の解説ファイルを読むと root 権限にて make installすればよいとのこと

root@localhost 1.19 # make install
head: `-1' option is obsolete; use `-n 1' since this will be removed in the future
make -C /lib/modules/2.6.11/build SUBDIRS=/root/admin/via6122/1.19 modules
make[1]: Entering directory `/usr/src/linux-2.6.11'
head: `-1' option is obsolete; use `-n 1' since this will be removed in the future
  CC [M]  /root/admin/via6122/1.19/velocity_main.o
/root/admin/via6122/1.19/velocity_main.c: In function `velocity_suspend':
/root/admin/via6122/1.19/velocity_main.c:2503: error: 関数 `pci_save_state' に対する引数が多すぎます
/root/admin/via6122/1.19/velocity_main.c: In function `velocity_resume':
/root/admin/via6122/1.19/velocity_main.c:2540: error: 関数 `pci_restore_state' に対する引数が多すぎます
make[2]: *** [/root/admin/via6122/1.19/velocity_main.o] Error 1
make[1]: *** [_module_/root/admin/via6122/1.19] Error 2
make[1]: Leaving directory `/usr/src/linux-2.6.11'
make: *** [default] Error 2
root@localhost 1.19 #

実際には kernel2.6系でエラーが出ます
原因は kernel2.6系では PCIデバイス固有の情報を 退避/復帰 させる
pci_save_state() pci_restore_state() の仕様が変更されているためです

ソースコードの修正

修正範囲はそれほど大きくないので パッチを提供するよりは
直接エディッタで修正したほうが早いです

velocity_main.c その1

修正前はこんな感じです

   2493 static int
   2494 velocity_suspend(struct pci_dev *pcid, u32 state)
   2495 {
   2496     PVELOCITY_INFO pInfo = pci_get_drvdata(pcid);
   2497     struct net_device *dev = pInfo->dev;
   2498     unsigned long flags;
   2499
   2500     netif_stop_queue(dev);
   2501     spin_lock_irqsave(&pInfo->lock, flags);
   2502
   2503     pci_save_state(pcid, pInfo->pci_state);
   2504
   2505 #ifdef ETHTOOL_GWOL
   2506
  

以下のように修正加えます

   2493 static int
   2494 velocity_suspend(struct pci_dev *pcid, u32 state)
   2495 {
   2496     PVELOCITY_INFO pInfo = pci_get_drvdata(pcid);
   2497     struct net_device *dev = pInfo->dev;
   2498     unsigned long flags;
   2499     /* modified for kernel2.6 */
   2500     int i;
   2501
   2502     netif_stop_queue(dev);
   2503     spin_lock_irqsave(&pInfo->lock, flags);
   2504
   2505     /* modified for kernel2.6 */
   2506     /* pci_save_state(pcid, pInfo->pci_state); */
   2507     /* save to pci_dev.saved_config_space directly... */
   2508     for ( i = 0; i != 16; i++ )
   2509         pcid->saved_config_space[ i ] = pInfo->pci_state[ i ];
   2510     pci_save_state(pcid);
   2511
   2512 #ifdef ETHTOOL_GWOL
  

velocity_main.c その2

修正前はこんな感じです

   2530 static int
   2531 velocity_resume(struct pci_dev *pcid)
   2532 {
   2533     PVELOCITY_INFO pInfo = pci_get_drvdata(pcid);
   2534     unsigned long flags;
   2535     struct net_device *dev = pInfo->dev;
   2536
   2537     pci_set_power_state(pcid, 0);
   2538     pci_enable_wake(pcid, 0, 0);
   2539
   2540     pci_restore_state(pcid, pInfo->pci_state);
   2541
   2542     mac_wol_reset(pInfo->pMacRegs);
  

以下のように修正加えます

   2537 static int
   2538 velocity_resume(struct pci_dev *pcid)
   2539 {
   2540     PVELOCITY_INFO pInfo = pci_get_drvdata(pcid);
   2541     unsigned long flags;
   2542     struct net_device *dev = pInfo->dev;
   2543     /* modified for kernel2.6 */
   2544     int i;
   2545
   2546     pci_set_power_state(pcid, 0);
   2547     pci_enable_wake(pcid, 0, 0);
   2548     /* modified for kernel2.6 */
   2549     /* pci_restore_state(pcid, pInfo->pci_state); */
   2550     pci_restore_state(pcid);
   2551     /* restore from pci_dev.saved_config_space directly... */
   2552     for ( i = 0; i != 16; i++ )
   2553         pInfo->pci_state[ i ] = pcid->saved_config_space[ i ];
   2554
   2555     mac_wol_reset(pInfo->pMacRegs);
  

動作確認

下記のように動作確認を行います

root@localhost 1.19 # make install
head: `-1' option is obsolete; use `-n 1' since this will be removed in the future
make -C /lib/modules/2.6.11/build SUBDIRS=/root/admin/via6122/1.19 modules
make[1]: Entering directory `/usr/src/linux-2.6.11'
head: `-1' option is obsolete; use `-n 1' since this will be removed in the future
  CC [M]  /root/admin/via6122/1.19/velocity_main.o
  LD [M]  /root/admin/via6122/1.19/velocityget.o
  Building modules, stage 2.
  MODPOST
  LD [M]  /root/admin/via6122/1.19/velocityget.ko
make[1]: Leaving directory `/usr/src/linux-2.6.11'
mkdir -p /lib/modules/2.6.11/kernel/drivers/net
install -m 644 -o root velocityget.ko /lib/modules/2.6.11/kernel/drivers/net
/usr/sbin/depmod -a || true
root@localhost 1.19 #
  

モジュールのコンパイルとインストールは成功しました

root@localhost deer # modprobe velocityget
root@localhost deer # ifconfig eth0 192.168.0.3 up
root@localhost deer #
root@localhost deer # ifconfig eth0
eth0      リンク方法:イーサーネット  ハードウェアアドレス **:**:**:**:**:**
          inetアドレス:192.168.0.3 ブロードキャスト:192.168.0.255 マスク:255.255.255.0
          inet6アドレス: fe80::250:****:****:****/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:142 errors:0 dropped:0 overruns:0 frame:0
          TX packets:108 errors:0 dropped:0 overruns:0 carrier:0
          衝突(Collisions):0 TXキュー長:1000
          RX byteUse of uninitialized value in scalar chomp at /home/deer/.emacs.d/mapae-0-10-20051017/mapae.pl line 514.
Use of uninitialized value in scalar chomp at /home/deer/lisp/mapae.pl line 514, <> line 271.
s:7073 (6.9 Kb)  TX bytes:7727 (7.5 Kb)
          割り込み:10 ベースア?Use of uninitialized value in scalar chomp at /home/deer/lisp/mapae.pl line 514.
疋譽?:0xb800

root@localhost deer #
root@localhost deer # lsmod
Module                  Size  Used by
velocityget            52768  0
nvidia               3917116  12
root@localhost deer #
  

モジュールのロードに成功しました 通信できることまで確認します

root@localhost deer # rmmod velocityget
root@localhost deer # ifconfig eth0
eth0: error fetching interface information: デバイスが見つかりません
root@localhost deer # lsmod
Module                  Size  Used by
nvidia               3917116  12
root@localhost deer #
  

モジュールのデタッチも正常に行われることを確認します

インストール

velocitygetモジュールは カーネルモジュールです
Linuxデストリビューションにより設定方法は異なりますが
Gentooベースの環境で /etc/modules.autoload に書き加えました

#
# Note that this file is for 2.6 kernels.
#
# Add the names of modules that you'd like to load when the system
# starts into this file, one per line.  Comments begin with # and
# are ignored.  Read man modules.autoload for additional details.

# For example:
# 3c59x
velocityget
nvidia
  

再起動してネットワークが使えていれば完了です

最新の情報1

最新のカーネルソースでは velocitygetのドライバが提供されているので上記作業は不要です (Linux kernel 2.6.17 で確認)

最新の情報2

VIA Velocity のドライバはどうやら IEEE802.1Q VLANで通信ができない模様
こちらの環境でも確認しました (Linux kernel 2.6.19.1 で確認)
いろいろ確認したのですが
・0x8100 TPID での受信が不可能のようだ
・0x9100 TPID に変更すると通信できた (include/linux/if_ether.h の修正が必要)
・もしくは ここの情報ページにて カーネルパッチが公開されています