diff options
Diffstat (limited to 'drivers/infiniband/hw/nes/nes_cm.c')
-rw-r--r-- | drivers/infiniband/hw/nes/nes_cm.c | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c index 61e0efd4ccfb..e74cdf9ef471 100644 --- a/drivers/infiniband/hw/nes/nes_cm.c +++ b/drivers/infiniband/hw/nes/nes_cm.c | |||
@@ -1104,20 +1104,24 @@ static inline int mini_cm_accelerated(struct nes_cm_core *cm_core, | |||
1104 | static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpindex) | 1104 | static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpindex) |
1105 | { | 1105 | { |
1106 | struct rtable *rt; | 1106 | struct rtable *rt; |
1107 | struct flowi fl; | ||
1108 | struct neighbour *neigh; | 1107 | struct neighbour *neigh; |
1109 | int rc = arpindex; | 1108 | int rc = arpindex; |
1109 | struct net_device *netdev; | ||
1110 | struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter; | 1110 | struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter; |
1111 | 1111 | ||
1112 | memset(&fl, 0, sizeof fl); | 1112 | rt = ip_route_output(&init_net, htonl(dst_ip), 0, 0, 0); |
1113 | fl.nl_u.ip4_u.daddr = htonl(dst_ip); | 1113 | if (IS_ERR(rt)) { |
1114 | if (ip_route_output_key(&init_net, &rt, &fl)) { | ||
1115 | printk(KERN_ERR "%s: ip_route_output_key failed for 0x%08X\n", | 1114 | printk(KERN_ERR "%s: ip_route_output_key failed for 0x%08X\n", |
1116 | __func__, dst_ip); | 1115 | __func__, dst_ip); |
1117 | return rc; | 1116 | return rc; |
1118 | } | 1117 | } |
1119 | 1118 | ||
1120 | neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, nesvnic->netdev); | 1119 | if (netif_is_bond_slave(nesvnic->netdev)) |
1120 | netdev = nesvnic->netdev->master; | ||
1121 | else | ||
1122 | netdev = nesvnic->netdev; | ||
1123 | |||
1124 | neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, netdev); | ||
1121 | if (neigh) { | 1125 | if (neigh) { |
1122 | if (neigh->nud_state & NUD_VALID) { | 1126 | if (neigh->nud_state & NUD_VALID) { |
1123 | nes_debug(NES_DBG_CM, "Neighbor MAC address for 0x%08X" | 1127 | nes_debug(NES_DBG_CM, "Neighbor MAC address for 0x%08X" |
@@ -1393,7 +1397,7 @@ static void handle_fin_pkt(struct nes_cm_node *cm_node) | |||
1393 | cleanup_retrans_entry(cm_node); | 1397 | cleanup_retrans_entry(cm_node); |
1394 | cm_node->state = NES_CM_STATE_CLOSING; | 1398 | cm_node->state = NES_CM_STATE_CLOSING; |
1395 | send_ack(cm_node, NULL); | 1399 | send_ack(cm_node, NULL); |
1396 | /* Wait for ACK as this is simultanous close.. | 1400 | /* Wait for ACK as this is simultaneous close.. |
1397 | * After we receive ACK, do not send anything.. | 1401 | * After we receive ACK, do not send anything.. |
1398 | * Just rm the node.. Done.. */ | 1402 | * Just rm the node.. Done.. */ |
1399 | break; | 1403 | break; |
@@ -1424,7 +1428,6 @@ static void handle_rst_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb, | |||
1424 | { | 1428 | { |
1425 | 1429 | ||
1426 | int reset = 0; /* whether to send reset in case of err.. */ | 1430 | int reset = 0; /* whether to send reset in case of err.. */ |
1427 | int passive_state; | ||
1428 | atomic_inc(&cm_resets_recvd); | 1431 | atomic_inc(&cm_resets_recvd); |
1429 | nes_debug(NES_DBG_CM, "Received Reset, cm_node = %p, state = %u." | 1432 | nes_debug(NES_DBG_CM, "Received Reset, cm_node = %p, state = %u." |
1430 | " refcnt=%d\n", cm_node, cm_node->state, | 1433 | " refcnt=%d\n", cm_node, cm_node->state, |
@@ -1439,7 +1442,7 @@ static void handle_rst_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb, | |||
1439 | active_open_err(cm_node, skb, reset); | 1442 | active_open_err(cm_node, skb, reset); |
1440 | break; | 1443 | break; |
1441 | case NES_CM_STATE_MPAREQ_RCVD: | 1444 | case NES_CM_STATE_MPAREQ_RCVD: |
1442 | passive_state = atomic_add_return(1, &cm_node->passive_state); | 1445 | atomic_inc(&cm_node->passive_state); |
1443 | dev_kfree_skb_any(skb); | 1446 | dev_kfree_skb_any(skb); |
1444 | break; | 1447 | break; |
1445 | case NES_CM_STATE_ESTABLISHED: | 1448 | case NES_CM_STATE_ESTABLISHED: |
@@ -2560,7 +2563,7 @@ static int nes_cm_disconn_true(struct nes_qp *nesqp) | |||
2560 | u16 last_ae; | 2563 | u16 last_ae; |
2561 | u8 original_hw_tcp_state; | 2564 | u8 original_hw_tcp_state; |
2562 | u8 original_ibqp_state; | 2565 | u8 original_ibqp_state; |
2563 | enum iw_cm_event_status disconn_status = IW_CM_EVENT_STATUS_OK; | 2566 | int disconn_status = 0; |
2564 | int issue_disconn = 0; | 2567 | int issue_disconn = 0; |
2565 | int issue_close = 0; | 2568 | int issue_close = 0; |
2566 | int issue_flush = 0; | 2569 | int issue_flush = 0; |
@@ -2602,7 +2605,7 @@ static int nes_cm_disconn_true(struct nes_qp *nesqp) | |||
2602 | (last_ae == NES_AEQE_AEID_LLP_CONNECTION_RESET))) { | 2605 | (last_ae == NES_AEQE_AEID_LLP_CONNECTION_RESET))) { |
2603 | issue_disconn = 1; | 2606 | issue_disconn = 1; |
2604 | if (last_ae == NES_AEQE_AEID_LLP_CONNECTION_RESET) | 2607 | if (last_ae == NES_AEQE_AEID_LLP_CONNECTION_RESET) |
2605 | disconn_status = IW_CM_EVENT_STATUS_RESET; | 2608 | disconn_status = -ECONNRESET; |
2606 | } | 2609 | } |
2607 | 2610 | ||
2608 | if (((original_hw_tcp_state == NES_AEQE_TCP_STATE_CLOSED) || | 2611 | if (((original_hw_tcp_state == NES_AEQE_TCP_STATE_CLOSED) || |
@@ -2663,7 +2666,7 @@ static int nes_cm_disconn_true(struct nes_qp *nesqp) | |||
2663 | cm_id->provider_data = nesqp; | 2666 | cm_id->provider_data = nesqp; |
2664 | /* Send up the close complete event */ | 2667 | /* Send up the close complete event */ |
2665 | cm_event.event = IW_CM_EVENT_CLOSE; | 2668 | cm_event.event = IW_CM_EVENT_CLOSE; |
2666 | cm_event.status = IW_CM_EVENT_STATUS_OK; | 2669 | cm_event.status = 0; |
2667 | cm_event.provider_data = cm_id->provider_data; | 2670 | cm_event.provider_data = cm_id->provider_data; |
2668 | cm_event.local_addr = cm_id->local_addr; | 2671 | cm_event.local_addr = cm_id->local_addr; |
2669 | cm_event.remote_addr = cm_id->remote_addr; | 2672 | cm_event.remote_addr = cm_id->remote_addr; |
@@ -2701,7 +2704,7 @@ static int nes_disconnect(struct nes_qp *nesqp, int abrupt) | |||
2701 | nesibdev = nesvnic->nesibdev; | 2704 | nesibdev = nesvnic->nesibdev; |
2702 | 2705 | ||
2703 | nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n", | 2706 | nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n", |
2704 | atomic_read(&nesvnic->netdev->refcnt)); | 2707 | netdev_refcnt_read(nesvnic->netdev)); |
2705 | 2708 | ||
2706 | if (nesqp->active_conn) { | 2709 | if (nesqp->active_conn) { |
2707 | 2710 | ||
@@ -2791,7 +2794,7 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
2791 | atomic_inc(&cm_accepts); | 2794 | atomic_inc(&cm_accepts); |
2792 | 2795 | ||
2793 | nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n", | 2796 | nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n", |
2794 | atomic_read(&nesvnic->netdev->refcnt)); | 2797 | netdev_refcnt_read(nesvnic->netdev)); |
2795 | 2798 | ||
2796 | /* allocate the ietf frame and space for private data */ | 2799 | /* allocate the ietf frame and space for private data */ |
2797 | nesqp->ietf_frame = pci_alloc_consistent(nesdev->pcidev, | 2800 | nesqp->ietf_frame = pci_alloc_consistent(nesdev->pcidev, |
@@ -2963,7 +2966,7 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
2963 | nes_add_ref(&nesqp->ibqp); | 2966 | nes_add_ref(&nesqp->ibqp); |
2964 | 2967 | ||
2965 | cm_event.event = IW_CM_EVENT_ESTABLISHED; | 2968 | cm_event.event = IW_CM_EVENT_ESTABLISHED; |
2966 | cm_event.status = IW_CM_EVENT_STATUS_ACCEPTED; | 2969 | cm_event.status = 0; |
2967 | cm_event.provider_data = (void *)nesqp; | 2970 | cm_event.provider_data = (void *)nesqp; |
2968 | cm_event.local_addr = cm_id->local_addr; | 2971 | cm_event.local_addr = cm_id->local_addr; |
2969 | cm_event.remote_addr = cm_id->remote_addr; | 2972 | cm_event.remote_addr = cm_id->remote_addr; |
@@ -3374,7 +3377,7 @@ static void cm_event_connected(struct nes_cm_event *event) | |||
3374 | 3377 | ||
3375 | /* notify OF layer we successfully created the requested connection */ | 3378 | /* notify OF layer we successfully created the requested connection */ |
3376 | cm_event.event = IW_CM_EVENT_CONNECT_REPLY; | 3379 | cm_event.event = IW_CM_EVENT_CONNECT_REPLY; |
3377 | cm_event.status = IW_CM_EVENT_STATUS_ACCEPTED; | 3380 | cm_event.status = 0; |
3378 | cm_event.provider_data = cm_id->provider_data; | 3381 | cm_event.provider_data = cm_id->provider_data; |
3379 | cm_event.local_addr.sin_family = AF_INET; | 3382 | cm_event.local_addr.sin_family = AF_INET; |
3380 | cm_event.local_addr.sin_port = cm_id->local_addr.sin_port; | 3383 | cm_event.local_addr.sin_port = cm_id->local_addr.sin_port; |
@@ -3481,7 +3484,7 @@ static void cm_event_reset(struct nes_cm_event *event) | |||
3481 | nesqp->cm_id = NULL; | 3484 | nesqp->cm_id = NULL; |
3482 | /* cm_id->provider_data = NULL; */ | 3485 | /* cm_id->provider_data = NULL; */ |
3483 | cm_event.event = IW_CM_EVENT_DISCONNECT; | 3486 | cm_event.event = IW_CM_EVENT_DISCONNECT; |
3484 | cm_event.status = IW_CM_EVENT_STATUS_RESET; | 3487 | cm_event.status = -ECONNRESET; |
3485 | cm_event.provider_data = cm_id->provider_data; | 3488 | cm_event.provider_data = cm_id->provider_data; |
3486 | cm_event.local_addr = cm_id->local_addr; | 3489 | cm_event.local_addr = cm_id->local_addr; |
3487 | cm_event.remote_addr = cm_id->remote_addr; | 3490 | cm_event.remote_addr = cm_id->remote_addr; |
@@ -3492,7 +3495,7 @@ static void cm_event_reset(struct nes_cm_event *event) | |||
3492 | ret = cm_id->event_handler(cm_id, &cm_event); | 3495 | ret = cm_id->event_handler(cm_id, &cm_event); |
3493 | atomic_inc(&cm_closes); | 3496 | atomic_inc(&cm_closes); |
3494 | cm_event.event = IW_CM_EVENT_CLOSE; | 3497 | cm_event.event = IW_CM_EVENT_CLOSE; |
3495 | cm_event.status = IW_CM_EVENT_STATUS_OK; | 3498 | cm_event.status = 0; |
3496 | cm_event.provider_data = cm_id->provider_data; | 3499 | cm_event.provider_data = cm_id->provider_data; |
3497 | cm_event.local_addr = cm_id->local_addr; | 3500 | cm_event.local_addr = cm_id->local_addr; |
3498 | cm_event.remote_addr = cm_id->remote_addr; | 3501 | cm_event.remote_addr = cm_id->remote_addr; |
@@ -3531,7 +3534,7 @@ static void cm_event_mpa_req(struct nes_cm_event *event) | |||
3531 | cm_node, cm_id, jiffies); | 3534 | cm_node, cm_id, jiffies); |
3532 | 3535 | ||
3533 | cm_event.event = IW_CM_EVENT_CONNECT_REQUEST; | 3536 | cm_event.event = IW_CM_EVENT_CONNECT_REQUEST; |
3534 | cm_event.status = IW_CM_EVENT_STATUS_OK; | 3537 | cm_event.status = 0; |
3535 | cm_event.provider_data = (void *)cm_node; | 3538 | cm_event.provider_data = (void *)cm_node; |
3536 | 3539 | ||
3537 | cm_event.local_addr.sin_family = AF_INET; | 3540 | cm_event.local_addr.sin_family = AF_INET; |