summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Germaschewski <kai@tp1.ruhr-uni-bochum.de>2002-10-06 14:32:58 -0500
committerKai Germaschewski <kai@tp1.ruhr-uni-bochum.de>2002-10-06 14:32:58 -0500
commit9c06758cdc72e6c445fa6488a660cb8a3c7d008c (patch)
treee3bec80ce3e25b7921205d727015fdf32ccb094d
parent95f3f1d90ad79100cff98710836e7bb1a0aa6030 (diff)
ISDN: Allow for return values in the state machine
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.
-rw-r--r--drivers/isdn/i4l/isdn_fsm.c5
-rw-r--r--drivers/isdn/i4l/isdn_fsm.h4
-rw-r--r--drivers/isdn/i4l/isdn_net_lib.c53
3 files changed, 37 insertions, 25 deletions
diff --git a/drivers/isdn/i4l/isdn_fsm.c b/drivers/isdn/i4l/isdn_fsm.c
index 5e3999d9c9d6..52de59763fe8 100644
--- a/drivers/isdn/i4l/isdn_fsm.c
+++ b/drivers/isdn/i4l/isdn_fsm.c
@@ -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
diff --git a/drivers/isdn/i4l/isdn_fsm.h b/drivers/isdn/i4l/isdn_fsm.h
index 1dd163826fce..4a48a401da45 100644
--- a/drivers/isdn/i4l/isdn_fsm.h
+++ b/drivers/isdn/i4l/isdn_fsm.h
@@ -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 {
diff --git a/drivers/isdn/i4l/isdn_net_lib.c b/drivers/isdn/i4l/isdn_net_lib.c
index 579f58ef3006..fa7eb8b08b4b 100644
--- a/drivers/isdn/i4l/isdn_net_lib.c
+++ b/drivers/isdn/i4l/isdn_net_lib.c
@@ -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[] = {