diff options
Diffstat (limited to 'drivers/infiniband/hw/cxgb4/cm.c')
-rw-r--r-- | drivers/infiniband/hw/cxgb4/cm.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c index 5e153f6d4b48..768a0fb67dd6 100644 --- a/drivers/infiniband/hw/cxgb4/cm.c +++ b/drivers/infiniband/hw/cxgb4/cm.c | |||
@@ -432,8 +432,17 @@ static void arp_failure_discard(void *handle, struct sk_buff *skb) | |||
432 | */ | 432 | */ |
433 | static void act_open_req_arp_failure(void *handle, struct sk_buff *skb) | 433 | static void act_open_req_arp_failure(void *handle, struct sk_buff *skb) |
434 | { | 434 | { |
435 | struct c4iw_ep *ep = handle; | ||
436 | |||
435 | printk(KERN_ERR MOD "ARP failure duing connect\n"); | 437 | printk(KERN_ERR MOD "ARP failure duing connect\n"); |
436 | kfree_skb(skb); | 438 | kfree_skb(skb); |
439 | connect_reply_upcall(ep, -EHOSTUNREACH); | ||
440 | state_set(&ep->com, DEAD); | ||
441 | remove_handle(ep->com.dev, &ep->com.dev->atid_idr, ep->atid); | ||
442 | cxgb4_free_atid(ep->com.dev->rdev.lldi.tids, ep->atid); | ||
443 | dst_release(ep->dst); | ||
444 | cxgb4_l2t_release(ep->l2t); | ||
445 | c4iw_put_ep(&ep->com); | ||
437 | } | 446 | } |
438 | 447 | ||
439 | /* | 448 | /* |
@@ -658,7 +667,7 @@ static int send_connect(struct c4iw_ep *ep) | |||
658 | opt2 |= T5_OPT_2_VALID; | 667 | opt2 |= T5_OPT_2_VALID; |
659 | opt2 |= V_CONG_CNTRL(CONG_ALG_TAHOE); | 668 | opt2 |= V_CONG_CNTRL(CONG_ALG_TAHOE); |
660 | } | 669 | } |
661 | t4_set_arp_err_handler(skb, NULL, act_open_req_arp_failure); | 670 | t4_set_arp_err_handler(skb, ep, act_open_req_arp_failure); |
662 | 671 | ||
663 | if (is_t4(ep->com.dev->rdev.lldi.adapter_type)) { | 672 | if (is_t4(ep->com.dev->rdev.lldi.adapter_type)) { |
664 | if (ep->com.remote_addr.ss_family == AF_INET) { | 673 | if (ep->com.remote_addr.ss_family == AF_INET) { |
@@ -2180,7 +2189,6 @@ static void reject_cr(struct c4iw_dev *dev, u32 hwtid, struct sk_buff *skb) | |||
2180 | PDBG("%s c4iw_dev %p tid %u\n", __func__, dev, hwtid); | 2189 | PDBG("%s c4iw_dev %p tid %u\n", __func__, dev, hwtid); |
2181 | BUG_ON(skb_cloned(skb)); | 2190 | BUG_ON(skb_cloned(skb)); |
2182 | skb_trim(skb, sizeof(struct cpl_tid_release)); | 2191 | skb_trim(skb, sizeof(struct cpl_tid_release)); |
2183 | skb_get(skb); | ||
2184 | release_tid(&dev->rdev, hwtid, skb); | 2192 | release_tid(&dev->rdev, hwtid, skb); |
2185 | return; | 2193 | return; |
2186 | } | 2194 | } |
@@ -3917,7 +3925,7 @@ int __init c4iw_cm_init(void) | |||
3917 | return 0; | 3925 | return 0; |
3918 | } | 3926 | } |
3919 | 3927 | ||
3920 | void __exit c4iw_cm_term(void) | 3928 | void c4iw_cm_term(void) |
3921 | { | 3929 | { |
3922 | WARN_ON(!list_empty(&timeout_list)); | 3930 | WARN_ON(!list_empty(&timeout_list)); |
3923 | flush_workqueue(workq); | 3931 | flush_workqueue(workq); |