diff options
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_intr.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_intr.c b/drivers/infiniband/hw/ipath/ipath_intr.c index 826b96b39952..3bad601fcc90 100644 --- a/drivers/infiniband/hw/ipath/ipath_intr.c +++ b/drivers/infiniband/hw/ipath/ipath_intr.c | |||
@@ -300,6 +300,18 @@ static void handle_e_ibstatuschanged(struct ipath_devdata *dd, | |||
300 | ltstate = ipath_ib_linktrstate(dd, ibcs); /* linktrainingtate */ | 300 | ltstate = ipath_ib_linktrstate(dd, ibcs); /* linktrainingtate */ |
301 | 301 | ||
302 | /* | 302 | /* |
303 | * Since going into a recovery state causes the link state to go | ||
304 | * down and since recovery is transitory, it is better if we "miss" | ||
305 | * ever seeing the link training state go into recovery (i.e., | ||
306 | * ignore this transition for link state special handling purposes) | ||
307 | * without even updating ipath_lastibcstat. | ||
308 | */ | ||
309 | if ((ltstate == INFINIPATH_IBCS_LT_STATE_RECOVERRETRAIN) || | ||
310 | (ltstate == INFINIPATH_IBCS_LT_STATE_RECOVERWAITRMT) || | ||
311 | (ltstate == INFINIPATH_IBCS_LT_STATE_RECOVERIDLE)) | ||
312 | goto done; | ||
313 | |||
314 | /* | ||
303 | * if linkstate transitions into INIT from any of the various down | 315 | * if linkstate transitions into INIT from any of the various down |
304 | * states, or if it transitions from any of the up (INIT or better) | 316 | * states, or if it transitions from any of the up (INIT or better) |
305 | * states into any of the down states (except link recovery), then | 317 | * states into any of the down states (except link recovery), then |
@@ -316,7 +328,7 @@ static void handle_e_ibstatuschanged(struct ipath_devdata *dd, | |||
316 | } | 328 | } |
317 | } else if ((lastlstate >= INFINIPATH_IBCS_L_STATE_INIT || | 329 | } else if ((lastlstate >= INFINIPATH_IBCS_L_STATE_INIT || |
318 | (dd->ipath_flags & IPATH_IB_FORCE_NOTIFY)) && | 330 | (dd->ipath_flags & IPATH_IB_FORCE_NOTIFY)) && |
319 | ltstate <= INFINIPATH_IBCS_LT_STATE_CFGDEBOUNCE && | 331 | ltstate <= INFINIPATH_IBCS_LT_STATE_CFGWAITRMT && |
320 | ltstate != INFINIPATH_IBCS_LT_STATE_LINKUP) { | 332 | ltstate != INFINIPATH_IBCS_LT_STATE_LINKUP) { |
321 | int handled; | 333 | int handled; |
322 | handled = dd->ipath_f_ib_updown(dd, 0, ibcs); | 334 | handled = dd->ipath_f_ib_updown(dd, 0, ibcs); |
@@ -460,6 +472,8 @@ static void handle_e_ibstatuschanged(struct ipath_devdata *dd, | |||
460 | 472 | ||
461 | skip_ibchange: | 473 | skip_ibchange: |
462 | dd->ipath_lastibcstat = ibcs; | 474 | dd->ipath_lastibcstat = ibcs; |
475 | done: | ||
476 | return; | ||
463 | } | 477 | } |
464 | 478 | ||
465 | static void handle_supp_msgs(struct ipath_devdata *dd, | 479 | static void handle_supp_msgs(struct ipath_devdata *dd, |