diff -ur fritz/src/driver.c fcclassic/src/driver.c --- fritz/src/driver.c 2005-07-07 00:00:00.000000000 +0200 +++ fcclassic/src/driver.c 2012-12-15 12:54:06.000000000 +0100 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -99,7 +100,7 @@ static unsigned long crit_flags; static atomic_t scheduler_enabled = ATOMIC_INIT (0); static atomic_t scheduler_id = ATOMIC_INIT (-1); -static spinlock_t sched_lock = SPIN_LOCK_UNLOCKED; +static spinlock_t sched_lock = __SPIN_LOCK_UNLOCKED(0); #if !defined (__fcclassic__) static int card_id = 0; #endif @@ -107,7 +108,7 @@ /*---------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------*/ static void scheduler (unsigned long data); -static irqreturn_t irq_handler (int irq, void * args, struct pt_regs * regs); +static irqreturn_t irq_handler (int irq, void * args); static DECLARE_TASKLET_DISABLED (scheduler_tasklet, scheduler, 0); @@ -220,16 +221,6 @@ } /* kill_version */ /*---------------------------------------------------------------------------*\ -\*---------------------------------------------------------------------------*/ -static void pprintf (char * page, int * len, const char * fmt, ...) { - va_list args; - - va_start (args, fmt); - *len += vsprintf (page + *len, fmt, args); - va_end (args); -} /* pprintf */ - -/*---------------------------------------------------------------------------*\ \*-C-------------------------------------------------------------------------*/ static inline int in_critical (void) { @@ -374,9 +365,9 @@ card->irq, &irq_handler, #if defined (__fcpci__) || defined (__fcpcmcia__) - SA_INTERRUPT | SA_SHIRQ, + IRQF_TRIGGER_LOW | IRQF_SHARED, #else - SA_INTERRUPT, + IRQF_TRIGGER_LOW, #endif TARGET, card @@ -490,67 +481,6 @@ /*---------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------*/ -static int __kcapi ctr_info ( - char * page, - char ** start, - off_t ofs, - int count, - int * eof, - struct capi_ctr * ctrl -) { - card_t * card; - char * temp; - unsigned char flag; - int len = 0; - - assert (ctrl != NULL); - card = (card_t *) ctrl->driverdata; - assert (card != NULL); - pprintf (page, &len, "%-16s %s\n", "name", SHORT_LOGO); - pprintf (page, &len, "%-16s 0x%04x\n", "io", card->base); - pprintf (page, &len, "%-16s %d\n", "irq", card->irq); - temp = card->version ? card->string[1] : "A1"; - pprintf (page, &len, "%-16s %s\n", "type", temp); - temp = card->version ? card->string[0] : "-"; -#if defined (__fcclassic__) || defined (__fcpcmcia__) - pprintf (page, &len, "%-16s 0x%04x\n", "revision", card->info); -#elif defined (__fcpci__) - pprintf (page, &len, "%-16s %d\n", "class", card_id); -#endif - pprintf (page, &len, "%-16s %s\n", "ver_driver", temp); - pprintf (page, &len, "%-16s %s\n", "ver_cardtype", SHORT_LOGO); - - flag = ((unsigned char *) (ctrl->profile.manu))[3]; - if (flag) { - pprintf(page, &len, "%-16s%s%s%s%s%s%s%s\n", "protocol", - (flag & 0x01) ? " DSS1" : "", - (flag & 0x02) ? " CT1" : "", - (flag & 0x04) ? " VN3" : "", - (flag & 0x08) ? " NI1" : "", - (flag & 0x10) ? " AUSTEL" : "", - (flag & 0x20) ? " ESS" : "", - (flag & 0x40) ? " 1TR6" : "" - ); - } - flag = ((unsigned char *) (ctrl->profile.manu))[5]; - if (flag) { - pprintf(page, &len, "%-16s%s%s%s%s\n", "linetype", - (flag & 0x01) ? " point to point" : "", - (flag & 0x02) ? " point to multipoint" : "", - (flag & 0x08) ? " leased line without D-channel" : "", - (flag & 0x04) ? " leased line with D-channel" : "" - ); - } - if (len < ofs) { - return 0; - } - *eof = 1; - *start = page - ofs; - return ((count < len - ofs) ? count : len - ofs); -} /* ctr_info */ - -/*---------------------------------------------------------------------------*\ -\*---------------------------------------------------------------------------*/ static void __kcapi reset_ctrl (struct capi_ctr * ctrl) { card_t * card; appl_t * appp; @@ -569,7 +499,7 @@ } } stop (card); - capi_ctr_reseted (ctrl); + capi_ctr_down (ctrl); #if defined (__fcpnp__) pnp_disable_dev (card->dev); #endif @@ -608,6 +538,7 @@ ERROR("Error: %s\n", msg); hfree (card); capi_card = NULL; + capi_controller = NULL; return res; } @@ -626,7 +557,6 @@ ctrl->release_appl = release_appl; ctrl->send_message = send_msg; ctrl->procinfo = proc_info; - ctrl->ctr_read_proc = ctr_info; if (0 != (res = attach_capi_ctr (ctrl))) { dec_use_count (); stop (card); @@ -836,11 +766,10 @@ /*---------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------*/ -static irqreturn_t irq_handler (int irq, void * args, struct pt_regs * regs) { +static irqreturn_t irq_handler (int irq, void * args) { int res = IRQ_NONE; UNUSED_ARG (irq); - UNUSED_ARG (regs); if (args != NULL) { assert (capi_lib->cm_handle_events != NULL); if (atomic_read (&scheduler_id) == smp_processor_id ()) { @@ -901,14 +830,14 @@ /*---------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------*/ -int driver_init (void) { +int my_driver_init (void) { return (NULL != (capi_lib = link_library (NULL))); } /* driver_init */ /*---------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------*/ -void driver_exit (void) { +void my_driver_exit (void) { assert (capi_lib != NULL); free_library (); diff -ur fritz/src/driver.h fcclassic/src/driver.h --- fritz/src/driver.h 2005-07-07 00:00:00.000000000 +0200 +++ fcclassic/src/driver.h 2012-12-15 19:56:57.000000000 +0100 @@ -23,7 +23,6 @@ #ifndef __have_driver_h__ #define __have_driver_h__ -#include #include #include #include @@ -98,8 +97,8 @@ /*---------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------*/ -extern int driver_init (void); -extern void driver_exit (void); +extern int my_driver_init (void); +extern void my_driver_exit (void); /*---------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------*/ diff -ur fritz/src/lib.c fcclassic/src/lib.c --- fritz/src/lib.c 2005-07-07 00:00:00.000000000 +0200 +++ fcclassic/src/lib.c 2012-12-15 21:05:22.000000000 +0100 @@ -389,6 +389,7 @@ /*---------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------*/ +#if defined (__fcpci__) || defined (__fcpcmcia__) static __attr unsigned long long os_msec64 (void) { unsigned long tmp; @@ -396,6 +397,7 @@ tmp = j64 * JIFF2MSEC; return tmp; } /* os_msec64 */ +#endif /*---------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------*/ @@ -678,7 +680,9 @@ .delay = &os_delay, #endif .msec = &os_msec, +#if defined (__fcpci__) || defined (__fcpcmcia__) .msec64 = &os_msec64, +#endif .timer_new = &os_timer_new, .timer_delete = &os_timer_delete, .timer_start = &os_timer_start, diff -ur fritz/src/libdefs.h fcclassic/src/libdefs.h --- fritz/src/libdefs.h 2005-07-07 00:00:00.000000000 +0200 +++ fcclassic/src/libdefs.h 2012-12-15 20:04:40.000000000 +0100 @@ -96,7 +96,9 @@ void (__attr * delay) (unsigned); #endif unsigned long (__attr * msec) (void); +#if defined (__fcpci__) || defined (__fcpcmcia__) unsigned long long (__attr * msec64) (void); +#endif int (__attr * timer_new) (unsigned); void (__attr * timer_delete) (void); diff -ur fritz/src/main.c fcclassic/src/main.c --- fritz/src/main.c 2005-07-07 00:00:00.000000000 +0200 +++ fcclassic/src/main.c 2012-12-15 19:56:47.000000000 +0100 @@ -22,7 +22,6 @@ #include #include -#include #include #include #include @@ -205,7 +204,7 @@ NOTE(PRODUCT_LOGO " found: port 0x%04x, irq %u\n", pars.port, pars.irq); NOTE("Loading...\n"); - if (!driver_init ()) { + if (!my_driver_init ()) { ERROR("Error: Driver library not available.\n"); ERROR("Not loaded.\n"); return res; @@ -238,7 +237,7 @@ remove_ctrl (&card->ctrl); NOTE("Removed.\n"); libheap_exit (); - driver_exit (); + my_driver_exit (); #ifndef NDEBUG if (hallocated() != 0) { ERROR("%u bytes leaked.\n", hallocated()); @@ -270,7 +269,7 @@ NOTE (PRODUCT_LOGO " found: port 0x%04x, irq %u\n", pars.port, pars.irq); NOTE("Loading...\n"); - if (!driver_init ()) { + if (!my_driver_init ()) { ERROR("Error: Driver library not available.\n"); ERROR("Not loaded.\n"); return -EBUSY; @@ -303,7 +302,7 @@ remove_ctrl (&card->ctrl); NOTE("Removed.\n"); libheap_exit (); - driver_exit (); + my_driver_exit (); #ifndef NDEBUG if (hallocated() != 0) { ERROR("%u bytes leaked.\n", hallocated()); @@ -364,7 +363,7 @@ #endif #if defined (__fcpci__) - if (0 == (err = pci_module_init (&fcpci_driver))) { + if (0 == (err = pci_register_driver (&fcpci_driver))) { LOG("PCI driver registered.\n"); register_capi_driver (&fritz_capi_driver); LOG("CAPI driver registered.\n"); @@ -378,7 +377,7 @@ } return err; #elif defined (__fcpcmcia__) || defined (__fcclassic__) - if (!driver_init ()) { + if (!my_driver_init ()) { ERROR("Error: Driver library not available.\n"); ERROR("Not loaded.\n"); return -EBUSY; @@ -388,7 +387,14 @@ libheap_init (MAX_LIB_HEAP_SIZE); #if defined (__fcclassic__) if ((io != 0) && (irq != 0)) { - return isa_start (io, irq); + int retval = isa_start (io, irq); + if (retval) + { + libheap_exit (); + unregister_capi_driver (&fritz_capi_driver); + LOG("CAPI driver unregistered.\n"); + return retval; + } } else if ((io + irq) != 0) { NOTE("Warning: Missing parameter!\n"); NOTE("Waiting for capiinit...\n"); @@ -403,7 +409,8 @@ static void __exit fritz_exit (void) { #if defined (__fcclassic__) - isa_stop (); + if (capi_controller != NULL) + isa_stop (); libheap_exit (); #endif unregister_capi_driver (&fritz_capi_driver); diff -ur fritz/src/Makefile fcclassic/src/Makefile --- fritz/src/Makefile 2005-07-07 00:00:00.000000000 +0200 +++ fcclassic/src/Makefile 2012-12-15 21:01:12.000000000 +0100 @@ -1,7 +1,7 @@ # COMMON -CARD := fcpci -LIBDIR := /var/lib/fritz +CARD := fcclassic +LIBDIR := $(PWD) OBJECTS := main.o driver.o tools.o tables.o queue.o lib.o ifneq ($(KERNELRELEASE),) @@ -33,27 +33,44 @@ KDIR := /lib/modules/$(shell uname -r)/build endif +ifeq ($(INSTALL),) +INSTALL := /lib/modules/$(shell uname -r)/extra +endif + ifeq ($(CARD),fcpcmcia) all: $(CARD).ko $(CARD)_cs.ko else all: $(CARD).ko endif - -$(CARD).ko: $(LIBDIR) $(SOURCES) $(HEADERS) - @cp -f ../lib/$(CARD)-lib.o $(LIBDIR) - $(MAKE) -C $(KDIR) SUBDIRS=$(shell pwd) modules + +$(CARD)-lib.o: ../lib/$(CARD)-lib.o + ld -r -d ../lib/$(CARD)-lib.o -o $(CARD)-lib.o +ifneq ($(CARD),fcpci) +ifneq ($(CARD),fcpcmcia) + objcopy --redefine-sym memcpy=lib_memcpy --redefine-sym memset=lib_memset --redefine-sym memmove=lib_memmove \ + --redefine-sym memcmp=lib_memcmp --redefine-sym strcat=lib_strcat \ + --redefine-sym strncpy=lib_strncpy --redefine-sym strncmp=lib_strncmp --redefine-sym strlen=lib_strlen \ + --redefine-sym strcpy=lib_strcpy --redefine-sym strcmp=lib_strcmp $(CARD)-lib.o +endif +endif + +$(CARD).ko: $(SOURCES) $(HEADERS) $(CARD)-lib.o + $(MAKE) -C $(KDIR) SUBDIRS=$(LIBDIR) modules $(CARD)_cs.ko: $(CARD)_cs.c $(CARD).ko - + clean: ; $(RM) $(OBJECTS) - $(RM) $(CARD).o $(CARD).ko - @$(RM) .*.cmd $(CARD).mod.* + $(RM) $(CARD)-lib.o $(CARD).o $(CARD).ko + @$(RM) modules.order Module.symvers .*.cmd $(CARD).mod.* + @$(RM) -rf .tmp_versions ifeq ($(CARD),fcpcmcia) @$(RM) $(CARD)_cs.o $(CARD)_cs.ko $(CARD)_cs.mod.* endif -$(LIBDIR): - mkdir -p $(LIBDIR) +install:; mkdir -p $(INSTALL) + cp $(CARD).ko $(INSTALL) + strip -g $(INSTALL)/$(CARD).ko + depmod -a endif diff -ur fritz/src/tools.c fcclassic/src/tools.c --- fritz/src/tools.c 2005-07-07 00:00:00.000000000 +0200 +++ fcclassic/src/tools.c 2012-12-15 06:56:35.000000000 +0100 @@ -110,7 +110,7 @@ #define FENCE2_OK(h,m) (*(unsigned *)(((char *) m)+(h)->size)==FENCE_TAG) static unsigned alloc_count = 0; -static spinlock_t track_lock = SPIN_LOCK_UNLOCKED; +static spinlock_t track_lock = __SPIN_LOCK_UNLOCKED(0); #if !defined (NDEBUG) && defined (LOG_TIMER) static struct timeval zero_time; @@ -529,7 +529,7 @@ ERROR("Could not allocate lock structure!!!\n"); return 0; } - tmp->lock = SPIN_LOCK_UNLOCKED; + tmp->lock = __SPIN_LOCK_UNLOCKED(0); *plock = tmp; return 1; } /* lock_init */ diff -ur fritz/src/tools.h fcclassic/src/tools.h --- fritz/src/tools.h 2005-07-07 00:00:00.000000000 +0200 +++ fcclassic/src/tools.h 2012-12-15 05:57:49.000000000 +0100 @@ -71,15 +71,6 @@ /*---------------------------------------------------------------------------*\ \*---------------------------------------------------------------------------*/ -static inline unsigned long atomic_xchg ( - volatile atomic_t * v, - unsigned value -) { - return __xchg (value, &v->counter, sizeof (unsigned)); -} /* atomic_xchg */ - -/*---------------------------------------------------------------------------*\ -\*---------------------------------------------------------------------------*/ #ifndef NDEBUG extern unsigned hallocated (void); extern int hvalid (void *);