]> git.hungrycats.org Git - linux/commitdiff
ISDN: Allow for return values in the state machine
authorKai Germaschewski <kai@tp1.ruhr-uni-bochum.de>
Sun, 6 Oct 2002 19:32:58 +0000 (14:32 -0500)
committerKai Germaschewski <kai@tp1.ruhr-uni-bochum.de>
Sun, 6 Oct 2002 19:32:58 +0000 (14:32 -0500)
It does not make sense for all events (like timer expiry), but for
some uses it's helpful for the called routine to return an error
code.

drivers/isdn/i4l/isdn_fsm.c
drivers/isdn/i4l/isdn_fsm.h
drivers/isdn/i4l/isdn_net_lib.c

index 5e3999d9c9d606e2f52e08936ba82b5ee6b8b78c..52de59763fe8000ca5a5469e478f349c11b0fba5 100644 (file)
@@ -41,7 +41,7 @@ fsm_new(struct fsm *fsm)
                               fsm->fn_tbl[i].ev, fsm->ev_cnt);
                        continue;
                }
-               fsm->jumpmatrix[fsm->st_cnt * fsm->fn_tbl[i].ev + fsm->fn_tbl[i].st] = fsm->fn_tbl[i].routine;
+               fsm->jumpmatrix[fsm->st_cnt * fsm->fn_tbl[i].ev + fsm->fn_tbl[i].st] = fsm->fn_tbl[i].fn;
        }
        return 0;
 }
@@ -77,8 +77,7 @@ fsm_event(struct fsm_inst *fi, int event, void *arg)
                               fi->fsm->st_str[fi->state],
                               fi->fsm->ev_str[event]);
 
-       fn(fi, event, arg);
-       return 0;
+       return fn(fi, event, arg);
 }
 
 void
index 1dd163826fcebb2b462be24d1ce628cf9259558a..4a48a401da457210890948980d40e661be350a76 100644 (file)
@@ -19,7 +19,7 @@
 
 struct fsm_inst;
 
-typedef void (*fsm_fn)(struct fsm_inst *, int, void *);
+typedef int (*fsm_fn)(struct fsm_inst *, int, void *);
 
 struct fsm {
        fsm_fn *jumpmatrix;
@@ -39,7 +39,7 @@ struct fsm_inst {
 
 struct fsm_node {
        int st, ev;
-       void (*routine) (struct fsm_inst *, int, void *);
+       fsm_fn fn;
 };
 
 struct fsm_timer {
index 579f58ef30069146b37aa380a1ae53775adf4d86..fa7eb8b08b4b53bcfc17a8a4d04caeb0b2d8b92f 100644 (file)
@@ -1278,11 +1278,11 @@ get_outgoing_phone(isdn_net_dev *idev)
        return NULL;
 }
 
-static void dialout_next(struct fsm_inst *fi, int pr, void *arg);
+static int dialout_next(struct fsm_inst *fi, int pr, void *arg);
 
 /* Initiate dialout. */
 
-static void
+static int
 dialout_first(struct fsm_inst *fi, int pr, void *arg)
 {
        isdn_net_dev *idev = fi->userdata;
@@ -1290,21 +1290,21 @@ dialout_first(struct fsm_inst *fi, int pr, void *arg)
 
        if (ISDN_NET_DIALMODE(*mlp) == ISDN_NET_DM_OFF) {
                isdn_net_unbind_channel(idev);
-               return;
+               return -EPERM;
        }
        if (list_empty(&mlp->phone[1])) {
                isdn_net_unbind_channel(idev);
-               return;
+               return -EINVAL;
        }
 
        idev->dial = 0;
        idev->dialretry = 0;
-       dialout_next(fi, pr, arg);
+       return dialout_next(fi, pr, arg);
 }
 
 /* Try dialing the next number. */
 
-static void
+static int
 dialout_next(struct fsm_inst *fi, int pr, void *arg)
 {
        isdn_net_dev *idev = fi->userdata;
@@ -1340,12 +1340,13 @@ dialout_next(struct fsm_inst *fi, int pr, void *arg)
 
        /* Dial */
        isdn_slot_dial(idev->isdn_slot, &dial);
+       return 0;
 }
 
 /* If we didn't connect within dialtimeout, we give up for now
  * and wait for dialwait jiffies before trying again.
  */
-static void
+static int
 dial_timeout(struct fsm_inst *fi, int pr, void *arg)
 {
        isdn_net_dev *idev = fi->userdata;
@@ -1363,13 +1364,14 @@ dial_timeout(struct fsm_inst *fi, int pr, void *arg)
        }
        if (idev->dialretry >= mlp->dialmax) {
                isdn_net_hangup(idev);
-               return;
+               return 0;
        }
        idev->dial_event = EV_TIMER_DIAL_WAIT;
        mod_timer(&idev->dial_timer, jiffies + mlp->dialwait);
+       return 0;
 }
 
-static void
+static int
 connect_fail(struct fsm_inst *fi, int pr, void *arg)
 {
        isdn_net_dev *idev = fi->userdata;
@@ -1378,9 +1380,10 @@ connect_fail(struct fsm_inst *fi, int pr, void *arg)
        isdn_slot_all_eaz(idev->isdn_slot);
        printk(KERN_INFO "%s: connection failed\n", idev->name);
        isdn_net_unbind_channel(idev);
+       return 0;
 }
 
-static void
+static int
 out_dconn(struct fsm_inst *fi, int pr, void *arg)
 {
        isdn_net_dev *idev = fi->userdata;
@@ -1388,9 +1391,10 @@ out_dconn(struct fsm_inst *fi, int pr, void *arg)
 
        fsm_change_state(&idev->fi, ST_OUT_WAIT_BCONN);
        isdn_slot_command(idev->isdn_slot, ISDN_CMD_ACCEPTB, &cmd);
+       return 0;
 }
 
-static void
+static int
 in_dconn(struct fsm_inst *fi, int pr, void *arg)
 {
        isdn_net_dev *idev = fi->userdata;
@@ -1398,9 +1402,10 @@ in_dconn(struct fsm_inst *fi, int pr, void *arg)
 
        fsm_change_state(&idev->fi, ST_IN_WAIT_BCONN);
        isdn_slot_command(idev->isdn_slot, ISDN_CMD_ACCEPTB, &cmd);
+       return 0;
 }
 
-static void
+static int
 bconn(struct fsm_inst *fi, int pr, void *arg)
 {
        isdn_net_dev *idev = fi->userdata;
@@ -1418,7 +1423,7 @@ bconn(struct fsm_inst *fi, int pr, void *arg)
 
        isdn_net_add_to_bundle(mlp, idev);
 
-       printk(KERN_INFO "isdn_net: %s connected\n", idev->name);
+       printk(KERN_INFO "%s connected\n", idev->name);
        /* If first Chargeinfo comes before B-Channel connect,
         * we correct the timestamp here.
         */
@@ -1432,9 +1437,11 @@ bconn(struct fsm_inst *fi, int pr, void *arg)
                mlp->ops->connected(idev);
        else
                isdn_net_dev_wake_queue(idev);
+
+       return 0;
 }
 
-static void
+static int
 bhup(struct fsm_inst *fi, int pr, void *arg)
 {
        isdn_net_dev *idev = fi->userdata;
@@ -1447,9 +1454,10 @@ bhup(struct fsm_inst *fi, int pr, void *arg)
        printk(KERN_INFO "%s: disconnected\n", idev->name);
        fsm_change_state(fi, ST_WAIT_DHUP);
        isdn_net_rm_from_bundle(idev);
+       return 0;
 }
 
-static void
+static int
 dhup(struct fsm_inst *fi, int pr, void *arg)
 {
        isdn_net_dev *idev = fi->userdata;
@@ -1457,11 +1465,12 @@ dhup(struct fsm_inst *fi, int pr, void *arg)
        printk(KERN_INFO "%s: Chargesum is %d\n", idev->name, idev->charge);
        isdn_slot_all_eaz(idev->isdn_slot);
        isdn_net_unbind_channel(idev);
+       return 0;
 }
 
 /* Check if it's time for idle hang-up */
 
-static void
+static int
 check_hup(struct fsm_inst *fi, int pr, void *arg)
 {
        isdn_net_dev *idev = fi->userdata;
@@ -1481,15 +1490,16 @@ check_hup(struct fsm_inst *fi, int pr, void *arg)
        }
        if (idev->outgoing || mlp->hupflags & ISDN_INHUP) {
                isdn_net_hangup(idev);
-               return;
+               return 0;
        }
  mod_timer:
        mod_timer(&idev->dial_timer, idev->dial_timer.expires + HZ);
+       return 0;
 }
 
 /* Charge-info from TelCo. */
 
-static void
+static int
 got_cinf(struct fsm_inst *fi, int pr, void *arg)
 {
        isdn_net_dev *idev = fi->userdata;
@@ -1508,6 +1518,7 @@ got_cinf(struct fsm_inst *fi, int pr, void *arg)
        }
        idev->chargetime = jiffies;
        dbg_net_dial("%s: got CINF\n", idev->name);
+       return 0;
 }
 
 /* Perform hangup for a net-interface. */
@@ -1567,21 +1578,23 @@ isdn_net_handle_event(isdn_net_dev *idev, int pr, void *arg)
        fsm_event(&idev->fi, pr, arg);
 }
 
-static void
+static int
 hang_up(struct fsm_inst *fi, int pr, void *arg)
 {
        isdn_net_dev *idev = fi->userdata;
 
        isdn_net_hangup(idev);
+       return 0;
 }
 
-static void
+static int
 got_bsent(struct fsm_inst *fi, int pr, void *arg)
 {
        isdn_net_dev *idev = fi->userdata;
        isdn_ctrl *c = arg;
        
        isdn_net_bsent(idev, c);
+       return 0;
 }
 
 static struct fsm_node isdn_net_fn_tbl[] = {