162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Author       Karsten Keil <kkeil@novell.com>
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Thanks to    Jan den Ouden
762306a36Sopenharmony_ci *              Fritz Elfert
862306a36Sopenharmony_ci * Copyright 2008  by Karsten Keil <kkeil@novell.com>
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#ifndef _MISDN_FSM_H
1262306a36Sopenharmony_ci#define _MISDN_FSM_H
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <linux/timer.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/* Statemachine */
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistruct FsmInst;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_citypedef void (*FSMFNPTR)(struct FsmInst *, int, void *);
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct Fsm {
2362306a36Sopenharmony_ci	FSMFNPTR *jumpmatrix;
2462306a36Sopenharmony_ci	int state_count, event_count;
2562306a36Sopenharmony_ci	char **strEvent, **strState;
2662306a36Sopenharmony_ci};
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistruct FsmInst {
2962306a36Sopenharmony_ci	struct Fsm *fsm;
3062306a36Sopenharmony_ci	int state;
3162306a36Sopenharmony_ci	int debug;
3262306a36Sopenharmony_ci	void *userdata;
3362306a36Sopenharmony_ci	int userint;
3462306a36Sopenharmony_ci	void (*printdebug) (struct FsmInst *, char *, ...);
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistruct FsmNode {
3862306a36Sopenharmony_ci	int state, event;
3962306a36Sopenharmony_ci	void (*routine) (struct FsmInst *, int, void *);
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistruct FsmTimer {
4362306a36Sopenharmony_ci	struct FsmInst *fi;
4462306a36Sopenharmony_ci	struct timer_list tl;
4562306a36Sopenharmony_ci	int event;
4662306a36Sopenharmony_ci	void *arg;
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ciextern int mISDN_FsmNew(struct Fsm *, struct FsmNode *, int);
5062306a36Sopenharmony_ciextern void mISDN_FsmFree(struct Fsm *);
5162306a36Sopenharmony_ciextern int mISDN_FsmEvent(struct FsmInst *, int , void *);
5262306a36Sopenharmony_ciextern void mISDN_FsmChangeState(struct FsmInst *, int);
5362306a36Sopenharmony_ciextern void mISDN_FsmInitTimer(struct FsmInst *, struct FsmTimer *);
5462306a36Sopenharmony_ciextern int mISDN_FsmAddTimer(struct FsmTimer *, int, int, void *, int);
5562306a36Sopenharmony_ciextern void mISDN_FsmRestartTimer(struct FsmTimer *, int, int, void *, int);
5662306a36Sopenharmony_ciextern void mISDN_FsmDelTimer(struct FsmTimer *, int);
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#endif
59