http://wiki.bit-hive.com/tomizoo/pg/Loadable%20Kernel%20Module%A4%CE%BA%EE%A4%EA%CA%FD
を試してみたら、カーネル 3.2.0 でもプログラムと Makefile は動作した。
(ただし、config.h は先日のインチキなので、これからはよしたほうがいいだろう)。
つまり、モジュールのファイル名が *.ko になったとか、そういった特徴はカーネル 2.6 のころから変わっていないわけだ。
そうおもって VNT6656 ドライバの Makefile を読み直してみると、なぜ全然まともなビルドプロセスにならないかが見えてきた。
この Makefile は、uname -r を sed でホゲってカーネルバージョンをとりだして、それで gmake の ifeq を使って分岐しているんだが、そこで 2.6 決め打ちをしているのである。そんなら話は簡単、強引に 2.6 という文字列を作らせてしまえばいいのである。
ここで、 sed の正規表現での A or B は A\|B ということに注意。はまる。
27c27
< KVER := $(shell uname -r | cut -c1-3 | sed 's/2\.[56]/2\.6/')
---
> KVER := $(shell uname -r | cut -c1-3 | sed 's/2\.[56]\|3\.2/2\.6/')
これで make から make -C なんちゃらを呼ぶプロセスに入る。
次のエラーは、ずっとまっとうである。
$ make2つあるみたいだけど、先の方(390行目)をチェックしてみると、struct net_device_ops に ndo_set_multicast_list というメンバがないみたいなんだよね。
make -C /lib/modules/3.2.0-51-generic-pae/build SUBDIRS=/home/toyoda/work-vt6656/driver modules
make[1]: Entering directory `/usr/src/linux-headers-3.2.0-51-generic-pae'
CC [M] /home/toyoda/work-vt6656/driver/main_usb.o
/home/toyoda/work-vt6656/driver/main_usb.c:390:2: error: unknown field 'ndo_set_multicast_list' specified in initializer
/home/toyoda/work-vt6656/driver/main_usb.c:390:2: warning: initialization from incompatible pointer type [enabled by default]
/home/toyoda/work-vt6656/driver/main_usb.c:390:2: warning: (near initialization for 'vntwusb_netdev_ops.ndo_select_queue') [enabled by default]
/home/toyoda/work-vt6656/driver/main_usb.c: In function 'device_set_multi':
/home/toyoda/work-vt6656/driver/main_usb.c:2454:26: warning: unused variable 'mclist' [-Wunused-variable]
そこらに落ちてる 2.6.32 のヘッダと3.2のヘッダを見比べてみると、ほんとうにそのメンバだけなくなっている。何が代替だか自明でなさそうなので、とりあえず消しちゃうことにする。
@@ -387,7 +387,9 @@
.ndo_stop = device_close,
.ndo_get_stats = device_get_stats,
.ndo_start_xmit = device_xmit,
+#ifdef HAVE_MULTICAST
.ndo_set_multicast_list = device_set_multi,
+#endif
.ndo_do_ioctl = device_ioctl,
};
#endif
すると、他の警告がいっぱい表示されながらもビルドに成功して vntwusb.ko ができた。
試すのはまた明日移行にしようかな。遅いし。
0 件のコメント:
コメントを投稿