るいすときのこの物語

オタクエンジニアの雑記

Ubuntu 16.04 LTS で PT3 / PT2 のドライバーがインストールできない問題「error: implicit declaration of function ‘vmalloc’」


エラーログ

error: implicit declaration of function ‘vmalloc’ [-Werror=implicit-function-declaration]
     channel->buf = vmalloc(CHANNEL_DMA_SIZE);
                    ^
/home/luis/pt1-c8688d7d6382/driver/pt1_pci.c:857:18: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
     channel->buf = vmalloc(CHANNEL_DMA_SIZE);
                  ^
/home/luis/pt1-c8688d7d6382/driver/pt1_pci.c:862:18: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
     channel->buf = vmalloc(BS_CHANNEL_DMA_SIZE);
                  ^
/home/luis/pt1-c8688d7d6382/driver/pt1_pci.c:911:5: error: implicit declaration of function ‘vfree’ [-Werror=implicit-function-declaration]
     vfree(dev_conf->channel[lp]->buf);
     ^
cc1: some warnings being treated as errors
scripts/Makefile.build:258: ターゲット '/home/luis/pt1-c8688d7d6382/driver/pt1_pci.o' のレシピで失敗しました
make[2]: *** [/home/luis/pt1-c8688d7d6382/driver/pt1_pci.o] エラー 1
Makefile:1396: ターゲット '_module_/home/luis/pt1-c8688d7d6382/driver' のレシピで失敗しました
make[1]: *** [_module_/home/luis/pt1-c8688d7d6382/driver] エラー 2
make[1]: ディレクトリ '/usr/src/linux-headers-4.4.0-22-generic' から出ます
Makefile:10: ターゲット 'pt1_drv.ko' のレシピで失敗しました
make: *** [pt1_drv.ko] エラー 2

Kernel 4.2 から <asm/io.h> からの include で vmalloc.h が削除されたので使うためには明示的に追記する必要があるらしい。 参考 - https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=d6472302f242

ということで、ファイルを書き換えます。

 

 

pt1_pci.c を書き換える

$ vim pt1_pci.c

#include <linux/vmalloc.h> ←追記

5行目ぐらいに追加して make をすると通ると思います。