From 9533dd256ac8ab85b984e3af43d0ae2881fb86a2 Mon Sep 17 00:00:00 2001 From: Dave Olson Date: Wed, 16 Apr 2008 21:09:29 -0700 Subject: [PATCH] --- yaml --- r: 88523 b: refs/heads/master c: 555b203e48faeacc0373eda7bc87db874db37136 h: refs/heads/master i: 88521: 29bf348b84251e6e408bfd4910511a9ec73babfa 88519: d81fffaec23e5c84843c9de5f43d82a5829eb960 v: v3 --- [refs] | 2 +- trunk/drivers/infiniband/hw/ipath/ipath_intr.c | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 1ad453f8a879..d95f5cbe4623 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9355fb6a064723c71e80e9c78de3140b43bfb52d +refs/heads/master: 555b203e48faeacc0373eda7bc87db874db37136 diff --git a/trunk/drivers/infiniband/hw/ipath/ipath_intr.c b/trunk/drivers/infiniband/hw/ipath/ipath_intr.c index 826b96b39952..3bad601fcc90 100644 --- a/trunk/drivers/infiniband/hw/ipath/ipath_intr.c +++ b/trunk/drivers/infiniband/hw/ipath/ipath_intr.c @@ -299,6 +299,18 @@ static void handle_e_ibstatuschanged(struct ipath_devdata *dd, lastlstate = ipath_ib_linkstate(dd, dd->ipath_lastibcstat); ltstate = ipath_ib_linktrstate(dd, ibcs); /* linktrainingtate */ + /* + * Since going into a recovery state causes the link state to go + * down and since recovery is transitory, it is better if we "miss" + * ever seeing the link training state go into recovery (i.e., + * ignore this transition for link state special handling purposes) + * without even updating ipath_lastibcstat. + */ + if ((ltstate == INFINIPATH_IBCS_LT_STATE_RECOVERRETRAIN) || + (ltstate == INFINIPATH_IBCS_LT_STATE_RECOVERWAITRMT) || + (ltstate == INFINIPATH_IBCS_LT_STATE_RECOVERIDLE)) + goto done; + /* * if linkstate transitions into INIT from any of the various down * states, or if it transitions from any of the up (INIT or better) @@ -316,7 +328,7 @@ static void handle_e_ibstatuschanged(struct ipath_devdata *dd, } } else if ((lastlstate >= INFINIPATH_IBCS_L_STATE_INIT || (dd->ipath_flags & IPATH_IB_FORCE_NOTIFY)) && - ltstate <= INFINIPATH_IBCS_LT_STATE_CFGDEBOUNCE && + ltstate <= INFINIPATH_IBCS_LT_STATE_CFGWAITRMT && ltstate != INFINIPATH_IBCS_LT_STATE_LINKUP) { int handled; handled = dd->ipath_f_ib_updown(dd, 0, ibcs); @@ -460,6 +472,8 @@ static void handle_e_ibstatuschanged(struct ipath_devdata *dd, skip_ibchange: dd->ipath_lastibcstat = ibcs; +done: + return; } static void handle_supp_msgs(struct ipath_devdata *dd,