]> git.hungrycats.org Git - linux/commitdiff
ISDN: Use a tasklet for the Eicon driver
authorKai Germaschewski <kai@tp1.ruhr-uni-bochum.de>
Sun, 6 Oct 2002 15:00:21 +0000 (10:00 -0500)
committerKai Germaschewski <kai@tp1.ruhr-uni-bochum.de>
Sun, 6 Oct 2002 15:00:21 +0000 (10:00 -0500)
Armin Schindler converted the driver to use tasklets, which makes more
sense than the new work_struct stuff here.

15 files changed:
drivers/isdn/eicon/Divas_mod.c
drivers/isdn/eicon/adapter.h
drivers/isdn/eicon/common.c
drivers/isdn/eicon/eicon.h
drivers/isdn/eicon/eicon_dsp.h
drivers/isdn/eicon/eicon_idi.c
drivers/isdn/eicon/eicon_idi.h
drivers/isdn/eicon/eicon_io.c
drivers/isdn/eicon/eicon_isa.c
drivers/isdn/eicon/eicon_isa.h
drivers/isdn/eicon/eicon_mod.c
drivers/isdn/eicon/eicon_pci.c
drivers/isdn/eicon/eicon_pci.h
drivers/isdn/eicon/linio.c
drivers/isdn/eicon/linsys.c

index 3bfa23b575913d8466ba442d5c6db15531dac586..c1443a676dfd2ef562aba5367cfb8c6e15d0b08e 100644 (file)
@@ -10,7 +10,7 @@
 #undef N_DATA
 
 #include <linux/kernel.h>
-
+#include <linux/tqueue.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/ioport.h>
@@ -25,6 +25,8 @@ MODULE_DESCRIPTION("ISDN4Linux: Driver for Eicon Diva Server cards");
 MODULE_AUTHOR("Armin Schindler");
 MODULE_LICENSE("GPL");
 
+void DivasInitDpc(void);
+
 #ifdef MODULE
 #include "idi.h"
 void DIVA_DIDD_Write(DESCRIPTOR *, int);
@@ -47,6 +49,8 @@ divas_init(void)
        return -ENODEV;
 #endif
 
+       DivasInitDpc();
+
        if (pci_present())
        {
                if (DivasCardsDiscover() < 0)
index 761aebcd5f5b2d8ba36fbc27eb13561d659834ee..b861d3557904c053238a9b3b9a03bbb985b182c0 100644 (file)
@@ -176,8 +176,7 @@ extern      void    DivasLogAdd(void *buffer, int length);
 /*------------------------------------------------------------------*/
 
 int            DivasDpcSchedule(void);
-void           DivasDoDpc(void *);
-void           DivasDoRequestDpc(void *pData);
+void           DivasDoDpc(unsigned long);
 int            DivasScheduleRequestDpc(void);
 
 /* table of IDI request functions */
index 77d3a50b922a6238816cd28f663f32bc8d7284cb..b9ec4041d3b3181665667938d88f3cc48ba0cb7d 100644 (file)
@@ -801,7 +801,7 @@ void        DivaDoCardDpc(card_t *card)
                        
 }
 
-void   DivasDoDpc(void *pData)
+void   DivasDoDpc(unsigned long dummy)
 {
        card_t  *card = DivasCards;
        int     i = DivasCardNext;
@@ -814,11 +814,6 @@ void       DivasDoDpc(void *pData)
        }
 }
 
-void   DivasDoRequestDpc(void *pData)
-{
-       DivasDoDpc(pData);
-}
-
 /*
  * DivasGetNum
  * Returns the number of active adapters
index 8d9c5acb6c10a7d522b0d310c44b5efd9d9e8d95..2aa6a42f63f617c569efbd5fc4af29d63039ca89 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: eicon.h,v 1.23.6.5 2001/09/23 22:24:37 kai Exp $
+/* $Id: eicon.h,v 1.1.4.1.2.3 2002/10/01 11:29:13 armin Exp $
  *
  * ISDN low-level module for Eicon active ISDN-Cards.
  *
@@ -321,9 +321,9 @@ typedef struct eicon_card {
        struct sk_buff_head sackq;       /* Data-Ack-Message queue           */
        struct sk_buff_head statq;       /* Status-Message queue             */
        int statq_entries;
-       struct tq_struct snd_tq;         /* Task struct for xmit bh          */
-       struct tq_struct rcv_tq;         /* Task struct for rcv bh           */
-       struct tq_struct ack_tq;         /* Task struct for ack bh           */
+       struct tasklet_struct snd_tq;    /* Task struct for xmit bh          */
+       struct tasklet_struct rcv_tq;    /* Task struct for rcv bh           */
+       struct tasklet_struct ack_tq;    /* Task struct for ack bh           */
        eicon_chan*     IdTable[256];    /* Table to find entity   */
        __u16  ref_in;
        __u16  ref_out;
@@ -349,20 +349,17 @@ extern char *eicon_ctype_name[];
 
 extern __inline__ void eicon_schedule_tx(eicon_card *card)
 {
-        queue_task(&card->snd_tq, &tq_immediate);
-        mark_bh(IMMEDIATE_BH);
+       tasklet_schedule(&card->snd_tq);
 }
 
 extern __inline__ void eicon_schedule_rx(eicon_card *card)
 {
-        queue_task(&card->rcv_tq, &tq_immediate);
-        mark_bh(IMMEDIATE_BH);
+       tasklet_schedule(&card->rcv_tq);
 }
 
 extern __inline__ void eicon_schedule_ack(eicon_card *card)
 {
-        queue_task(&card->ack_tq, &tq_immediate);
-        mark_bh(IMMEDIATE_BH);
+       tasklet_schedule(&card->ack_tq);
 }
 
 extern int eicon_addcard(int, int, int, char *, int);
index 2ccfeb0fb815943ca8bc48fd6b034395a7e302f1..299edcaab27be01a1c47bea99ba513fa8f795760 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: eicon_dsp.h,v 1.7.6.1 2001/09/23 22:24:37 kai Exp $
+/* $Id: eicon_dsp.h,v 1.1.4.1.2.2 2002/10/01 11:29:13 armin Exp $
  *
  * ISDN lowlevel-module for Eicon active cards.
  * DSP definitions
index cfa93399deab924a52303f550db57835a0ae7591..fc341e1b396cc63794380ed54c9bb33e9f4967e5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: eicon_idi.c,v 1.41.6.4 2001/11/06 20:58:29 kai Exp $
+/* $Id: eicon_idi.c,v 1.1.4.1.2.4 2002/10/01 11:29:13 armin Exp $
  *
  * ISDN lowlevel-module for Eicon active cards.
  * IDI interface 
@@ -24,7 +24,7 @@
 
 #undef EICON_FULL_SERVICE_OKTETT
 
-char *eicon_idi_revision = "$Revision: 1.41.6.4 $";
+char *eicon_idi_revision = "$Revision: 1.1.4.1.2.4 $";
 
 eicon_manifbuf *manbuf;
 
index c0cab657b4d9f1d057714e43b5a07c666ee4a1c2..d39484be78ce99d32f3b227b548819be2ec0f1a7 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: eicon_idi.h,v 1.11.6.1 2001/09/23 22:24:37 kai Exp $
+/* $Id: eicon_idi.h,v 1.1.4.1.2.2 2002/10/01 11:29:13 armin Exp $
  *
  * ISDN lowlevel-module for the Eicon active cards.
  * IDI-Interface
index ff61c5f10c5a85b301d10a6eaaedf7aebb087ede..806e3771b5033839af0ab65b78dbe19a172aa4cb 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: eicon_io.c,v 1.13.6.2 2001/09/23 22:24:37 kai Exp $
+/* $Id: eicon_io.c,v 1.1.4.1.2.2 2002/10/01 11:29:13 armin Exp $
  *
  * ISDN low-level module for Eicon active ISDN-Cards.
  * Code for communicating with hardware.
index a925d1f3e962eea274a28f6e530eaa9df5cbd5f8..1b0ff98d150bf69aea063f409f1aff310b9d7c2d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: eicon_isa.c,v 1.16.6.2 2001/11/06 20:58:29 kai Exp $
+/* $Id: eicon_isa.c,v 1.1.4.1.2.3 2002/10/01 11:29:13 armin Exp $
  *
  * ISDN low-level module for Eicon active ISDN-Cards.
  * Hardware-specific code for old ISA cards.
@@ -20,7 +20,7 @@
 #define release_shmem release_region
 #define request_shmem request_region
 
-char *eicon_isa_revision = "$Revision: 1.16.6.2 $";
+char *eicon_isa_revision = "$Revision: 1.1.4.1.2.3 $";
 
 #undef EICON_MCA_DEBUG
 
index 7502aabecb8c0275eba4f010d678af7480d9ec76..47aa5650601e7262548f7c1c48d6cd11bb92b5d0 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: eicon_isa.h,v 1.10.6.1 2001/09/23 22:24:37 kai Exp $
+/* $Id: eicon_isa.h,v 1.1.4.1.2.2 2002/10/01 11:29:13 armin Exp $
  *
  * ISDN low-level module for Eicon active ISDN-Cards.
  *
index f51cffef1d6a37cb2c9fd580e92045151429d7f5..02d59428178304bb4ec1f931f9f30c2f8489e7cb 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: eicon_mod.c,v 1.37.6.6 2001/09/23 22:24:37 kai Exp $
+/* $Id: eicon_mod.c,v 1.1.4.1.2.4 2002/10/01 11:29:13 armin Exp $
  *
  * ISDN lowlevel-module for Eicon active cards.
  * 
@@ -44,7 +44,7 @@
 static eicon_card *cards = (eicon_card *) NULL;   /* glob. var , contains
                                                      start of card-list   */
 
-static char *eicon_revision = "$Revision: 1.37.6.6 $";
+static char *eicon_revision = "$Revision: 1.1.4.1.2.4 $";
 
 extern char *eicon_pci_revision;
 extern char *eicon_isa_revision;
@@ -142,8 +142,10 @@ eicon_findnpcicard(int driverid)
 #endif /* CONFIG_PCI */
 
 static void
-eicon_rcv_dispatch(struct eicon_card *card)
+eicon_rcv_dispatch(unsigned long context)
 {
+       struct eicon_card *card = (struct eicon_card *)context;
+
        switch (card->bus) {
                case EICON_BUS_ISA:
                case EICON_BUS_MCA:
@@ -152,13 +154,15 @@ eicon_rcv_dispatch(struct eicon_card *card)
                        break;
                default:
                        eicon_log(card, 1,
-                              "eicon_ack_dispatch: Illegal bustype %d\n", card->bus);
+                              "eicon_rcv_dispatch: Illegal bustype %d\n", card->bus);
        }
 }
 
 static void
-eicon_ack_dispatch(struct eicon_card *card)
+eicon_ack_dispatch(unsigned long context)
 {
+       struct eicon_card *card = (struct eicon_card *)context;
+
        switch (card->bus) {
                case EICON_BUS_ISA:
                case EICON_BUS_MCA:
@@ -172,8 +176,10 @@ eicon_ack_dispatch(struct eicon_card *card)
 }
 
 static void
-eicon_transmit(struct eicon_card *card)
+eicon_transmit(unsigned long context)
 {
+       struct eicon_card *card = (struct eicon_card *)context;
+
        switch (card->bus) {
                case EICON_BUS_ISA:
                case EICON_BUS_MCA:
@@ -868,12 +874,9 @@ eicon_alloccard(int Type, int membase, int irq, char *id, int card_id)
                skb_queue_head_init(&card->sackq);
                skb_queue_head_init(&card->statq);
                card->statq_entries = 0;
-               card->snd_tq.routine = (void *) (void *) eicon_transmit;
-               card->snd_tq.data = card;
-               card->rcv_tq.routine = (void *) (void *) eicon_rcv_dispatch;
-               card->rcv_tq.data = card;
-               card->ack_tq.routine = (void *) (void *) eicon_ack_dispatch;
-               card->ack_tq.data = card;
+               tasklet_init(&card->snd_tq, eicon_transmit, (unsigned long)card);
+               tasklet_init(&card->rcv_tq, eicon_rcv_dispatch, (unsigned long)card);
+               tasklet_init(&card->ack_tq, eicon_ack_dispatch, (unsigned long)card);
                card->interface.maxbufsize = 4000;
                card->interface.command = if_command;
                card->interface.writebuf_skb = if_sendbuf;
index 69c0a0b790a6d6fa1d9cba4e9fbe281a981319b7..6246162dcda465cb9df48ed69974362f43c61744 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: eicon_pci.c,v 1.15.6.3 2001/09/23 22:24:37 kai Exp $
+/* $Id: eicon_pci.c,v 1.1.4.1.2.3 2002/10/01 11:29:13 armin Exp $
  *
  * ISDN low-level module for Eicon active ISDN-Cards.
  * Hardware-specific code for PCI cards.
@@ -24,7 +24,7 @@
 #include "adapter.h"
 #include "uxio.h"
 
-char *eicon_pci_revision = "$Revision: 1.15.6.3 $";
+char *eicon_pci_revision = "$Revision: 1.1.4.1.2.3 $";
 
 #if CONFIG_PCI          /* intire stuff is only for PCI */
 #ifdef CONFIG_ISDN_DRV_EICON_PCI
index 7e615c6f3e0bda55aa6796ffd6e191a80d45a805..7f58e9b636b3e0b3abbcbc197face30c8768295c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: eicon_pci.h,v 1.6.6.1 2001/09/23 22:24:37 kai Exp $
+/* $Id: eicon_pci.h,v 1.1.4.1.2.2 2002/10/01 11:29:13 armin Exp $
  *
  * ISDN low-level module for Eicon active ISDN-Cards (PCI part).
  *
index b20057bb279dec75039da7c899abc1230d391b2c..1756c671045c97e3aa99affae92e7c195cb44544 100644 (file)
 
 #define N_DATA
 
+#include <linux/config.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/smp_lock.h>
 #include <asm/io.h>
 #include <asm/system.h>
 #include <linux/slab.h>
@@ -24,7 +28,7 @@ int log_on=0;
 
 int            Divasdevflag = 0;
 
-//spinlock_t diva_lock = SPIN_LOCK_UNLOCKED;
+spinlock_t diva_lock = SPIN_LOCK_UNLOCKED;
 
 static
 ux_diva_card_t card_pool[MAX_CARDS];
@@ -673,20 +677,14 @@ long UxCardLock(ux_diva_card_t *card)
 {
        unsigned long flags;
 
-       //spin_lock_irqsave(&diva_lock, flags);
+       spin_lock_irqsave(&diva_lock, flags);
        
-       save_flags(flags);
-       cli();
        return flags;
-       
 }
 
 void UxCardUnlock(ux_diva_card_t *card, long ipl)
 {
-       //spin_unlock_irqrestore(&diva_lock, ipl);
-
-       restore_flags(ipl);
-
+       spin_unlock_irqrestore(&diva_lock, ipl);
 }
 
 dword UxTimeGet(void)
index 14b0dab638e2c9de56f6ef56033a90c38ac54253..4f26cd9cf7df928a93961697526047030c6d58fa 100644 (file)
@@ -24,6 +24,8 @@ struct pt_regs;
 
 #include "uxio.h"
 
+static struct tasklet_struct DivasTask;
+
 int Divas4BRIInitPCI(card_t *card, dia_card_t *cfg)
 {
        /* Use UxPciConfigWrite routines to initialise PCI config space */
@@ -79,30 +81,23 @@ int DivasBRIInitPCI(card_t *card, dia_card_t *cfg)
 
 int    DivasDpcSchedule(void)
 {
-       static  struct tq_struct DivasTask;
-
-       DivasTask.routine = DivasDoDpc;
-       DivasTask.data = (void *) 0;
-
-       queue_task(&DivasTask, &tq_immediate);
-       mark_bh(IMMEDIATE_BH);
+       tasklet_schedule(&DivasTask);
 
        return 0;
 }
 
 int    DivasScheduleRequestDpc(void)
 {
-       static  struct tq_struct DivasTask;
-
-       DivasTask.routine = DivasDoRequestDpc;
-       DivasTask.data = (void *) 0;
-
-       queue_task(&DivasTask, &tq_immediate);
-       mark_bh(IMMEDIATE_BH);
+       tasklet_schedule(&DivasTask);
 
        return 0;
 }
 
+void DivasInitDpc(void)
+{
+       tasklet_init(&DivasTask, DivasDoDpc, 0);
+}
+
 void    DivasLogAdd(void *buffer, int length)
 {
     static