link もっと前
   2009年 9月 4日 -
      2009年 9月 4日  
link もっと後

link 未来から過去へ表示(*)
link 過去から未来へ表示

日々

link permalink

r8168 PCI-e GbE とカーネル 2.6.30

家のファイルサーバの Linux カーネルバージョンを 2.6.30.5 にアップデートしたところ、r8168 PCI-e ギガビットイーサネットドライバがコンパイルできなくなりました。

原因は NAPI の関数名が一部変わったためです。netif_rx_xx 系が廃止され、napi_xx へ移行しました。これにより netif_rx_xx 系を使用している部分がリンクエラーとなります。

もうひとつ原因があって irqreturn_t の typedef が int から enum irqreturn へ変わり、IRQ_HANDLED がマクロではなく列挙型になったためです。これにより 2.4.x とのコンパチを保つための定番処理(※)の判定を誤って、irqreturn_t を void と定義してしまいます。

このため割り込みハンドラが値を返さない関数として定義されてしまい、ハンドラ内で return IRQ_HANDLED; などとしている部分がコンパイルエラーになります。

以上の変更点を踏まえたパッチは以下の通り。Realtek が提供している r8168-8.012.00 に当てます。


diff -r 2aec411ad986 src/r8168.h
--- a/src/r8168.h       Sat Aug 29 04:02:18 2009 +0900
+++ b/src/r8168.h       Fri Sep 04 23:14:44 2009 +0900
@@ -37,11 +37,13 @@
 #define CHECKSUM_PARTIAL CHECKSUM_HW
 #endif

+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
 #ifndef IRQ_HANDLED
 #define irqreturn_t void
 #define IRQ_HANDLED
 #define IRQ_NONE
 #endif
+#endif /* #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30) */

 #ifndef HAVE_FREE_NETDEV
 #define free_netdev(x) kfree(x)
@@ -251,7 +253,11 @@
        #define RTL_GET_NETDEV(priv_ptr)                        struct net_device *dev = priv_ptr->dev;
        #define RTL_RX_QUOTA(ndev, budget)                      budget
        #define RTL_NAPI_QUOTA_UPDATE(ndev, work_done, budget)
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
+       #define RTL_NETIF_RX_COMPLETE(dev, napi)                napi_complete(napi)
+       #define RTL_NETIF_RX_SCHEDULE_PREP(dev, napi)           napi_schedule_prep(napi)
+       #define __RTL_NETIF_RX_SCHEDULE(dev, napi)              __napi_schedule(napi)
+ #elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
        #define RTL_NETIF_RX_COMPLETE(dev, napi)                netif_rx_complete(dev, napi)
        #define RTL_NETIF_RX_SCHEDULE_PREP(dev, napi)           netif_rx_schedule_prep(dev, napi)
        #define __RTL_NETIF_RX_SCHEDULE(dev, napi)              __netif_rx_schedule(dev, napi)

このパッチを使う方がもしいましたら、ご自由にどうぞ。一応、我が家のファイルサーバ上では元気に動いております。が、ご利用の際は自己責任でよろしくお願いいたします。

変化のとき

今回紹介した変更点が、いつカーネルに取り込まれたかについては Linux kernel の git リポジトリを調べてね…というのはちょっと無責任ですので、紹介しておきます。

細かいログは参考の章に譲り、変更点がマージされた時期と関連するバージョンタグだけ挙げます。時間は全て UTC 換算です。

  • 2009 04/07 21:25:01: Linux 2.6.30-rc1
  • 2009 03/26 23:06:50: irqreturn_t のパッチがマージ
  • 2009 03/23 23:12:14: Linux 2.6.29
  • 2009 03/16 14:56:58: NAPI のパッチがマージ
  • 2009 03/13 02:39:28: Linux 2.6.29-rc8

従って私のパッチでは、NAPI は Linux 2.6.29 未満であれば古い API を使い、irqreturn_t は Linux 2.6.30 未満であれば古い定義を使うようにしています。

(※)irqreturn_t を使うハンドラを、古い 2.4.x 系とコードコンパチにするコードとして、カーネルのコメント中で紹介されていた方法です。r8168 が悪いわけではありません。

参考

以下は irqreturn_t が変化したときのログ。

irqreturn_t の定義が変わったときのマージログとオリジナルのパッチのログ

----- マージ
commit a8416961d32d8bb757bcbb86b72042b66d044510
Merge: 6671de3 fc2869f
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Thu Mar 26 16:06:50 2009 -0700

    Merge branch 'irq-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/gi
t/tip/linux-2.6-tip

----- パッチ
commit bedd30d986a05e32dc3eab874e4b9ed8a38058bb
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Tue Sep 30 23:14:27 2008 +0200

    genirq: make irqreturn_t an enum

    Impact: cleanup

    Remove the 2.4 compabiliy cruft

もうひとつ NAPI が変化したときのログ。

netif_rx 系が削除されたときのマージログとオリジナルのパッチのログ

----- マージ
commit 8e91f178a2bb4a3e52e76f6263c251ffb816eb17
Merge: 8032b52 ea8dbdd
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Mon Mar 16 07:56:58 2009 -0700

    Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6

----- パッチ
commit 9fae6c3f648e38f023b99b5f5a5280907b2e796e
Author: Ilya Yanok <yanok@emcraft.com>
Date:   Fri Mar 13 09:51:46 2009 -0700

    dnet: replace obsolete *netif_rx_* functions with *napi_*

    *netif_rx_* functions is obsolete and removed in newer kernels so
    we need to use corresponding *napi_* functions instead.

こんなとこかな。

[編集者: すずき]
[更新: 2009年 9月 5日 00:16]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
   2009年 9月 4日 -
      2009年 9月 4日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 12/10 12:33

カレンダー

<2009>
<<<09>>>
--12345
6789101112
13141516171819
20212223242526
27282930---

最近のコメント 5件

  • link 18年11月28日
    すずき 「Linux に contribute す...」
    (更新:12/10 12:33)
  • link 18年11月28日
    T4 「やっぱり貴方でしたか、ご苦労さまでした。...」
    (更新:12/05 09:20)
  • link 18年11月28日
    すずき 「RK3228 じゃなくて RK3288 ...」
    (更新:12/05 02:19)
  • link 18年11月28日
    すずき 「ありがとうございます。Linux のコミ...」
    (更新:12/05 02:04)
  • link 18年12月01日
    すずき 「私も最初、HDD, SSD は使いまわそ...」
    (更新:12/04 12:49)

最近の記事 3件

link もっとみる
  • link 18年11月29日
    すずき 「[ROCK64 のアナログオーディオが動いた] 先日(2018年 ...」
    (更新:12/03 10:21)
  • link 18年12月01日
    すずき 「[PC パワーアップ計画] 普段、家の PC のパワー不足を感じる...」
    (更新:12/02 18:32)
  • link 18年11月28日
    すずき 「[ROCK64 の I2S1 が動いた] 先日(2018年 11月...」
    (更新:12/02 16:34)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報