diff options
-rw-r--r-- | drivers/infiniband/core/cm.c | 51 | ||||
-rw-r--r-- | include/rdma/ib_cm.h | 7 |
2 files changed, 28 insertions, 30 deletions
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c index 4df269f5d9ac..2e39236d189f 100644 --- a/drivers/infiniband/core/cm.c +++ b/drivers/infiniband/core/cm.c | |||
@@ -2219,6 +2219,9 @@ int ib_send_cm_mra(struct ib_cm_id *cm_id, | |||
2219 | { | 2219 | { |
2220 | struct cm_id_private *cm_id_priv; | 2220 | struct cm_id_private *cm_id_priv; |
2221 | struct ib_mad_send_buf *msg; | 2221 | struct ib_mad_send_buf *msg; |
2222 | enum ib_cm_state cm_state; | ||
2223 | enum ib_cm_lap_state lap_state; | ||
2224 | enum cm_msg_response msg_response; | ||
2222 | void *data; | 2225 | void *data; |
2223 | unsigned long flags; | 2226 | unsigned long flags; |
2224 | int ret; | 2227 | int ret; |
@@ -2235,48 +2238,40 @@ int ib_send_cm_mra(struct ib_cm_id *cm_id, | |||
2235 | spin_lock_irqsave(&cm_id_priv->lock, flags); | 2238 | spin_lock_irqsave(&cm_id_priv->lock, flags); |
2236 | switch(cm_id_priv->id.state) { | 2239 | switch(cm_id_priv->id.state) { |
2237 | case IB_CM_REQ_RCVD: | 2240 | case IB_CM_REQ_RCVD: |
2238 | ret = cm_alloc_msg(cm_id_priv, &msg); | 2241 | cm_state = IB_CM_MRA_REQ_SENT; |
2239 | if (ret) | 2242 | lap_state = cm_id->lap_state; |
2240 | goto error1; | 2243 | msg_response = CM_MSG_RESPONSE_REQ; |
2241 | |||
2242 | cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv, | ||
2243 | CM_MSG_RESPONSE_REQ, service_timeout, | ||
2244 | private_data, private_data_len); | ||
2245 | ret = ib_post_send_mad(msg, NULL); | ||
2246 | if (ret) | ||
2247 | goto error2; | ||
2248 | cm_id->state = IB_CM_MRA_REQ_SENT; | ||
2249 | break; | 2244 | break; |
2250 | case IB_CM_REP_RCVD: | 2245 | case IB_CM_REP_RCVD: |
2251 | ret = cm_alloc_msg(cm_id_priv, &msg); | 2246 | cm_state = IB_CM_MRA_REP_SENT; |
2252 | if (ret) | 2247 | lap_state = cm_id->lap_state; |
2253 | goto error1; | 2248 | msg_response = CM_MSG_RESPONSE_REP; |
2254 | |||
2255 | cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv, | ||
2256 | CM_MSG_RESPONSE_REP, service_timeout, | ||
2257 | private_data, private_data_len); | ||
2258 | ret = ib_post_send_mad(msg, NULL); | ||
2259 | if (ret) | ||
2260 | goto error2; | ||
2261 | cm_id->state = IB_CM_MRA_REP_SENT; | ||
2262 | break; | 2249 | break; |
2263 | case IB_CM_ESTABLISHED: | 2250 | case IB_CM_ESTABLISHED: |
2251 | cm_state = cm_id->state; | ||
2252 | lap_state = IB_CM_MRA_LAP_SENT; | ||
2253 | msg_response = CM_MSG_RESPONSE_OTHER; | ||
2254 | break; | ||
2255 | default: | ||
2256 | ret = -EINVAL; | ||
2257 | goto error1; | ||
2258 | } | ||
2259 | |||
2260 | if (!(service_timeout & IB_CM_MRA_FLAG_DELAY)) { | ||
2264 | ret = cm_alloc_msg(cm_id_priv, &msg); | 2261 | ret = cm_alloc_msg(cm_id_priv, &msg); |
2265 | if (ret) | 2262 | if (ret) |
2266 | goto error1; | 2263 | goto error1; |
2267 | 2264 | ||
2268 | cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv, | 2265 | cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv, |
2269 | CM_MSG_RESPONSE_OTHER, service_timeout, | 2266 | msg_response, service_timeout, |
2270 | private_data, private_data_len); | 2267 | private_data, private_data_len); |
2271 | ret = ib_post_send_mad(msg, NULL); | 2268 | ret = ib_post_send_mad(msg, NULL); |
2272 | if (ret) | 2269 | if (ret) |
2273 | goto error2; | 2270 | goto error2; |
2274 | cm_id->lap_state = IB_CM_MRA_LAP_SENT; | ||
2275 | break; | ||
2276 | default: | ||
2277 | ret = -EINVAL; | ||
2278 | goto error1; | ||
2279 | } | 2271 | } |
2272 | |||
2273 | cm_id->state = cm_state; | ||
2274 | cm_id->lap_state = lap_state; | ||
2280 | cm_id_priv->service_timeout = service_timeout; | 2275 | cm_id_priv->service_timeout = service_timeout; |
2281 | cm_set_private_data(cm_id_priv, data, private_data_len); | 2276 | cm_set_private_data(cm_id_priv, data, private_data_len); |
2282 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); | 2277 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); |
diff --git a/include/rdma/ib_cm.h b/include/rdma/ib_cm.h index 12243e80c706..a627c8682d2f 100644 --- a/include/rdma/ib_cm.h +++ b/include/rdma/ib_cm.h | |||
@@ -477,12 +477,15 @@ int ib_send_cm_rej(struct ib_cm_id *cm_id, | |||
477 | const void *private_data, | 477 | const void *private_data, |
478 | u8 private_data_len); | 478 | u8 private_data_len); |
479 | 479 | ||
480 | #define IB_CM_MRA_FLAG_DELAY 0x80 /* Send MRA only after a duplicate msg */ | ||
481 | |||
480 | /** | 482 | /** |
481 | * ib_send_cm_mra - Sends a message receipt acknowledgement to a connection | 483 | * ib_send_cm_mra - Sends a message receipt acknowledgement to a connection |
482 | * message. | 484 | * message. |
483 | * @cm_id: Connection identifier associated with the connection message. | 485 | * @cm_id: Connection identifier associated with the connection message. |
484 | * @service_timeout: The maximum time required for the sender to reply to | 486 | * @service_timeout: The lower 5-bits specify the maximum time required for |
485 | * to the connection message. | 487 | * the sender to reply to to the connection message. The upper 3-bits |
488 | * specify additional control flags. | ||
486 | * @private_data: Optional user-defined private data sent with the | 489 | * @private_data: Optional user-defined private data sent with the |
487 | * message receipt acknowledgement. | 490 | * message receipt acknowledgement. |
488 | * @private_data_len: Size of the private data buffer, in bytes. | 491 | * @private_data_len: Size of the private data buffer, in bytes. |