OpenSuse 12.3 64-bit карточка pci-lpt mcs9805 - сборка драйвера

Прикупил карточку чтобы оживить старый принтер. Но не тут-то было. Драйвер к карточке как я понял для ядра 2.6 и чего-то ему не хватает для сборки… Даже знаю чего - файла mca.h - но он почему-то находится в исходниках для ia-64. Думаю тот - не тот…

Вывод make:

alex:/home/alex/1 # make
rm -f *.mod.c *.o .ko ..cmd *.symvers
make -C /lib/modules/3.7.10-1.4-desktop/build/ SUBDIRS=/home/alex/1 modules
make[1]: Entering directory /usr/src/linux-3.7.10-1.4-obj/x86_64/desktop' CC [M] /home/alex/1/mcs9865.o /home/alex/1/mcs9865.c:30:23: fatal error: linux/mca.h: No such file or directory compilation terminated. make[4]: *** [/home/alex/1/mcs9865.o] Error 1 make[3]: *** [_module_/home/alex/1] Error 2 make[2]: *** [sub-make] Error 2 make[1]: *** [all] Error 2 make[1]: Leaving directory /usr/src/linux-3.7.10-1.4-obj/x86_64/desktop’
make: *** [default] Error 2

Если кто усаживал подобную карточку - подскажите что делать?

гуглеж дал ссылку на то что все работает почти само: Linux Installation Guide

но я собрал модуль на 12.2 х86_64 с помощью: https://forums.opensuse.org/blogs/malcolmlewis/package-day-mcs9865-moschip-pci-serial-parallel-driver-66/
код отсюда: Source Checkout - mcs9865 - MCS 9865 driver - Google Project Hosting
типа патчик: SUSE Paste

то есть:
svn checkout http://mcs9865.googlecode.com/svn/trunk/ mcs9865-read-only
cd mcs9865-read-only
dos2unix *.c *.h
wget -O mcs9865.patch http://susepaste.org/view/download/83201249
patch -p1 -i mcs9865.patch
make

на всякий случай

--- mcs9865-read-only/Makefile  2013-05-09 12:07:11.524562061 +1100
+++ mcs9865-read-only_my/Makefile       2013-05-09 12:06:14.000000000 +1100
@@ -1,4 +1,4 @@
-KERNEL=2.6.32.3
+KERNEL=`uname -r`
 KDIR:=/lib/modules/$(KERNEL)/build/ 
 obj-m +=mcs9865.o
 obj-m +=mcs9865-isa.o
diff -Naur mcs9865-read-only/mcs9865.c mcs9865-read-only_my/mcs9865.c
--- mcs9865-read-only/mcs9865.c 2013-05-09 12:07:11.508562062 +1100
+++ mcs9865-read-only_my/mcs9865.c      2013-05-09 12:02:40.000000000 +1100
@@ -16,6 +16,7 @@
 #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,15)
 #include <linux/config.h>
 #endif
+
 
 #if defined(CONFIG_SERIAL_9865_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
 #define SUPPORT_SYSRQ
@@ -1839,7 +1840,8 @@
   return 0;
 }
 
-static DECLARE_MUTEX(serial9865_sem);
+//static DECLARE_MUTEX(serial9865_sem);
+static DEFINE_SEMAPHORE(serial9865_sem);
 
 static struct uart_driver mcs9865_serial_driver = {
         .owner                  = THIS_MODULE,

Судя по коду патч вроде неполный… нет закрывающих скобок и хз сколько строк…

у меня рунгя такая:

alex:~/mcs9865-read-only # patch -p1 -i mcs9865.patch
patching file Makefile
patching file mcs9865.c
patch unexpectedly ends in middle of line
Hunk #2 succeeded at 1840 with fuzz 1.

Та же фигня…

alex:~/mcs9865-read-only # make
rm -f *.mod.c *.o *.ko .*.cmd *.symvers
make -C /lib/modules/`uname -r`/build/  SUBDIRS=/root/mcs9865-read-only modules
make[1]: Entering directory `/usr/src/linux-3.7.10-1.4-obj/x86_64/desktop'
  CC [M]  /root/mcs9865-read-only/mcs9865.o
/root/mcs9865-read-only/mcs9865.c:31:23: fatal error: linux/mca.h: No such file or directory
compilation terminated.
make[4]: *** [/root/mcs9865-read-only/mcs9865.o] Error 1
make[3]: *** [_module_/root/mcs9865-read-only] Error 2
make[2]: *** [sub-make] Error 2
make[1]: *** [all] Error 2
make[1]: Leaving directory `/usr/src/linux-3.7.10-1.4-obj/x86_64/desktop'
make: *** [default] Error 2

да, проверил, на 3.7.10 не собирается
надо думать дальше

собралось с очень dirty hack-ом
убираем этот mca.h и отключаем -isa модуль

--- mcs9865-read-only/Makefile  2013-05-09 18:42:55.812437136 +1100
+++ mcs9865-read-only-2/Makefile        2013-05-09 19:02:10.298161921 +1100
@@ -1,7 +1,6 @@
 KERNEL=`uname -r`
 KDIR:=/lib/modules/$(KERNEL)/build/ 
 obj-m +=mcs9865.o
-obj-m +=mcs9865-isa.o
 
 default:
        $(RM) *.mod.c *.o *.ko .*.cmd *.symvers
diff -Naur mcs9865-read-only/mcs9865.c mcs9865-read-only-2/mcs9865.c
--- mcs9865-read-only/mcs9865.c 2013-05-09 19:06:51.399555828 +1100
+++ mcs9865-read-only-2/mcs9865.c       2013-05-09 18:43:27.000000000 +1100
@@ -28,7 +28,7 @@
 #include <linux/pci.h>
 #include <linux/console.h>
 #include <linux/sysrq.h>
-#include <linux/mca.h>
+//#include <linux/mca.h>
 #include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/kernel.h>

О дааа!!! Собралось…

Только теперь:


alex:~/mcs9865-read-only # make install
cp mcs9865.ko mcs9865-isa.ko /lib/modules/`uname -r`/kernel/drivers/serial/
cp: target ‘/lib/modules/3.7.10-1.4-desktop/kernel/drivers/serial/’ is not a directory
make: *** [install] Error 1

Просмотрел Makefile - непонятно - сначала .ko копируется в lib - каталога serial там нет… Создавать?
Потом файлу mcs9865 (без расширения) присваивается атрибут исполняемого… Но этого файла нет только .ko и .o

Что в мейкфайле исправить?
Может

cp mcs9865.ko mcs9865

добавить перед

chmod +x mcs9865

я думал, дальше вы сами победите:)
тот install, что в родном Makefile не совсем годится
поэтому лучше сделать руками (из-под рута):

cp mcs9865.ko /lib/modules/3.7.10-1.4-desktop/kernel/drivers/parport/
depmod -A
modprobe mcs9865

и добавить mcs9865 в автозагрузку, например, сделать файл lptpci.conf в /etc/modules-load.d со строчкой mcs9865

Ну как-то думалось по стандартной схеме… Спасибо большое!

и добавить mcs9865 в автозагрузку, например, сделать файл lptpci.conf в /etc/modules-load.d со строчкой mcs9865

Наверное, можно в initrd включить через /etc/sysconfig/kernel.