Hi,

I finally felt the urge to get MidiShare to work on my new SuSE 9.1 system; attached are the patches I was able to come up with (against midishare cvs from 2 or 3 days ago). I hope that these work on other kernel 2.6 based systems, too, but I've not tested this, so any feedback is appreciated.

The main changes are in the build system (kernel 2.6 uses a different procedure to build kernel modules; I used some kludges to make the MidiShare module build the recommended way, if anyone can make this any prettier please let me know ;-), and in the scheduling of the timer task in the MidiShare kernel module -- queue_task() and the timer queue are no more, I used add_timer() and friends instead. Also, the module name is now "midishare.ko", as the new build system doesn't let you build a module whose name is the same as one of its constituent parts (i.e., MidiShare.o).

I've tested this stuff under SuSE 9.1 with SuSE's 2.6.4 kernel, and so far it seems to work ok. I'll also make SuSE 9.1 and source rpms available on q-lang.sf.net in the course of the next few days. If anyone needs to have those immediately, just email me.

Cheers,
Albert

--
Dr. Albert Gr"af
Dept. of Music-Informatics, University of Mainz, Germany
Email:  [EMAIL PROTECTED], [EMAIL PROTECTED]
WWW:    http://www.musikwissenschaft.uni-mainz.de/~ag
diff -ruN src.orig/linux/kernel/Makefile src/linux/kernel/Makefile
--- src.orig/linux/kernel/Makefile      1970-01-01 01:00:00.000000000 +0100
+++ src/linux/kernel/Makefile   2004-07-25 12:01:03.000000000 +0200
@@ -0,0 +1,37 @@
+
+KERNEL_DIR := /lib/modules/$(shell uname -r)/build
+
+EXTRA_CFLAGS += -I$(obj)/../../common/Headers -D_LOOSE_KERNEL_NAMES -DMODVERSIONS 
-D__Pentium__ -DCONFIG_KERNELD -DMODULE -D__KERNEL__ -DLINUX
+
+obj-m := midishare.o
+midishare-objs := msLoader.o MidiShareLinux.o MidiShare.o msConf.o \
+      msAlarms.o msAppls.o msConnx.o \
+      msFilter.o msMail.o msTasks.o msXmtRcv.o \
+      msHandler.o msInit.o msSmpte.o msTime.o \
+      msEvents.o msFields.o msMemory.o msSeq.o \
+      msSorter.o msDriver.o
+
+ifndef KERNELRELEASE
+
+C = Clients
+K = Kernel
+M = Memory
+S = Sorter
+D = Drivers
+
+COMMON := $(C)/msAlarms.c $(C)/msAppls.c $(C)/msConnx.c $(C)/msFilter.c \
+$(C)/msMail.c $(C)/msTasks.c $(C)/msXmtRcv.c \
+$(K)/msHandler.c $(K)/msInit.c $(K)/msSmpte.c $(K)/msTime.c \
+$(M)/msEvents.c $(M)/msFields.c $(M)/msMemory.c $(M)/msSeq.c \
+$(S)/msSorter.c $(D)/msDriver.c
+
+all:
+       for x in $(COMMON); do ln -sf ../../common/$$x `basename $$x`; done
+       $(MAKE) modules -C $(KERNEL_DIR) SUBDIRS=$(shell pwd)
+
+clean:
+       -rm -f *.ko *.o
+       -rm -f *.mod.* .*.cmd
+       -for x in $(COMMON); do rm -f `basename $$x`; done
+
+endif
diff -ruN src.orig/linux/kernel/MidiShare.c src/linux/kernel/MidiShare.c
--- src.orig/linux/kernel/MidiShare.c   2002-06-11 10:00:28.000000000 +0200
+++ src/linux/kernel/MidiShare.c        2004-07-25 12:08:01.373225440 +0200
@@ -27,7 +27,7 @@
 */
 
 #ifdef MODVERSIONS
-#include <linux/modversions.h>
+#include <config/modversions.h>
 #endif
 
 #include <linux/kernel.h>
diff -ruN src.orig/linux/kernel/MidiShareLinux.c src/linux/kernel/MidiShareLinux.c
--- src.orig/linux/kernel/MidiShareLinux.c      2004-07-22 23:36:29.000000000 +0200
+++ src/linux/kernel/MidiShareLinux.c   2004-07-25 12:08:01.374225288 +0200
@@ -28,7 +28,7 @@
 */
   
 #ifdef MODVERSIONS
-#include <linux/modversions.h>
+#include <config/modversions.h>
 #endif
 
 /* centralizing compatibility issues between 2.0, 2.2, 2.4 */
@@ -64,6 +64,8 @@
 
 #include <linux/slab.h>
 #include <linux/poll.h>
+#include <asm/param.h>
+#include <linux/timer.h>
 
 #include "msLoader.h" 
 #include "msExtern.h"
@@ -76,7 +78,7 @@
 /*_______________________________________________________________________*/
 
 typedef struct TMachine {
-       struct tq_struct        timerTask;  /* timer task                              
                 */
+       struct timer_list       timerTask;  /* timer task                              
                 */
        NEW_WAIT_QUEUE          stopQueue;      /* stop queue (for cleanup_module ) */
        struct timeval          time;           /* for timer management                
         */
        long                            phase;  /* used to count ClockHandler calls    
 */
@@ -92,7 +94,7 @@
        
 } LinuxContext, * LinuxContextPtr;
 
-static void TimerTask(void * arg);
+static void TimerTask(unsigned long arg);
 
 /* 
        The machine structure (TLinux structure) is globally allocated so that the 
TimerTask 
@@ -316,12 +318,10 @@
 
 static void InitMachine (TLinuxPtr machine)
 {
-       #ifndef LINUX_24
-       machine->timerTask.next = NULL;                 /* Next item in list - 
queue_task will do this for us */
-       #endif
-       machine->timerTask.sync = 0;                    /* A flag meaning we haven't 
been inserted into a task queue yet */
-       machine->timerTask.routine = TimerTask;         /* The function to run */
-       machine->timerTask.data = gMem;                 /* the arg parameter to the 
interrupt routine : the MidiShare global data */
+       //printk("midishare: initializing\n");
+       init_timer(&machine->timerTask);
+       machine->timerTask.data = (unsigned long)gMem;
+       machine->timerTask.function = TimerTask;
        INIT_WAIT_QUEUE(machine->stopQueue);
        machine->phase = 0;
        machine->status = true;
@@ -336,7 +336,7 @@
        to take into account that HZ may not be a divider of 1000 or
        can even be greater than 1000 hz.       
 */     
-static void TimerTask(void * arg)
+static void TimerTask(unsigned long arg)
 {
        TMSGlobalPtr g  = (TMSGlobalPtr) arg;
        TLinuxPtr machine = (TLinuxPtr) g->local;
@@ -347,7 +347,8 @@
                long i = machine->phase;
                while (i<1000) { ClockHandler(g); i+=HZ; }
                machine->phase = i-1000;
-               queue_task(&machine->timerTask, &tq_timer);  
+               machine->timerTask.expires = 1;
+               add_timer(&machine->timerTask); 
        }
 }
 
@@ -369,8 +370,10 @@
 void OpenTimeInterrupts (TMSGlobalPtr g)
 {
        TLinuxPtr machine = (TLinuxPtr) g->local;
+       //printk("midishare: waking up\n");
        do_gettimeofday(&machine->time);
-       queue_task(&machine->timerTask, &tq_timer); 
+       machine->timerTask.expires = 1;
+       add_timer(&machine->timerTask); 
 }
 
 /*__________________________________________________________________________*/
@@ -378,6 +381,7 @@
 void CloseTimeInterrupts(TMSGlobalPtr g)
 {
        TLinuxPtr machine = (TLinuxPtr) g->local;
+       //printk("midishare: sleeping\n");
        machine->status = false;
        interruptible_sleep_on(&machine->stopQueue);
 }
diff -ruN src.orig/linux/kernel/msConf.c src/linux/kernel/msConf.c
--- src.orig/linux/kernel/msConf.c      2002-07-22 13:07:31.000000000 +0200
+++ src/linux/kernel/msConf.c   2004-07-25 12:08:01.374225288 +0200
@@ -22,7 +22,7 @@
 
 #ifdef MODULE
 #ifdef MODVERSIONS
-# include <linux/modversions.h>
+# include <config/modversions.h>
 #endif
 #define malloc(size)   kmalloc(size, GFP_KERNEL)
 #define free                   kfree
@@ -32,6 +32,7 @@
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <asm/current.h>
+#include <linux/sched.h>
 #include <asm/string.h>
 
 #include "msConf.h"
@@ -193,17 +194,17 @@
 static char read_char (fileptr fd)
 {
        long l; ssize_t n; char *c = (char *)&l;
-       long savedLimit = get_current()->addr_limit.seg;
-       get_current()->addr_limit.seg = 0xffffffff;
+       long savedLimit = current_thread_info()->addr_limit.seg;
+       current_thread_info()->addr_limit.seg = 0xffffffff;
 
        do {
                n = generic_file_read (fd, c, 1, &(fd->f_pos));
                if (n <= 0) {
-                       get_current()->addr_limit.seg = savedLimit;
+                       current_thread_info()->addr_limit.seg = savedLimit;
                        return EOF;
                }
        } while ((*c == ' ') || (*c == '\t'));
-       get_current()->addr_limit.seg = savedLimit;
+       current_thread_info()->addr_limit.seg = savedLimit;
        return *c;
 }
 
diff -ruN src.orig/linux/kernel/msLoader.c src/linux/kernel/msLoader.c
--- src.orig/linux/kernel/msLoader.c    2003-02-04 17:16:22.000000000 +0100
+++ src/linux/kernel/msLoader.c 2004-07-25 12:08:01.375225136 +0200
@@ -35,7 +35,7 @@
 
 #ifdef MODULE
 # ifdef MODVERSIONS
-# include <linux/modversions.h>
+# include <config/modversions.h>
 # endif
 #define EXPORT_SYMTAB
 #include <linux/module.h>
@@ -81,8 +81,8 @@
 
        while (s[n]) n++;       /* longueur de s */
        if (dst != NULL) {
-               (* dst->driver.write)(dst, 0, s, n);
-               (* dst->driver.write)(dst, 0, "\015\012", 2);
+               (* dst->driver->write)(dst, 0, s, n);
+               (* dst->driver->write)(dst, 0, "\015\012", 2);
        }
 }
 
@@ -127,7 +127,7 @@
        int n = MSCountAppls(Clients(gMem));
        
        while (n){
-               MOD_DEC_USE_COUNT;
+               //MOD_DEC_USE_COUNT;
                MSClose( MSGetIndAppl(n--,Clients(gMem)),gMem);
        }
        
@@ -138,7 +138,7 @@
 
 static int myopen(struct inode *inode, struct file * f)
 {
-       MOD_INC_USE_COUNT;
+       //MOD_INC_USE_COUNT;
        return 0;               /* 0 = OK, tout va bien */
 }
 
@@ -147,7 +147,7 @@
 static int myclose(struct inode *inode, struct file * f)
 {
        mskCloseAll(f);
-       MOD_DEC_USE_COUNT;
+       //MOD_DEC_USE_COUNT;
        return 0;
 }
 
diff -ruN src.orig/linux/kernel/msLoader.h src/linux/kernel/msLoader.h
--- src.orig/linux/kernel/msLoader.h    2001-06-22 18:48:42.000000000 +0200
+++ src/linux/kernel/msLoader.h 2004-07-25 12:08:01.375225136 +0200
@@ -31,6 +31,8 @@
 
 /* functions prototypes */
 
+struct file;
+
 int mskGetVersion(unsigned long userptr,struct file *);
 int mskCountAppls(unsigned long userptr,struct file *);
 int mskGetIndAppl(unsigned long userptr,struct file *);
diff -ruN src.orig/linux/makefile src/linux/makefile
--- src.orig/linux/makefile     2003-02-04 16:54:19.000000000 +0100
+++ src/linux/makefile  2004-07-25 11:46:42.000000000 +0200
@@ -11,7 +11,7 @@
        make -f appls
 
 kernel: common
-       make -C kernel
+       make -C kernel -f Makefile
 
 common:
        make -C ../common
@@ -20,32 +20,32 @@
 
 install: libinstall clientsinstall
        [ -d $(MODF) ] || mkdir $(MODF)
-       install MidiShare.o $(MODF)
+       install -m 644 kernel/midishare.ko $(MODF)
        /sbin/depmod -a
        install MidiShare $(RC)/init.d
        ln -s $(INIT)/MidiShare $(RC)/rc5.d/S90MidiShare
        ln -s $(INIT)/MidiShare $(RC)/rc3.d/S90MidiShare
-       /sbin/modprobe MidiShare 
+       /sbin/modprobe midishare
 
 uninstall: libuninstall clientsuninstall
        rm -f /etc/$(CONF)
-       rm -f $(MODF)/MidiShare.o
+       rm -f $(MODF)/midishare.ko
        rm -f $(INIT)/MidiShare $(RC)/rc[35].d/*MidiShare
-       /sbin/rmmod MidiShare
-       
+       /sbin/rmmod midishare
+
 clean:
        make -i -C ../common/Memory clean 
        make -i -C ../common clean 
-       make -i -C kernel clean 
+       make -i -C kernel clean -f Makefile 
        make -i -C library clean 
        make -f appls clean
 
 
 #Compile applications, tools and drivers
-       
+
 clients:
        make -f appls
-       
+
 #Install applications, tools and drivers
 
 clientsinstall:
@@ -68,14 +68,14 @@
        cp $(CONF) /etc/$(CONF)
        [ -d $(INCF) ] || mkdir $(INCF)
        install  Include/MidiShare.h $(INCF)
-       
+
 test:
        make -C tests all
-       
+
 driver:
        make -C drivers all
 
-       
+
 dep:
        make -i -C ../common/Memory dep 
        make -i -C ../common dep 
diff -ruN src.orig/linux/MidiShare src/linux/MidiShare
--- src.orig/linux/MidiShare    2000-07-19 18:08:05.000000000 +0200
+++ src/linux/MidiShare 2004-07-25 12:08:01.376224984 +0200
@@ -24,23 +24,23 @@
 case "$1" in
   start)
        # Check if MidiShare is already installed
-       lsmod | grep MidiShare >/dev/null
+       lsmod | grep midishare >/dev/null
        if [ ! $? ]; then 
                echo MidiShare module is still installed
        else
                echo -n Loading MidiShare module
-               modprobe MidiShare 2>/dev/null
+               modprobe midishare 2>/dev/null
                result
        fi
        ;;
   stop)
        # Check if MidiShare is already installed
-       lsmod | grep MidiShare >/dev/null
+       lsmod | grep midishare >/dev/null
        if [ $? ]; then 
                echo MidiShare module is not installed
        else
                echo -n Removing MidiShare module
-               rmmod MidiShare 2>/dev/null
+               rmmod midishare 2>/dev/null
                result
        fi
        ;;

Reply via email to