diff options
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/core/cm.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c index 1d9616be4192..f804e28e1ebb 100644 --- a/drivers/infiniband/core/cm.c +++ b/drivers/infiniband/core/cm.c | |||
@@ -1988,6 +1988,10 @@ int ib_send_cm_dreq(struct ib_cm_id *cm_id, | |||
1988 | goto out; | 1988 | goto out; |
1989 | } | 1989 | } |
1990 | 1990 | ||
1991 | if (cm_id->lap_state == IB_CM_LAP_SENT || | ||
1992 | cm_id->lap_state == IB_CM_MRA_LAP_RCVD) | ||
1993 | ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg); | ||
1994 | |||
1991 | ret = cm_alloc_msg(cm_id_priv, &msg); | 1995 | ret = cm_alloc_msg(cm_id_priv, &msg); |
1992 | if (ret) { | 1996 | if (ret) { |
1993 | cm_enter_timewait(cm_id_priv); | 1997 | cm_enter_timewait(cm_id_priv); |
@@ -2129,6 +2133,10 @@ static int cm_dreq_handler(struct cm_work *work) | |||
2129 | ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg); | 2133 | ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg); |
2130 | break; | 2134 | break; |
2131 | case IB_CM_ESTABLISHED: | 2135 | case IB_CM_ESTABLISHED: |
2136 | if (cm_id_priv->id.lap_state == IB_CM_LAP_SENT || | ||
2137 | cm_id_priv->id.lap_state == IB_CM_MRA_LAP_RCVD) | ||
2138 | ib_cancel_mad(cm_id_priv->av.port->mad_agent, cm_id_priv->msg); | ||
2139 | break; | ||
2132 | case IB_CM_MRA_REP_RCVD: | 2140 | case IB_CM_MRA_REP_RCVD: |
2133 | break; | 2141 | break; |
2134 | case IB_CM_TIMEWAIT: | 2142 | case IB_CM_TIMEWAIT: |
@@ -2349,9 +2357,18 @@ static int cm_rej_handler(struct cm_work *work) | |||
2349 | /* fall through */ | 2357 | /* fall through */ |
2350 | case IB_CM_REP_RCVD: | 2358 | case IB_CM_REP_RCVD: |
2351 | case IB_CM_MRA_REP_SENT: | 2359 | case IB_CM_MRA_REP_SENT: |
2352 | case IB_CM_ESTABLISHED: | ||
2353 | cm_enter_timewait(cm_id_priv); | 2360 | cm_enter_timewait(cm_id_priv); |
2354 | break; | 2361 | break; |
2362 | case IB_CM_ESTABLISHED: | ||
2363 | if (cm_id_priv->id.lap_state == IB_CM_LAP_UNINIT || | ||
2364 | cm_id_priv->id.lap_state == IB_CM_LAP_SENT) { | ||
2365 | if (cm_id_priv->id.lap_state == IB_CM_LAP_SENT) | ||
2366 | ib_cancel_mad(cm_id_priv->av.port->mad_agent, | ||
2367 | cm_id_priv->msg); | ||
2368 | cm_enter_timewait(cm_id_priv); | ||
2369 | break; | ||
2370 | } | ||
2371 | /* fall through */ | ||
2355 | default: | 2372 | default: |
2356 | spin_unlock_irq(&cm_id_priv->lock); | 2373 | spin_unlock_irq(&cm_id_priv->lock); |
2357 | ret = -EINVAL; | 2374 | ret = -EINVAL; |