This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / drivers / isdn / divert / isdn_divert.c
index 89c72c8..568530d 100644 (file)
@@ -11,7 +11,6 @@
 
 #include <linux/version.h>
 #include <linux/proc_fs.h>
-
 #include "isdn_divert.h"
 
 /**********************************/
@@ -48,53 +47,54 @@ static struct deflect_struc *table_head = NULL;
 static struct deflect_struc *table_tail = NULL; 
 static unsigned char extern_wait_max = 4; /* maximum wait in s for external process */ 
 
-spinlock_t divert_lock = SPIN_LOCK_UNLOCKED;
-
 /***************************/
 /* timer callback function */
 /***************************/
 static void deflect_timer_expire(ulong arg)
-{
-  unsigned long flags;
+{ unsigned long flags;
   struct call_struc *cs = (struct call_struc *) arg;
 
-  spin_lock_irqsave(&divert_lock, flags);
+  save_flags(flags);
+  cli();
   del_timer(&cs->timer); /* delete active timer */
-  spin_unlock_irqrestore(&divert_lock, flags);
+  restore_flags(flags);
 
   switch(cs->akt_state)
    { case DEFLECT_PROCEED:
        cs->ics.command = ISDN_CMD_HANGUP; /* cancel action */
        divert_if.ll_cmd(&cs->ics);                       
-       spin_lock_irqsave(&divert_lock, flags);
+       save_flags(flags);
+       cli();
        cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
        cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
        add_timer(&cs->timer);
-       spin_unlock_irqrestore(&divert_lock, flags);
+       restore_flags(flags); 
        break;
 
      case DEFLECT_ALERT:
        cs->ics.command = ISDN_CMD_REDIR; /* protocol */
        strcpy(cs->ics.parm.setup.phone,cs->deflect_dest);
        strcpy(cs->ics.parm.setup.eazmsn,"Testtext delayed");
-       divert_if.ll_cmd(&cs->ics);
-       spin_lock_irqsave(&divert_lock, flags);
+       divert_if.ll_cmd(&cs->ics);                       
+       save_flags(flags);
+       cli();
        cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
        cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
        add_timer(&cs->timer);
-       spin_unlock_irqrestore(&divert_lock, flags);
+       restore_flags(flags); 
        break;
 
      case DEFLECT_AUTODEL:
      default:
-       spin_lock_irqsave(&divert_lock, flags);
+       save_flags(flags);
+       cli();
        if (cs->prev) 
          cs->prev->next = cs->next; /* forward link */
         else
          divert_head = cs->next;
        if (cs->next)
          cs->next->prev = cs->prev; /* back link */           
-       spin_unlock_irqrestore(&divert_lock, flags);
+       restore_flags(flags); 
        kfree(cs);
        return;
 
@@ -166,9 +166,10 @@ int cf_command(int drvid, int mode,
   cs->ics.parm.dss1_io.datalen = p - tmp; /* total len */
   cs->ics.parm.dss1_io.data = tmp; /* start of buffer */
   
-  spin_lock_irqsave(&divert_lock, flags);
+  save_flags(flags);
+  cli();
   cs->ics.parm.dss1_io.ll_id = next_id++; /* id for callback */
-  spin_unlock_irqrestore(&divert_lock, flags);
+  restore_flags(flags);
   *procid = cs->ics.parm.dss1_io.ll_id;  
 
   sprintf(cs->info,"%d 0x%lx %s%s 0 %s %02x %d%s%s\n",
@@ -186,10 +187,11 @@ int cf_command(int drvid, int mode,
 
   if (!retval)
    { cs->prev = NULL;
-     spin_lock_irqsave(&divert_lock, flags);
+     save_flags(flags);
+     cli();
      cs->next = divert_head;
      divert_head = cs; 
-     spin_unlock_irqrestore(&divert_lock, flags);
+     restore_flags(flags);
    }
   else
    kfree(cs);
@@ -222,12 +224,13 @@ int deflect_extern_action(u_char cmd, ulong callid, char *to_nr)
    { case 0: /* hangup */
        del_timer(&cs->timer); 
        ic.command = ISDN_CMD_HANGUP;
-       i = divert_if.ll_cmd(&ic);
-       spin_lock_irqsave(&divert_lock, flags);
+       i = divert_if.ll_cmd(&ic);                        
+       save_flags(flags);
+       cli();
        cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
        cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
        add_timer(&cs->timer);
-       spin_unlock_irqrestore(&divert_lock, flags);
+       restore_flags(flags); 
      break;      
 
      case 1: /* alert */
@@ -236,12 +239,12 @@ int deflect_extern_action(u_char cmd, ulong callid, char *to_nr)
        del_timer(&cs->timer); 
        ic.command = ISDN_CMD_ALERT;
        if ((i = divert_if.ll_cmd(&ic)))
-       {
-          spin_lock_irqsave(&divert_lock, flags);
+       { save_flags(flags);
+          cli();
           cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
           cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
           add_timer(&cs->timer);
-          spin_unlock_irqrestore(&divert_lock, flags);
+          restore_flags(flags);
         }
        else
           cs->akt_state = DEFLECT_ALERT; 
@@ -253,12 +256,12 @@ int deflect_extern_action(u_char cmd, ulong callid, char *to_nr)
        strcpy(cs->ics.parm.setup.eazmsn, "Testtext manual");
        ic.command = ISDN_CMD_REDIR;
        if ((i = divert_if.ll_cmd(&ic)))
-       {
-          spin_lock_irqsave(&divert_lock, flags);
+       { save_flags(flags);
+          cli();
           cs->akt_state = DEFLECT_AUTODEL; /* delete after timeout */
           cs->timer.expires = jiffies + (HZ * AUTODEL_TIME);
           add_timer(&cs->timer);
-          spin_unlock_irqrestore(&divert_lock, flags);
+          restore_flags(flags);
         }
        else
           cs->akt_state = DEFLECT_ALERT; 
@@ -281,7 +284,8 @@ int insertrule(int idx, divert_rule *newrule)
 
   ds->rule = *newrule; /* set rule */
 
-  spin_lock_irqsave(&divert_lock, flags);
+  save_flags(flags);
+  cli();
 
   if (idx >= 0)
    { ds1 = table_head;
@@ -309,7 +313,7 @@ int insertrule(int idx, divert_rule *newrule)
         table_head = ds; /* first element */
    }
 
-  spin_unlock_irqrestore(&divert_lock, flags);
+  restore_flags(flags);
   return(0);
 } /* insertrule */
 
@@ -321,11 +325,12 @@ int deleterule(int idx)
   unsigned long flags;
   
   if (idx < 0) 
-   { spin_lock_irqsave(&divert_lock, flags);
+   { save_flags(flags);
+     cli();
      ds = table_head;
      table_head = NULL;
      table_tail = NULL;
-     spin_unlock_irqrestore(&divert_lock, flags);
+     restore_flags(flags);
      while (ds)
       { ds1 = ds; 
         ds = ds->next;
@@ -334,7 +339,8 @@ int deleterule(int idx)
      return(0); 
    }
 
-  spin_lock_irqsave(&divert_lock, flags);
+  save_flags(flags);
+  cli();
   ds = table_head;
 
   while ((ds) && (idx > 0))
@@ -343,8 +349,7 @@ int deleterule(int idx)
    }
 
   if (!ds) 
-   {
-     spin_unlock_irqrestore(&divert_lock, flags);
+   { restore_flags(flags);
      return(-EINVAL);
    }  
 
@@ -358,7 +363,7 @@ int deleterule(int idx)
    else
      table_head = ds->next; /* start of chain */      
   
-  spin_unlock_irqrestore(&divert_lock, flags);
+  restore_flags(flags);
   kfree(ds);
   return(0);
 } /* deleterule */
@@ -469,9 +474,10 @@ int isdn_divert_icall(isdn_ctrl *ic)
             else  
               cs->timer.expires = 0;
            cs->akt_state = dv->rule.action;                
-           spin_lock_irqsave(&divert_lock, flags);
+           save_flags(flags);
+           cli();
            cs->divert_id = next_id++; /* new sequence number */
-           spin_unlock_irqrestore(&divert_lock, flags);
+           restore_flags(flags);
            cs->prev = NULL;
            if (cs->akt_state == DEFLECT_ALERT)
              { strcpy(cs->deflect_dest,dv->rule.to_nr);
@@ -519,11 +525,12 @@ int isdn_divert_icall(isdn_ctrl *ic)
 
   if (cs) 
    { cs->prev = NULL;
-     spin_lock_irqsave(&divert_lock, flags);
+     save_flags(flags);
+     cli();
      cs->next = divert_head;
      divert_head = cs; 
      if (cs->timer.expires) add_timer(&cs->timer);
-     spin_unlock_irqrestore(&divert_lock, flags);
+     restore_flags(flags);
 
      put_info_buffer(cs->info); 
      return(retval);
@@ -537,7 +544,8 @@ void deleteprocs(void)
 { struct call_struc *cs, *cs1; 
   unsigned long flags;
 
-  spin_lock_irqsave(&divert_lock, flags);
+  save_flags(flags);
+  cli();
   cs = divert_head;
   divert_head = NULL;
   while (cs)
@@ -546,7 +554,7 @@ void deleteprocs(void)
      cs = cs->next;
      kfree(cs1);
    } 
-  spin_unlock_irqrestore(&divert_lock, flags);
+  restore_flags(flags);
 } /* deleteprocs */
 
 /****************************************************/
@@ -761,8 +769,8 @@ int prot_stat_callback(isdn_ctrl *ic)
    }  
 
   if (cs1->ics.driver == -1)
-   {
-     spin_lock_irqsave(&divert_lock, flags);
+   { save_flags(flags);
+     cli();
      del_timer(&cs1->timer);
      if (cs1->prev) 
        cs1->prev->next = cs1->next; /* forward link */
@@ -770,7 +778,7 @@ int prot_stat_callback(isdn_ctrl *ic)
        divert_head = cs1->next;
      if (cs1->next)
        cs1->next->prev = cs1->prev; /* back link */           
-     spin_unlock_irqrestore(&divert_lock, flags);
+     restore_flags(flags); 
      kfree(cs1);
    } 
 
@@ -818,14 +826,15 @@ int isdn_divert_stat_callback(isdn_ctrl *ic)
         cs = cs->next;
         if (cs1->ics.driver == -1)
           { 
-            spin_lock_irqsave(&divert_lock, flags);
+            save_flags(flags);
+            cli();
             if (cs1->prev) 
               cs1->prev->next = cs1->next; /* forward link */
             else
               divert_head = cs1->next;
             if (cs1->next)
               cs1->next->prev = cs1->prev; /* back link */           
-            spin_unlock_irqrestore(&divert_lock, flags);
+            restore_flags(flags); 
             kfree(cs1);
           } 
       }