昨日長々と書きましたが、実はRealtekのサイトにて公開されているr8168ドライバのバージョン8.014.00を使えばパッチもへったくれも必要ありませんでした。
他の変更(バグフィクスかな?)も入っているようなので、8.012.00にこだわる理由がなければさくっとアップデートした方が良いと思います。
まあ、一つの勉強にはなったけど、あんまり意味が無かったな…。
家のファイルサーバの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換算です。
従って私のパッチでは、NAPIはLinux 2.6.29未満であれば古いAPIを使い、irqreturn_tはLinux 2.6.30未満であれば古い定義を使うようにしています。
(※)irqreturn_tを使うハンドラを、古い2.4.x系とコードコンパチにするコードとして、カーネルのコメント中で紹介されていた方法です。r8168が悪いわけではありません。
以下は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が変化したときのログ。
----- マージ
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.
こんなとこかな。
昨日一日、薬飲んで安静にしていたおかげで、熱はだいぶ下がりました。お腹は痛いままです。
熱が下がるとき(下がった後?)って滝のように汗をかきますが、今回は布団に人の形が見えるくらい汗が出ました。起きたら服がびしょびしょだし、自分でもびっくり。
まあ、それは良しとして。会社からもう一度インフルエンザの検査を受けろと言ってきました。2回もやって陰性でしたと言っても、もう一回だけやって欲しいと。もうほとんど熱もないし、そんなことしても無駄にお金がかかる(※)だけで意味がない、と伝えても、とにかくもう一回だけやって欲しいの一点張り。
検査代は後で会社が払ってくれると言うから、個人的に損はしませんけど…会社のやることは意味が分からん。まあ、逆らっても仕方ないので病院へ。
(※)インフルエンザの検査は基本的には熱があるときに受けるものです。熱がなければ、本来不要な検査を行ったことになりますので健康保険が効きません。つまり10割負担です。
病院で体温を測ると36.4℃でした。ド平熱もいいとこです。
お医者さんには、熱もないしインフルエンザの検査は実費になりますよ?それでもやります?って言われましたが、とにかく検査をお願いしました。理由?そんなの私にもわかりませんて。
結果は陰性でした。当たり前です!って感じで、お医者さんも若干呆れてました。ですよねー。
この不要な検査で7千円以上飛んでいきました。MOTTAINAIよ!
それと、お腹痛かった件は腸炎と診断されました。新たにお腹に優しい薬が処方されておしまい。
部屋を隔離されると、監視じゃなくて介護レベルが一段階上がるらしくて、管理人さんがことある毎に部屋を訪れます。
そのせいで今日は朝から、朝食はどうするだの、今日病院に行くと言っていたがどうなっただの、病院には隣のなんとかさんと一緒に行ってくれだの、一々寝てるところを起こされます。
色々見ていただけるのはありがたいんですが、本音を言えば、勝手にやるから放っておいて欲しいです。疲れる…。
昨日よりさらに具合が悪くなった気がしたんで体温を測ったら、39℃を超えてました。お腹も痛いし…あーもう最悪だ。
昨日お医者さんが言っていたとおり2回目の通院です。隣に隔離されている人と一緒に行きました。
病院について体温を測ると39.6℃でした。明らかに具合が悪くなっています。この暑い中、外を歩くのが体に良いはずがありません。
通常、病院ってのは待合室で待ちますが、昨日今日と、体温があまりに高いという理由で別部屋に隔離されました。院内感染を警戒しているのだろうか?
で、インフルエンザの検査は陰性でした。良かった良かった。
寝間着が汗びっしょりになったので、自分の部屋に着替えを取りに行ったところ、平日の昼なのに相部屋の人が部屋に居るじゃないですか。
話を聞くと、私がインフルエンザになったというデマが飛んでいるらしく、相部屋の人は一週間の自宅謹慎を命じられたのだとか。え?え?俺インフルエンザじゃないよ?何言っちゃってるの?
どうも風邪引いた本人からの報告以外に、寮の管理人さんから逐一上がっている情報があるらしくて、そっちの情報と混乱している感じがします。
それにしても情報網がいい加減すぎてびっくり。おばはんの井戸端会議レベルですね。
風邪をひきました。朝から仕事中にどうも朦朧とするし、定時近くなってきて寒気までしてきました。体温だけでも見ておこうと思って、社内の保健室みたいなところへ。
保健室へ定時ギリギリに行ったら、すごく鬱陶しそうな顔をされました。会社の保健室は何があろうと定時で終わりみたいです。銀行みたいですね。
肝心の体温は37.6℃でした。これは具合悪くなるわけだわ。
看護士?さんに結果を見せるとまた鬱陶しそうな顔をされて「マスクして、早く病院行ってください。」と言われて帰されました。いつまでもいると部屋閉められないでしょ、はよ帰れーはよ帰れー、というオーラが透けて見えますね。
というわけで定時に帰りました。
帰宅してまず、言いつけの通り病院へ。普段は風邪で病院なんか行きません。でも今はインフルエンザ流行期だけに、潔白を証明しておかないと後でインフルエンザの感染源扱いされる可能性があります。
病院で測った時には熱がさらに1℃上がって、38.6℃になっていました。くそ暑い中で会社から寮に帰ってきたり、病院まで歩いていったりしたせいでしょう。
インフルエンザの検査結果は陰性でした。ただしお医者さん曰く「熱が出てから12時間以内だと陽性でも陰性になることがあるから、念のため明日もう一回やりましょう。」とのこと。
んで、部屋で寝ていたら、夜中いきなり寮の管理人さんが来て、部屋を移動させられました。風邪引いてるあやしい奴は隔離するカイシャの方針なんだとさ。
というわけで、近隣に誰もいない部屋に移動させられ、今後はそこで寝泊まりすることになりました。
部屋なんざどこでもいいんですが、寝てたところを起こされて、歩かされたもんだからまた体調が悪くなりました。寮にいると一向に良くなる気がしない。
< | 2009 | > | ||||
<< | < | 09 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | - | - | - |
合計:
本日: