aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
diff options
context:
space:
mode:
authorVipul Pandya <vipul@chelsio.com>2013-01-07 08:11:57 -0500
committerRoland Dreier <roland@purestorage.com>2013-02-14 18:51:57 -0500
commitfe7e0a4dd0304745b57e08827fde13e1c2376e66 (patch)
treebc4275ac6c6c1a274043e02e2f33a2b6688880f9 /drivers/infiniband
parent1ec779cc29238e6f4d315bff53cd36165819bfd5 (diff)
RDMA/cxgb4: Don't reconnect on abort for mpa_rev 1
Only reconnect if the endpoint wasn't freed. peer_abort() should only attempt to reconnect if the endpoint wasn't freed. Also remove hwtid from the debugfs idr. Add missing check for peer2peer in MPAv2 code Use correct mpa version on reject. Signed-off-by: Vipul Pandya <vipul@chelsio.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/hw/cxgb4/cm.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c
index ab5b4dd39dec..88933af05c5c 100644
--- a/drivers/infiniband/hw/cxgb4/cm.c
+++ b/drivers/infiniband/hw/cxgb4/cm.c
@@ -284,10 +284,10 @@ void _c4iw_free_ep(struct kref *kref)
284 if (test_bit(QP_REFERENCED, &ep->com.flags)) 284 if (test_bit(QP_REFERENCED, &ep->com.flags))
285 deref_qp(ep); 285 deref_qp(ep);
286 if (test_bit(RELEASE_RESOURCES, &ep->com.flags)) { 286 if (test_bit(RELEASE_RESOURCES, &ep->com.flags)) {
287 remove_handle(ep->com.dev, &ep->com.dev->hwtid_idr, ep->hwtid);
287 cxgb4_remove_tid(ep->com.dev->rdev.lldi.tids, 0, ep->hwtid); 288 cxgb4_remove_tid(ep->com.dev->rdev.lldi.tids, 0, ep->hwtid);
288 dst_release(ep->dst); 289 dst_release(ep->dst);
289 cxgb4_l2t_release(ep->l2t); 290 cxgb4_l2t_release(ep->l2t);
290 remove_handle(ep->com.dev, &ep->com.dev->hwtid_idr, ep->hwtid);
291 } 291 }
292 kfree(ep); 292 kfree(ep);
293} 293}
@@ -699,7 +699,7 @@ static int send_mpa_reject(struct c4iw_ep *ep, const void *pdata, u8 plen)
699 memset(mpa, 0, sizeof(*mpa)); 699 memset(mpa, 0, sizeof(*mpa));
700 memcpy(mpa->key, MPA_KEY_REP, sizeof(mpa->key)); 700 memcpy(mpa->key, MPA_KEY_REP, sizeof(mpa->key));
701 mpa->flags = MPA_REJECT; 701 mpa->flags = MPA_REJECT;
702 mpa->revision = mpa_rev; 702 mpa->revision = ep->mpa_attr.version;
703 mpa->private_data_size = htons(plen); 703 mpa->private_data_size = htons(plen);
704 704
705 if (ep->mpa_attr.version == 2 && ep->mpa_attr.enhanced_rdma_conn) { 705 if (ep->mpa_attr.version == 2 && ep->mpa_attr.enhanced_rdma_conn) {
@@ -2176,7 +2176,7 @@ static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb)
2176 break; 2176 break;
2177 case MPA_REQ_SENT: 2177 case MPA_REQ_SENT:
2178 stop_ep_timer(ep); 2178 stop_ep_timer(ep);
2179 if (mpa_rev == 2 && ep->tried_with_mpa_v1) 2179 if (mpa_rev == 1 || (mpa_rev == 2 && ep->tried_with_mpa_v1))
2180 connect_reply_upcall(ep, -ECONNRESET); 2180 connect_reply_upcall(ep, -ECONNRESET);
2181 else { 2181 else {
2182 /* 2182 /*
@@ -2248,9 +2248,8 @@ static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb)
2248out: 2248out:
2249 if (release) 2249 if (release)
2250 release_ep_resources(ep); 2250 release_ep_resources(ep);
2251 2251 else if (ep->retry_with_mpa_v1) {
2252 /* retry with mpa-v1 */ 2252 remove_handle(ep->com.dev, &ep->com.dev->hwtid_idr, ep->hwtid);
2253 if (ep && ep->retry_with_mpa_v1) {
2254 cxgb4_remove_tid(ep->com.dev->rdev.lldi.tids, 0, ep->hwtid); 2253 cxgb4_remove_tid(ep->com.dev->rdev.lldi.tids, 0, ep->hwtid);
2255 dst_release(ep->dst); 2254 dst_release(ep->dst);
2256 cxgb4_l2t_release(ep->l2t); 2255 cxgb4_l2t_release(ep->l2t);