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)
                }
        } 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);
 
 skip_ibchange:
        dd->ipath_lastibcstat = ibcs;
+done:
+       return;
 }
 
 static void handle_supp_msgs(struct ipath_devdata *dd,