From patchwork Thu May 3 15:47:31 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Karsten Keil X-Patchwork-Id: 156735 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id BB0C2B6FD0 for ; Fri, 4 May 2012 01:53:37 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932126Ab2ECPxS (ORCPT ); Thu, 3 May 2012 11:53:18 -0400 Received: from moutng.kundenserver.de ([212.227.126.171]:60435 "EHLO moutng.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757599Ab2ECPxE (ORCPT ); Thu, 3 May 2012 11:53:04 -0400 Received: from mailone.linux-pingi.de (p5497CE78.dip.t-dialin.net [84.151.206.120]) by mrelayeu.kundenserver.de (node=mreu0) with ESMTP (Nemesis) id 0Lo5FM-1RxFDi0S8u-00gLUy; Thu, 03 May 2012 17:53:02 +0200 Received: from pingi6.linux-pingi.de (pingi6.linux-pingi.de [10.23.200.6]) by mailone.linux-pingi.de (Postfix) with ESMTP id 7D7B369FC; Thu, 3 May 2012 17:52:59 +0200 (CEST) Received: by pingi6.linux-pingi.de (Postfix, from userid 1000) id C4ECD9FC07; Thu, 3 May 2012 17:47:33 +0200 (CEST) From: Karsten Keil To: David Miller Cc: netdev@vger.kernel.org, Karsten Keil Subject: [PATCHv2 6/7] mISDN: Layer1 statemachine fix Date: Thu, 3 May 2012 17:47:31 +0200 Message-Id: <1336060052-27119-7-git-send-email-kkeil@linux-pingi.de> X-Mailer: git-send-email 1.7.3.4 In-Reply-To: <1336060052-27119-1-git-send-email-kkeil@linux-pingi.de> References: <1336060052-27119-1-git-send-email-kkeil@linux-pingi.de> X-Provags-ID: V02:K0:CyexKiFFFk7RwFjFNQljiEsxclD4l+g9iu1yI4KYtW/ +FThpxID/jje68YAb0ZmThutM7Znm1tsNLHPj4EVRHNqsbZy2f qUJ61B7/oQXcS77uoBpXlaVBJ81RK8Dii93tm3L2PTkbgN1qdj VuVN3mS8+zCxX8amkllJakwUrG3HHcmatSeAAzmXTwnQRGzeE4 n/cpv+EA5M9e79CswD7eQncE4HKGVmuz7Rk1NoCW4gT/lBgu0i Td/3uXOmiyvXdK72h84oImDLmdLma4ubsBrfzcB+syMN1sVpVG Fa8kjseRyplRCRpggSdSBdbB+d/IyVxezDW5xI8W9Sglo/7soq r3SLEIbBQMrbojviPPd9EFUFOI9Lq8lB46CSZDIIxKTjs9Ygan iPt9wcFd6F7GchhPpBv4AQ8ZtsIIa/0fGQ= Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Karsten Keil The timer3 and the activation delay timer need to be independent. If timer3 fires do not reqest power up we have to send only INFO 0. Now layer1 pass TBR3 again. Signed-off-by: Karsten Keil --- drivers/isdn/mISDN/layer1.c | 24 ++++++++++++++---------- 1 files changed, 14 insertions(+), 10 deletions(-) diff --git a/drivers/isdn/mISDN/layer1.c b/drivers/isdn/mISDN/layer1.c index ff05153..98a455d 100644 --- a/drivers/isdn/mISDN/layer1.c +++ b/drivers/isdn/mISDN/layer1.c @@ -28,7 +28,8 @@ static u_int *debug; struct layer1 { u_long Flags; struct FsmInst l1m; - struct FsmTimer timer; + struct FsmTimer timer3; + struct FsmTimer timerX; int delay; int t3_value; struct dchannel *dch; @@ -135,7 +136,7 @@ l1_deact_req_s(struct FsmInst *fi, int event, void *arg) struct layer1 *l1 = fi->userdata; mISDN_FsmChangeState(fi, ST_L1_F3); - mISDN_FsmRestartTimer(&l1->timer, 550, EV_TIMER_DEACT, NULL, 2); + mISDN_FsmRestartTimer(&l1->timerX, 550, EV_TIMER_DEACT, NULL, 2); test_and_set_bit(FLG_L1_DEACTTIMER, &l1->Flags); } @@ -180,11 +181,11 @@ l1_info4_ind(struct FsmInst *fi, int event, void *arg) mISDN_FsmChangeState(fi, ST_L1_F7); l1->dcb(l1->dch, INFO3_P8); if (test_and_clear_bit(FLG_L1_DEACTTIMER, &l1->Flags)) - mISDN_FsmDelTimer(&l1->timer, 4); + mISDN_FsmDelTimer(&l1->timerX, 4); if (!test_bit(FLG_L1_ACTIVATED, &l1->Flags)) { if (test_and_clear_bit(FLG_L1_T3RUN, &l1->Flags)) - mISDN_FsmDelTimer(&l1->timer, 3); - mISDN_FsmRestartTimer(&l1->timer, 110, EV_TIMER_ACT, NULL, 2); + mISDN_FsmDelTimer(&l1->timer3, 3); + mISDN_FsmRestartTimer(&l1->timerX, 110, EV_TIMER_ACT, NULL, 2); test_and_set_bit(FLG_L1_ACTTIMER, &l1->Flags); } } @@ -200,9 +201,9 @@ l1_timer3(struct FsmInst *fi, int event, void *arg) l1->dcb(l1->dch, HW_D_NOBLOCKED); l1->dcb(l1->dch, PH_DEACTIVATE_IND); } - if (l1->l1m.state != ST_L1_F6) { + if (l1->l1m.state != ST_L1_F6) { /* stay in F6 */ mISDN_FsmChangeState(fi, ST_L1_F3); - l1->dcb(l1->dch, HW_POWERUP_REQ); + /* do not force anything here, we need send INFO 0 */ } } @@ -234,8 +235,9 @@ l1_activate_s(struct FsmInst *fi, int event, void *arg) { struct layer1 *l1 = fi->userdata; - mISDN_FsmRestartTimer(&l1->timer, l1->t3_value, EV_TIMER3, NULL, 2); + mISDN_FsmRestartTimer(&l1->timer3, l1->t3_value, EV_TIMER3, NULL, 2); test_and_set_bit(FLG_L1_T3RUN, &l1->Flags); + /* Tell HW to send INFO 1 */ l1->dcb(l1->dch, HW_RESET_REQ); } @@ -303,7 +305,8 @@ static struct FsmNode L1SFnList[] = static void release_l1(struct layer1 *l1) { - mISDN_FsmDelTimer(&l1->timer, 0); + mISDN_FsmDelTimer(&l1->timerX, 0); + mISDN_FsmDelTimer(&l1->timer3, 0); if (l1->dch) l1->dch->l1 = NULL; module_put(THIS_MODULE); @@ -395,7 +398,8 @@ create_l1(struct dchannel *dch, dchannel_l1callback *dcb) { nl1->l1m.printdebug = l1m_debug; nl1->dch = dch; nl1->dcb = dcb; - mISDN_FsmInitTimer(&nl1->l1m, &nl1->timer); + mISDN_FsmInitTimer(&nl1->l1m, &nl1->timer3); + mISDN_FsmInitTimer(&nl1->l1m, &nl1->timerX); __module_get(THIS_MODULE); dch->l1 = nl1; return 0;