⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isdnl1.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
static voidl1_deact_req_s(struct FsmInst *fi, int event, void *arg){	struct PStack *st = fi->userdata;	FsmChangeState(fi, ST_L1_F3);	FsmRestartTimer(&st->l1.timer, 550, EV_TIMER_DEACT, NULL, 2);	test_and_set_bit(FLG_L1_DEACTTIMER, &st->l1.Flags);}static voidl1_power_up_s(struct FsmInst *fi, int event, void *arg){	struct PStack *st = fi->userdata;	if (test_bit(FLG_L1_ACTIVATING, &st->l1.Flags)) {		FsmChangeState(fi, ST_L1_F4);		st->l1.l1hw(st, HW_INFO3 | REQUEST, NULL);		FsmRestartTimer(&st->l1.timer, TIMER3_VALUE, EV_TIMER3, NULL, 2);		test_and_set_bit(FLG_L1_T3RUN, &st->l1.Flags);	} else		FsmChangeState(fi, ST_L1_F3);}static voidl1_go_F5(struct FsmInst *fi, int event, void *arg){	FsmChangeState(fi, ST_L1_F5);}static voidl1_go_F8(struct FsmInst *fi, int event, void *arg){	FsmChangeState(fi, ST_L1_F8);}static voidl1_info2_ind(struct FsmInst *fi, int event, void *arg){	struct PStack *st = fi->userdata;#ifdef HISAX_UINTERFACE	if (test_bit(FLG_L1_UINT, &st->l1.Flags))		FsmChangeState(fi, ST_L1_SYNC2);	else#endif		FsmChangeState(fi, ST_L1_F6);	st->l1.l1hw(st, HW_INFO3 | REQUEST, NULL);}static voidl1_info4_ind(struct FsmInst *fi, int event, void *arg){	struct PStack *st = fi->userdata;#ifdef HISAX_UINTERFACE	if (test_bit(FLG_L1_UINT, &st->l1.Flags))		FsmChangeState(fi, ST_L1_TRANS);	else#endif		FsmChangeState(fi, ST_L1_F7);	st->l1.l1hw(st, HW_INFO3 | REQUEST, NULL);	if (test_and_clear_bit(FLG_L1_DEACTTIMER, &st->l1.Flags))		FsmDelTimer(&st->l1.timer, 4);	if (!test_bit(FLG_L1_ACTIVATED, &st->l1.Flags)) {		if (test_and_clear_bit(FLG_L1_T3RUN, &st->l1.Flags))			FsmDelTimer(&st->l1.timer, 3);		FsmRestartTimer(&st->l1.timer, 110, EV_TIMER_ACT, NULL, 2);		test_and_set_bit(FLG_L1_ACTTIMER, &st->l1.Flags);	}}static voidl1_timer3(struct FsmInst *fi, int event, void *arg){	struct PStack *st = fi->userdata;	test_and_clear_bit(FLG_L1_T3RUN, &st->l1.Flags);		if (test_and_clear_bit(FLG_L1_ACTIVATING, &st->l1.Flags))		L1deactivated(st->l1.hardware);#ifdef HISAX_UINTERFACE	if (!test_bit(FLG_L1_UINT, &st->l1.Flags))#endif	if (st->l1.l1m.state != ST_L1_F6) {		FsmChangeState(fi, ST_L1_F3);		st->l1.l1hw(st, HW_ENABLE | REQUEST, NULL);	}}static voidl1_timer_act(struct FsmInst *fi, int event, void *arg){	struct PStack *st = fi->userdata;		test_and_clear_bit(FLG_L1_ACTTIMER, &st->l1.Flags);	test_and_set_bit(FLG_L1_ACTIVATED, &st->l1.Flags);	L1activated(st->l1.hardware);}static voidl1_timer_deact(struct FsmInst *fi, int event, void *arg){	struct PStack *st = fi->userdata;		test_and_clear_bit(FLG_L1_DEACTTIMER, &st->l1.Flags);	test_and_clear_bit(FLG_L1_ACTIVATED, &st->l1.Flags);	L1deactivated(st->l1.hardware);	st->l1.l1hw(st, HW_DEACTIVATE | RESPONSE, NULL);}static voidl1_activate_s(struct FsmInst *fi, int event, void *arg){	struct PStack *st = fi->userdata;                	st->l1.l1hw(st, HW_RESET | REQUEST, NULL);}static voidl1_activate_no(struct FsmInst *fi, int event, void *arg){	struct PStack *st = fi->userdata;	if ((!test_bit(FLG_L1_DEACTTIMER, &st->l1.Flags)) && (!test_bit(FLG_L1_T3RUN, &st->l1.Flags))) {		test_and_clear_bit(FLG_L1_ACTIVATING, &st->l1.Flags);		L1deactivated(st->l1.hardware);	}}static struct FsmNode L1SFnList[] __initdata ={	{ST_L1_F3, EV_PH_ACTIVATE, l1_activate_s},	{ST_L1_F6, EV_PH_ACTIVATE, l1_activate_no},	{ST_L1_F8, EV_PH_ACTIVATE, l1_activate_no},	{ST_L1_F3, EV_RESET_IND, l1_reset},	{ST_L1_F4, EV_RESET_IND, l1_reset},	{ST_L1_F5, EV_RESET_IND, l1_reset},	{ST_L1_F6, EV_RESET_IND, l1_reset},	{ST_L1_F7, EV_RESET_IND, l1_reset},	{ST_L1_F8, EV_RESET_IND, l1_reset},	{ST_L1_F3, EV_DEACT_CNF, l1_deact_cnf},	{ST_L1_F4, EV_DEACT_CNF, l1_deact_cnf},	{ST_L1_F5, EV_DEACT_CNF, l1_deact_cnf},	{ST_L1_F6, EV_DEACT_CNF, l1_deact_cnf},	{ST_L1_F7, EV_DEACT_CNF, l1_deact_cnf},	{ST_L1_F8, EV_DEACT_CNF, l1_deact_cnf},	{ST_L1_F6, EV_DEACT_IND, l1_deact_req_s},	{ST_L1_F7, EV_DEACT_IND, l1_deact_req_s},	{ST_L1_F8, EV_DEACT_IND, l1_deact_req_s},	{ST_L1_F3, EV_POWER_UP, l1_power_up_s},	{ST_L1_F4, EV_RSYNC_IND, l1_go_F5},	{ST_L1_F6, EV_RSYNC_IND, l1_go_F8},	{ST_L1_F7, EV_RSYNC_IND, l1_go_F8},	{ST_L1_F3, EV_INFO2_IND, l1_info2_ind},	{ST_L1_F4, EV_INFO2_IND, l1_info2_ind},	{ST_L1_F5, EV_INFO2_IND, l1_info2_ind},	{ST_L1_F7, EV_INFO2_IND, l1_info2_ind},	{ST_L1_F8, EV_INFO2_IND, l1_info2_ind},	{ST_L1_F3, EV_INFO4_IND, l1_info4_ind},	{ST_L1_F4, EV_INFO4_IND, l1_info4_ind},	{ST_L1_F5, EV_INFO4_IND, l1_info4_ind},	{ST_L1_F6, EV_INFO4_IND, l1_info4_ind},	{ST_L1_F8, EV_INFO4_IND, l1_info4_ind},	{ST_L1_F3, EV_TIMER3, l1_timer3},	{ST_L1_F4, EV_TIMER3, l1_timer3},	{ST_L1_F5, EV_TIMER3, l1_timer3},	{ST_L1_F6, EV_TIMER3, l1_timer3},	{ST_L1_F8, EV_TIMER3, l1_timer3},	{ST_L1_F7, EV_TIMER_ACT, l1_timer_act},	{ST_L1_F3, EV_TIMER_DEACT, l1_timer_deact},	{ST_L1_F4, EV_TIMER_DEACT, l1_timer_deact},	{ST_L1_F5, EV_TIMER_DEACT, l1_timer_deact},	{ST_L1_F6, EV_TIMER_DEACT, l1_timer_deact},	{ST_L1_F7, EV_TIMER_DEACT, l1_timer_deact},	{ST_L1_F8, EV_TIMER_DEACT, l1_timer_deact},};#define L1S_FN_COUNT (sizeof(L1SFnList)/sizeof(struct FsmNode))#ifdef HISAX_UINTERFACEstatic voidl1_deact_req_u(struct FsmInst *fi, int event, void *arg){	struct PStack *st = fi->userdata;	FsmChangeState(fi, ST_L1_RESET);	FsmRestartTimer(&st->l1.timer, 550, EV_TIMER_DEACT, NULL, 2);	test_and_set_bit(FLG_L1_DEACTTIMER, &st->l1.Flags);	st->l1.l1hw(st, HW_ENABLE | REQUEST, NULL);}static voidl1_power_up_u(struct FsmInst *fi, int event, void *arg){	struct PStack *st = fi->userdata;	FsmRestartTimer(&st->l1.timer, TIMER3_VALUE, EV_TIMER3, NULL, 2);	test_and_set_bit(FLG_L1_T3RUN, &st->l1.Flags);}static voidl1_info0_ind(struct FsmInst *fi, int event, void *arg){	FsmChangeState(fi, ST_L1_DEACT);}static voidl1_activate_u(struct FsmInst *fi, int event, void *arg){	struct PStack *st = fi->userdata;                	st->l1.l1hw(st, HW_INFO1 | REQUEST, NULL);}static struct FsmNode L1UFnList[] __initdata ={	{ST_L1_RESET, EV_DEACT_IND, l1_deact_req_u},	{ST_L1_DEACT, EV_DEACT_IND, l1_deact_req_u},	{ST_L1_SYNC2, EV_DEACT_IND, l1_deact_req_u},	{ST_L1_TRANS, EV_DEACT_IND, l1_deact_req_u},	{ST_L1_DEACT, EV_PH_ACTIVATE, l1_activate_u},	{ST_L1_DEACT, EV_POWER_UP, l1_power_up_u},	{ST_L1_DEACT, EV_INFO2_IND, l1_info2_ind},	{ST_L1_TRANS, EV_INFO2_IND, l1_info2_ind},	{ST_L1_RESET, EV_DEACT_CNF, l1_info0_ind},	{ST_L1_DEACT, EV_INFO4_IND, l1_info4_ind},	{ST_L1_SYNC2, EV_INFO4_IND, l1_info4_ind},	{ST_L1_RESET, EV_INFO4_IND, l1_info4_ind},	{ST_L1_DEACT, EV_TIMER3, l1_timer3},	{ST_L1_SYNC2, EV_TIMER3, l1_timer3},	{ST_L1_TRANS, EV_TIMER_ACT, l1_timer_act},	{ST_L1_DEACT, EV_TIMER_DEACT, l1_timer_deact},	{ST_L1_SYNC2, EV_TIMER_DEACT, l1_timer_deact},	{ST_L1_RESET, EV_TIMER_DEACT, l1_timer_deact},};#define L1U_FN_COUNT (sizeof(L1UFnList)/sizeof(struct FsmNode))#endifstatic voidl1b_activate(struct FsmInst *fi, int event, void *arg){	struct PStack *st = fi->userdata;	FsmChangeState(fi, ST_L1_WAIT_ACT);	FsmRestartTimer(&st->l1.timer, st->l1.delay, EV_TIMER_ACT, NULL, 2);}static voidl1b_deactivate(struct FsmInst *fi, int event, void *arg){	struct PStack *st = fi->userdata;	FsmChangeState(fi, ST_L1_WAIT_DEACT);	FsmRestartTimer(&st->l1.timer, 10, EV_TIMER_DEACT, NULL, 2);}static voidl1b_timer_act(struct FsmInst *fi, int event, void *arg){	struct PStack *st = fi->userdata;	FsmChangeState(fi, ST_L1_ACTIV);	st->l1.l1l2(st, PH_ACTIVATE | CONFIRM, NULL);}static voidl1b_timer_deact(struct FsmInst *fi, int event, void *arg){	struct PStack *st = fi->userdata;	FsmChangeState(fi, ST_L1_NULL);	st->l2.l2l1(st, PH_DEACTIVATE | CONFIRM, NULL);}static struct FsmNode L1BFnList[] __initdata ={	{ST_L1_NULL, EV_PH_ACTIVATE, l1b_activate},	{ST_L1_WAIT_ACT, EV_TIMER_ACT, l1b_timer_act},	{ST_L1_ACTIV, EV_PH_DEACTIVATE, l1b_deactivate},	{ST_L1_WAIT_DEACT, EV_TIMER_DEACT, l1b_timer_deact},};#define L1B_FN_COUNT (sizeof(L1BFnList)/sizeof(struct FsmNode))void __init Isdnl1New(void){#ifdef HISAX_UINTERFACE	l1fsm_u.state_count = L1U_STATE_COUNT;	l1fsm_u.event_count = L1_EVENT_COUNT;	l1fsm_u.strEvent = strL1Event;	l1fsm_u.strState = strL1UState;	FsmNew(&l1fsm_u, L1UFnList, L1U_FN_COUNT);#endif	l1fsm_s.state_count = L1S_STATE_COUNT;	l1fsm_s.event_count = L1_EVENT_COUNT;	l1fsm_s.strEvent = strL1Event;	l1fsm_s.strState = strL1SState;	FsmNew(&l1fsm_s, L1SFnList, L1S_FN_COUNT);	l1fsm_b.state_count = L1B_STATE_COUNT;	l1fsm_b.event_count = L1_EVENT_COUNT;	l1fsm_b.strEvent = strL1Event;	l1fsm_b.strState = strL1BState;	FsmNew(&l1fsm_b, L1BFnList, L1B_FN_COUNT);}void Isdnl1Free(void){#ifdef HISAX_UINTERFACE	FsmFree(&l1fsm_u);#endif	FsmFree(&l1fsm_s);	FsmFree(&l1fsm_b);}static voiddch_l2l1(struct PStack *st, int pr, void *arg){	struct IsdnCardState *cs = (struct IsdnCardState *) st->l1.hardware;	switch (pr) {		case (PH_DATA | REQUEST):		case (PH_PULL | REQUEST):		case (PH_PULL |INDICATION):			st->l1.l1hw(st, pr, arg);			break;		case (PH_ACTIVATE | REQUEST):			if (cs->debug)				debugl1(cs, "PH_ACTIVATE_REQ %s",					st->l1.l1m.fsm->strState[st->l1.l1m.state]);			if (test_bit(FLG_L1_ACTIVATED, &st->l1.Flags))				st->l1.l1l2(st, PH_ACTIVATE | CONFIRM, NULL);			else {				test_and_set_bit(FLG_L1_ACTIVATING, &st->l1.Flags);				FsmEvent(&st->l1.l1m, EV_PH_ACTIVATE, arg);			}			break;		case (PH_TESTLOOP | REQUEST):			if (1 & (long) arg)				debugl1(cs, "PH_TEST_LOOP B1");			if (2 & (long) arg)				debugl1(cs, "PH_TEST_LOOP B2");			if (!(3 & (long) arg))				debugl1(cs, "PH_TEST_LOOP DISABLED");			st->l1.l1hw(st, HW_TESTLOOP | REQUEST, arg);			break;		default:			if (cs->debug)				debugl1(cs, "dch_l2l1 msg %04X unhandled", pr);			break;	}}voidl1_msg(struct IsdnCardState *cs, int pr, void *arg) {	struct PStack *st;	st = cs->stlist;		while (st) {		switch(pr) {			case (HW_RESET | INDICATION):				FsmEvent(&st->l1.l1m, EV_RESET_IND, arg);				break;			case (HW_DEACTIVATE | CONFIRM):				FsmEvent(&st->l1.l1m, EV_DEACT_CNF, arg);				break;			case (HW_DEACTIVATE | INDICATION):				FsmEvent(&st->l1.l1m, EV_DEACT_IND, arg);				break;			case (HW_POWERUP | CONFIRM):				FsmEvent(&st->l1.l1m, EV_POWER_UP, arg);				break;			case (HW_RSYNC | INDICATION):				FsmEvent(&st->l1.l1m, EV_RSYNC_IND, arg);				break;			case (HW_INFO2 | INDICATION):				FsmEvent(&st->l1.l1m, EV_INFO2_IND, arg);				break;			case (HW_INFO4_P8 | INDICATION):			case (HW_INFO4_P10 | INDICATION):				FsmEvent(&st->l1.l1m, EV_INFO4_IND, arg);				break;			default:				if (cs->debug)					debugl1(cs, "l1msg %04X unhandled", pr);				break;		}		st = st->next;	}}voidl1_msg_b(struct PStack *st, int pr, void *arg) {	switch(pr) {		case (PH_ACTIVATE | REQUEST):			FsmEvent(&st->l1.l1m, EV_PH_ACTIVATE, NULL);			break;		case (PH_DEACTIVATE | REQUEST):			FsmEvent(&st->l1.l1m, EV_PH_DEACTIVATE, NULL);			break;	}}voidsetstack_HiSax(struct PStack *st, struct IsdnCardState *cs){	st->l1.hardware = cs;	st->protocol = cs->protocol;	st->l1.l1m.fsm = &l1fsm_s;	st->l1.l1m.state = ST_L1_F3;	st->l1.Flags = 0;#ifdef HISAX_UINTERFACE	if (test_bit(FLG_HW_L1_UINT, &cs->HW_Flags)) {		st->l1.l1m.fsm = &l1fsm_u;		st->l1.l1m.state = ST_L1_RESET;		st->l1.Flags = FLG_L1_UINT;	}#endif	st->l1.l1m.debug = cs->debug;	st->l1.l1m.userdata = st;	st->l1.l1m.userint = 0;	st->l1.l1m.printdebug = l1m_debug;	FsmInitTimer(&st->l1.l1m, &st->l1.timer);	setstack_tei(st);	setstack_manager(st);	st->l1.stlistp = &(cs->stlist);	st->l2.l2l1  = dch_l2l1;	cs->setstack_d(st, cs);}voidsetstack_l1_B(struct PStack *st){	struct IsdnCardState *cs = st->l1.hardware;	st->l1.l1m.fsm = &l1fsm_b;	st->l1.l1m.state = ST_L1_NULL;	st->l1.l1m.debug = cs->debug;	st->l1.l1m.userdata = st;	st->l1.l1m.userint = 0;	st->l1.l1m.printdebug = l1m_debug;	st->l1.Flags = 0;	FsmInitTimer(&st->l1.l1m, &st->l1.timer);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -