diff options
23 files changed, 442 insertions, 753 deletions
diff --git a/drivers/infiniband/core/iwcm.c b/drivers/infiniband/core/iwcm.c index ff9163dc1596..e28a160cdab0 100644 --- a/drivers/infiniband/core/iwcm.c +++ b/drivers/infiniband/core/iwcm.c | |||
@@ -50,6 +50,8 @@ | |||
50 | 50 | ||
51 | #include <rdma/iw_cm.h> | 51 | #include <rdma/iw_cm.h> |
52 | #include <rdma/ib_addr.h> | 52 | #include <rdma/ib_addr.h> |
53 | #include <rdma/iw_portmap.h> | ||
54 | #include <rdma/rdma_netlink.h> | ||
53 | 55 | ||
54 | #include "iwcm.h" | 56 | #include "iwcm.h" |
55 | 57 | ||
@@ -57,6 +59,16 @@ MODULE_AUTHOR("Tom Tucker"); | |||
57 | MODULE_DESCRIPTION("iWARP CM"); | 59 | MODULE_DESCRIPTION("iWARP CM"); |
58 | MODULE_LICENSE("Dual BSD/GPL"); | 60 | MODULE_LICENSE("Dual BSD/GPL"); |
59 | 61 | ||
62 | static struct ibnl_client_cbs iwcm_nl_cb_table[] = { | ||
63 | [RDMA_NL_IWPM_REG_PID] = {.dump = iwpm_register_pid_cb}, | ||
64 | [RDMA_NL_IWPM_ADD_MAPPING] = {.dump = iwpm_add_mapping_cb}, | ||
65 | [RDMA_NL_IWPM_QUERY_MAPPING] = {.dump = iwpm_add_and_query_mapping_cb}, | ||
66 | [RDMA_NL_IWPM_REMOTE_INFO] = {.dump = iwpm_remote_info_cb}, | ||
67 | [RDMA_NL_IWPM_HANDLE_ERR] = {.dump = iwpm_mapping_error_cb}, | ||
68 | [RDMA_NL_IWPM_MAPINFO] = {.dump = iwpm_mapping_info_cb}, | ||
69 | [RDMA_NL_IWPM_MAPINFO_NUM] = {.dump = iwpm_ack_mapping_info_cb} | ||
70 | }; | ||
71 | |||
60 | static struct workqueue_struct *iwcm_wq; | 72 | static struct workqueue_struct *iwcm_wq; |
61 | struct iwcm_work { | 73 | struct iwcm_work { |
62 | struct work_struct work; | 74 | struct work_struct work; |
@@ -402,6 +414,11 @@ static void destroy_cm_id(struct iw_cm_id *cm_id) | |||
402 | } | 414 | } |
403 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); | 415 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); |
404 | 416 | ||
417 | if (cm_id->mapped) { | ||
418 | iwpm_remove_mapinfo(&cm_id->local_addr, &cm_id->m_local_addr); | ||
419 | iwpm_remove_mapping(&cm_id->local_addr, RDMA_NL_IWCM); | ||
420 | } | ||
421 | |||
405 | (void)iwcm_deref_id(cm_id_priv); | 422 | (void)iwcm_deref_id(cm_id_priv); |
406 | } | 423 | } |
407 | 424 | ||
@@ -426,6 +443,97 @@ void iw_destroy_cm_id(struct iw_cm_id *cm_id) | |||
426 | } | 443 | } |
427 | EXPORT_SYMBOL(iw_destroy_cm_id); | 444 | EXPORT_SYMBOL(iw_destroy_cm_id); |
428 | 445 | ||
446 | /** | ||
447 | * iw_cm_check_wildcard - If IP address is 0 then use original | ||
448 | * @pm_addr: sockaddr containing the ip to check for wildcard | ||
449 | * @cm_addr: sockaddr containing the actual IP address | ||
450 | * @cm_outaddr: sockaddr to set IP addr which leaving port | ||
451 | * | ||
452 | * Checks the pm_addr for wildcard and then sets cm_outaddr's | ||
453 | * IP to the actual (cm_addr). | ||
454 | */ | ||
455 | static void iw_cm_check_wildcard(struct sockaddr_storage *pm_addr, | ||
456 | struct sockaddr_storage *cm_addr, | ||
457 | struct sockaddr_storage *cm_outaddr) | ||
458 | { | ||
459 | if (pm_addr->ss_family == AF_INET) { | ||
460 | struct sockaddr_in *pm4_addr = (struct sockaddr_in *)pm_addr; | ||
461 | |||
462 | if (pm4_addr->sin_addr.s_addr == INADDR_ANY) { | ||
463 | struct sockaddr_in *cm4_addr = | ||
464 | (struct sockaddr_in *)cm_addr; | ||
465 | struct sockaddr_in *cm4_outaddr = | ||
466 | (struct sockaddr_in *)cm_outaddr; | ||
467 | |||
468 | cm4_outaddr->sin_addr = cm4_addr->sin_addr; | ||
469 | } | ||
470 | } else { | ||
471 | struct sockaddr_in6 *pm6_addr = (struct sockaddr_in6 *)pm_addr; | ||
472 | |||
473 | if (ipv6_addr_type(&pm6_addr->sin6_addr) == IPV6_ADDR_ANY) { | ||
474 | struct sockaddr_in6 *cm6_addr = | ||
475 | (struct sockaddr_in6 *)cm_addr; | ||
476 | struct sockaddr_in6 *cm6_outaddr = | ||
477 | (struct sockaddr_in6 *)cm_outaddr; | ||
478 | |||
479 | cm6_outaddr->sin6_addr = cm6_addr->sin6_addr; | ||
480 | } | ||
481 | } | ||
482 | } | ||
483 | |||
484 | /** | ||
485 | * iw_cm_map - Use portmapper to map the ports | ||
486 | * @cm_id: connection manager pointer | ||
487 | * @active: Indicates the active side when true | ||
488 | * returns nonzero for error only if iwpm_create_mapinfo() fails | ||
489 | * | ||
490 | * Tries to add a mapping for a port using the Portmapper. If | ||
491 | * successful in mapping the IP/Port it will check the remote | ||
492 | * mapped IP address for a wildcard IP address and replace the | ||
493 | * zero IP address with the remote_addr. | ||
494 | */ | ||
495 | static int iw_cm_map(struct iw_cm_id *cm_id, bool active) | ||
496 | { | ||
497 | struct iwpm_dev_data pm_reg_msg; | ||
498 | struct iwpm_sa_data pm_msg; | ||
499 | int status; | ||
500 | |||
501 | cm_id->m_local_addr = cm_id->local_addr; | ||
502 | cm_id->m_remote_addr = cm_id->remote_addr; | ||
503 | |||
504 | memcpy(pm_reg_msg.dev_name, cm_id->device->name, | ||
505 | sizeof(pm_reg_msg.dev_name)); | ||
506 | memcpy(pm_reg_msg.if_name, cm_id->device->iwcm->ifname, | ||
507 | sizeof(pm_reg_msg.if_name)); | ||
508 | |||
509 | if (iwpm_register_pid(&pm_reg_msg, RDMA_NL_IWCM) || | ||
510 | !iwpm_valid_pid()) | ||
511 | return 0; | ||
512 | |||
513 | cm_id->mapped = true; | ||
514 | pm_msg.loc_addr = cm_id->local_addr; | ||
515 | pm_msg.rem_addr = cm_id->remote_addr; | ||
516 | if (active) | ||
517 | status = iwpm_add_and_query_mapping(&pm_msg, | ||
518 | RDMA_NL_IWCM); | ||
519 | else | ||
520 | status = iwpm_add_mapping(&pm_msg, RDMA_NL_IWCM); | ||
521 | |||
522 | if (!status) { | ||
523 | cm_id->m_local_addr = pm_msg.mapped_loc_addr; | ||
524 | if (active) { | ||
525 | cm_id->m_remote_addr = pm_msg.mapped_rem_addr; | ||
526 | iw_cm_check_wildcard(&pm_msg.mapped_rem_addr, | ||
527 | &cm_id->remote_addr, | ||
528 | &cm_id->m_remote_addr); | ||
529 | } | ||
530 | } | ||
531 | |||
532 | return iwpm_create_mapinfo(&cm_id->local_addr, | ||
533 | &cm_id->m_local_addr, | ||
534 | RDMA_NL_IWCM); | ||
535 | } | ||
536 | |||
429 | /* | 537 | /* |
430 | * CM_ID <-- LISTEN | 538 | * CM_ID <-- LISTEN |
431 | * | 539 | * |
@@ -452,7 +560,9 @@ int iw_cm_listen(struct iw_cm_id *cm_id, int backlog) | |||
452 | case IW_CM_STATE_IDLE: | 560 | case IW_CM_STATE_IDLE: |
453 | cm_id_priv->state = IW_CM_STATE_LISTEN; | 561 | cm_id_priv->state = IW_CM_STATE_LISTEN; |
454 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); | 562 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); |
455 | ret = cm_id->device->iwcm->create_listen(cm_id, backlog); | 563 | ret = iw_cm_map(cm_id, false); |
564 | if (!ret) | ||
565 | ret = cm_id->device->iwcm->create_listen(cm_id, backlog); | ||
456 | if (ret) | 566 | if (ret) |
457 | cm_id_priv->state = IW_CM_STATE_IDLE; | 567 | cm_id_priv->state = IW_CM_STATE_IDLE; |
458 | spin_lock_irqsave(&cm_id_priv->lock, flags); | 568 | spin_lock_irqsave(&cm_id_priv->lock, flags); |
@@ -582,39 +692,37 @@ int iw_cm_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *iw_param) | |||
582 | spin_lock_irqsave(&cm_id_priv->lock, flags); | 692 | spin_lock_irqsave(&cm_id_priv->lock, flags); |
583 | 693 | ||
584 | if (cm_id_priv->state != IW_CM_STATE_IDLE) { | 694 | if (cm_id_priv->state != IW_CM_STATE_IDLE) { |
585 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); | 695 | ret = -EINVAL; |
586 | clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags); | 696 | goto err; |
587 | wake_up_all(&cm_id_priv->connect_wait); | ||
588 | return -EINVAL; | ||
589 | } | 697 | } |
590 | 698 | ||
591 | /* Get the ib_qp given the QPN */ | 699 | /* Get the ib_qp given the QPN */ |
592 | qp = cm_id->device->iwcm->get_qp(cm_id->device, iw_param->qpn); | 700 | qp = cm_id->device->iwcm->get_qp(cm_id->device, iw_param->qpn); |
593 | if (!qp) { | 701 | if (!qp) { |
594 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); | 702 | ret = -EINVAL; |
595 | clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags); | 703 | goto err; |
596 | wake_up_all(&cm_id_priv->connect_wait); | ||
597 | return -EINVAL; | ||
598 | } | 704 | } |
599 | cm_id->device->iwcm->add_ref(qp); | 705 | cm_id->device->iwcm->add_ref(qp); |
600 | cm_id_priv->qp = qp; | 706 | cm_id_priv->qp = qp; |
601 | cm_id_priv->state = IW_CM_STATE_CONN_SENT; | 707 | cm_id_priv->state = IW_CM_STATE_CONN_SENT; |
602 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); | 708 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); |
603 | 709 | ||
604 | ret = cm_id->device->iwcm->connect(cm_id, iw_param); | 710 | ret = iw_cm_map(cm_id, true); |
605 | if (ret) { | 711 | if (!ret) |
606 | spin_lock_irqsave(&cm_id_priv->lock, flags); | 712 | ret = cm_id->device->iwcm->connect(cm_id, iw_param); |
607 | if (cm_id_priv->qp) { | 713 | if (!ret) |
608 | cm_id->device->iwcm->rem_ref(qp); | 714 | return 0; /* success */ |
609 | cm_id_priv->qp = NULL; | ||
610 | } | ||
611 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); | ||
612 | BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_SENT); | ||
613 | cm_id_priv->state = IW_CM_STATE_IDLE; | ||
614 | clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags); | ||
615 | wake_up_all(&cm_id_priv->connect_wait); | ||
616 | } | ||
617 | 715 | ||
716 | spin_lock_irqsave(&cm_id_priv->lock, flags); | ||
717 | if (cm_id_priv->qp) { | ||
718 | cm_id->device->iwcm->rem_ref(qp); | ||
719 | cm_id_priv->qp = NULL; | ||
720 | } | ||
721 | cm_id_priv->state = IW_CM_STATE_IDLE; | ||
722 | err: | ||
723 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); | ||
724 | clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags); | ||
725 | wake_up_all(&cm_id_priv->connect_wait); | ||
618 | return ret; | 726 | return ret; |
619 | } | 727 | } |
620 | EXPORT_SYMBOL(iw_cm_connect); | 728 | EXPORT_SYMBOL(iw_cm_connect); |
@@ -656,8 +764,23 @@ static void cm_conn_req_handler(struct iwcm_id_private *listen_id_priv, | |||
656 | goto out; | 764 | goto out; |
657 | 765 | ||
658 | cm_id->provider_data = iw_event->provider_data; | 766 | cm_id->provider_data = iw_event->provider_data; |
659 | cm_id->local_addr = iw_event->local_addr; | 767 | cm_id->m_local_addr = iw_event->local_addr; |
660 | cm_id->remote_addr = iw_event->remote_addr; | 768 | cm_id->m_remote_addr = iw_event->remote_addr; |
769 | cm_id->local_addr = listen_id_priv->id.local_addr; | ||
770 | |||
771 | ret = iwpm_get_remote_info(&listen_id_priv->id.m_local_addr, | ||
772 | &iw_event->remote_addr, | ||
773 | &cm_id->remote_addr, | ||
774 | RDMA_NL_IWCM); | ||
775 | if (ret) { | ||
776 | cm_id->remote_addr = iw_event->remote_addr; | ||
777 | } else { | ||
778 | iw_cm_check_wildcard(&listen_id_priv->id.m_local_addr, | ||
779 | &iw_event->local_addr, | ||
780 | &cm_id->local_addr); | ||
781 | iw_event->local_addr = cm_id->local_addr; | ||
782 | iw_event->remote_addr = cm_id->remote_addr; | ||
783 | } | ||
661 | 784 | ||
662 | cm_id_priv = container_of(cm_id, struct iwcm_id_private, id); | 785 | cm_id_priv = container_of(cm_id, struct iwcm_id_private, id); |
663 | cm_id_priv->state = IW_CM_STATE_CONN_RECV; | 786 | cm_id_priv->state = IW_CM_STATE_CONN_RECV; |
@@ -753,8 +876,10 @@ static int cm_conn_rep_handler(struct iwcm_id_private *cm_id_priv, | |||
753 | clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags); | 876 | clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags); |
754 | BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_SENT); | 877 | BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_SENT); |
755 | if (iw_event->status == 0) { | 878 | if (iw_event->status == 0) { |
756 | cm_id_priv->id.local_addr = iw_event->local_addr; | 879 | cm_id_priv->id.m_local_addr = iw_event->local_addr; |
757 | cm_id_priv->id.remote_addr = iw_event->remote_addr; | 880 | cm_id_priv->id.m_remote_addr = iw_event->remote_addr; |
881 | iw_event->local_addr = cm_id_priv->id.local_addr; | ||
882 | iw_event->remote_addr = cm_id_priv->id.remote_addr; | ||
758 | cm_id_priv->state = IW_CM_STATE_ESTABLISHED; | 883 | cm_id_priv->state = IW_CM_STATE_ESTABLISHED; |
759 | } else { | 884 | } else { |
760 | /* REJECTED or RESET */ | 885 | /* REJECTED or RESET */ |
@@ -1044,6 +1169,17 @@ EXPORT_SYMBOL(iw_cm_init_qp_attr); | |||
1044 | 1169 | ||
1045 | static int __init iw_cm_init(void) | 1170 | static int __init iw_cm_init(void) |
1046 | { | 1171 | { |
1172 | int ret; | ||
1173 | |||
1174 | ret = iwpm_init(RDMA_NL_IWCM); | ||
1175 | if (ret) | ||
1176 | pr_err("iw_cm: couldn't init iwpm\n"); | ||
1177 | |||
1178 | ret = ibnl_add_client(RDMA_NL_IWCM, RDMA_NL_IWPM_NUM_OPS, | ||
1179 | iwcm_nl_cb_table); | ||
1180 | if (ret) | ||
1181 | pr_err("iw_cm: couldn't register netlink callbacks\n"); | ||
1182 | |||
1047 | iwcm_wq = create_singlethread_workqueue("iw_cm_wq"); | 1183 | iwcm_wq = create_singlethread_workqueue("iw_cm_wq"); |
1048 | if (!iwcm_wq) | 1184 | if (!iwcm_wq) |
1049 | return -ENOMEM; | 1185 | return -ENOMEM; |
@@ -1063,6 +1199,8 @@ static void __exit iw_cm_cleanup(void) | |||
1063 | { | 1199 | { |
1064 | unregister_net_sysctl_table(iwcm_ctl_table_hdr); | 1200 | unregister_net_sysctl_table(iwcm_ctl_table_hdr); |
1065 | destroy_workqueue(iwcm_wq); | 1201 | destroy_workqueue(iwcm_wq); |
1202 | ibnl_remove_client(RDMA_NL_IWCM); | ||
1203 | iwpm_exit(RDMA_NL_IWCM); | ||
1066 | } | 1204 | } |
1067 | 1205 | ||
1068 | module_init(iw_cm_init); | 1206 | module_init(iw_cm_init); |
diff --git a/drivers/infiniband/core/iwpm_msg.c b/drivers/infiniband/core/iwpm_msg.c index 22a3abee2a54..43e3fa27102b 100644 --- a/drivers/infiniband/core/iwpm_msg.c +++ b/drivers/infiniband/core/iwpm_msg.c | |||
@@ -88,8 +88,8 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client) | |||
88 | ret = ibnl_put_attr(skb, nlh, sizeof(u32), &msg_seq, IWPM_NLA_REG_PID_SEQ); | 88 | ret = ibnl_put_attr(skb, nlh, sizeof(u32), &msg_seq, IWPM_NLA_REG_PID_SEQ); |
89 | if (ret) | 89 | if (ret) |
90 | goto pid_query_error; | 90 | goto pid_query_error; |
91 | ret = ibnl_put_attr(skb, nlh, IWPM_IFNAME_SIZE, | 91 | ret = ibnl_put_attr(skb, nlh, IFNAMSIZ, |
92 | pm_msg->if_name, IWPM_NLA_REG_IF_NAME); | 92 | pm_msg->if_name, IWPM_NLA_REG_IF_NAME); |
93 | if (ret) | 93 | if (ret) |
94 | goto pid_query_error; | 94 | goto pid_query_error; |
95 | ret = ibnl_put_attr(skb, nlh, IWPM_DEVNAME_SIZE, | 95 | ret = ibnl_put_attr(skb, nlh, IWPM_DEVNAME_SIZE, |
@@ -394,7 +394,7 @@ register_pid_response_exit: | |||
394 | /* always for found nlmsg_request */ | 394 | /* always for found nlmsg_request */ |
395 | kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request); | 395 | kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request); |
396 | barrier(); | 396 | barrier(); |
397 | wake_up(&nlmsg_request->waitq); | 397 | up(&nlmsg_request->sem); |
398 | return 0; | 398 | return 0; |
399 | } | 399 | } |
400 | EXPORT_SYMBOL(iwpm_register_pid_cb); | 400 | EXPORT_SYMBOL(iwpm_register_pid_cb); |
@@ -463,7 +463,7 @@ add_mapping_response_exit: | |||
463 | /* always for found request */ | 463 | /* always for found request */ |
464 | kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request); | 464 | kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request); |
465 | barrier(); | 465 | barrier(); |
466 | wake_up(&nlmsg_request->waitq); | 466 | up(&nlmsg_request->sem); |
467 | return 0; | 467 | return 0; |
468 | } | 468 | } |
469 | EXPORT_SYMBOL(iwpm_add_mapping_cb); | 469 | EXPORT_SYMBOL(iwpm_add_mapping_cb); |
@@ -555,7 +555,7 @@ query_mapping_response_exit: | |||
555 | /* always for found request */ | 555 | /* always for found request */ |
556 | kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request); | 556 | kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request); |
557 | barrier(); | 557 | barrier(); |
558 | wake_up(&nlmsg_request->waitq); | 558 | up(&nlmsg_request->sem); |
559 | return 0; | 559 | return 0; |
560 | } | 560 | } |
561 | EXPORT_SYMBOL(iwpm_add_and_query_mapping_cb); | 561 | EXPORT_SYMBOL(iwpm_add_and_query_mapping_cb); |
@@ -749,7 +749,7 @@ int iwpm_mapping_error_cb(struct sk_buff *skb, struct netlink_callback *cb) | |||
749 | /* always for found request */ | 749 | /* always for found request */ |
750 | kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request); | 750 | kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request); |
751 | barrier(); | 751 | barrier(); |
752 | wake_up(&nlmsg_request->waitq); | 752 | up(&nlmsg_request->sem); |
753 | return 0; | 753 | return 0; |
754 | } | 754 | } |
755 | EXPORT_SYMBOL(iwpm_mapping_error_cb); | 755 | EXPORT_SYMBOL(iwpm_mapping_error_cb); |
diff --git a/drivers/infiniband/core/iwpm_util.c b/drivers/infiniband/core/iwpm_util.c index 5fb089e91353..9b2bf2fb2b00 100644 --- a/drivers/infiniband/core/iwpm_util.c +++ b/drivers/infiniband/core/iwpm_util.c | |||
@@ -254,9 +254,9 @@ void iwpm_add_remote_info(struct iwpm_remote_info *rem_info) | |||
254 | } | 254 | } |
255 | 255 | ||
256 | int iwpm_get_remote_info(struct sockaddr_storage *mapped_loc_addr, | 256 | int iwpm_get_remote_info(struct sockaddr_storage *mapped_loc_addr, |
257 | struct sockaddr_storage *mapped_rem_addr, | 257 | struct sockaddr_storage *mapped_rem_addr, |
258 | struct sockaddr_storage *remote_addr, | 258 | struct sockaddr_storage *remote_addr, |
259 | u8 nl_client) | 259 | u8 nl_client) |
260 | { | 260 | { |
261 | struct hlist_node *tmp_hlist_node; | 261 | struct hlist_node *tmp_hlist_node; |
262 | struct hlist_head *hash_bucket_head; | 262 | struct hlist_head *hash_bucket_head; |
@@ -322,6 +322,8 @@ struct iwpm_nlmsg_request *iwpm_get_nlmsg_request(__u32 nlmsg_seq, | |||
322 | nlmsg_request->nl_client = nl_client; | 322 | nlmsg_request->nl_client = nl_client; |
323 | nlmsg_request->request_done = 0; | 323 | nlmsg_request->request_done = 0; |
324 | nlmsg_request->err_code = 0; | 324 | nlmsg_request->err_code = 0; |
325 | sema_init(&nlmsg_request->sem, 1); | ||
326 | down(&nlmsg_request->sem); | ||
325 | return nlmsg_request; | 327 | return nlmsg_request; |
326 | } | 328 | } |
327 | 329 | ||
@@ -364,11 +366,9 @@ struct iwpm_nlmsg_request *iwpm_find_nlmsg_request(__u32 echo_seq) | |||
364 | int iwpm_wait_complete_req(struct iwpm_nlmsg_request *nlmsg_request) | 366 | int iwpm_wait_complete_req(struct iwpm_nlmsg_request *nlmsg_request) |
365 | { | 367 | { |
366 | int ret; | 368 | int ret; |
367 | init_waitqueue_head(&nlmsg_request->waitq); | ||
368 | 369 | ||
369 | ret = wait_event_timeout(nlmsg_request->waitq, | 370 | ret = down_timeout(&nlmsg_request->sem, IWPM_NL_TIMEOUT); |
370 | (nlmsg_request->request_done != 0), IWPM_NL_TIMEOUT); | 371 | if (ret) { |
371 | if (!ret) { | ||
372 | ret = -EINVAL; | 372 | ret = -EINVAL; |
373 | pr_info("%s: Timeout %d sec for netlink request (seq = %u)\n", | 373 | pr_info("%s: Timeout %d sec for netlink request (seq = %u)\n", |
374 | __func__, (IWPM_NL_TIMEOUT/HZ), nlmsg_request->nlmsg_seq); | 374 | __func__, (IWPM_NL_TIMEOUT/HZ), nlmsg_request->nlmsg_seq); |
diff --git a/drivers/infiniband/core/iwpm_util.h b/drivers/infiniband/core/iwpm_util.h index b7b9e194ce81..af1fc14a0d3d 100644 --- a/drivers/infiniband/core/iwpm_util.h +++ b/drivers/infiniband/core/iwpm_util.h | |||
@@ -69,7 +69,7 @@ struct iwpm_nlmsg_request { | |||
69 | u8 nl_client; | 69 | u8 nl_client; |
70 | u8 request_done; | 70 | u8 request_done; |
71 | u16 err_code; | 71 | u16 err_code; |
72 | wait_queue_head_t waitq; | 72 | struct semaphore sem; |
73 | struct kref kref; | 73 | struct kref kref; |
74 | }; | 74 | }; |
75 | 75 | ||
diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c index f504ba73e5dc..d403231a4aff 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_cm.c +++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c | |||
@@ -1877,7 +1877,7 @@ err: | |||
1877 | static int is_loopback_dst(struct iw_cm_id *cm_id) | 1877 | static int is_loopback_dst(struct iw_cm_id *cm_id) |
1878 | { | 1878 | { |
1879 | struct net_device *dev; | 1879 | struct net_device *dev; |
1880 | struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr; | 1880 | struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->m_remote_addr; |
1881 | 1881 | ||
1882 | dev = ip_dev_find(&init_net, raddr->sin_addr.s_addr); | 1882 | dev = ip_dev_find(&init_net, raddr->sin_addr.s_addr); |
1883 | if (!dev) | 1883 | if (!dev) |
@@ -1892,10 +1892,10 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
1892 | struct iwch_ep *ep; | 1892 | struct iwch_ep *ep; |
1893 | struct rtable *rt; | 1893 | struct rtable *rt; |
1894 | int err = 0; | 1894 | int err = 0; |
1895 | struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr; | 1895 | struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->m_local_addr; |
1896 | struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr; | 1896 | struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->m_remote_addr; |
1897 | 1897 | ||
1898 | if (cm_id->remote_addr.ss_family != PF_INET) { | 1898 | if (cm_id->m_remote_addr.ss_family != PF_INET) { |
1899 | err = -ENOSYS; | 1899 | err = -ENOSYS; |
1900 | goto out; | 1900 | goto out; |
1901 | } | 1901 | } |
@@ -1961,9 +1961,9 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
1961 | 1961 | ||
1962 | state_set(&ep->com, CONNECTING); | 1962 | state_set(&ep->com, CONNECTING); |
1963 | ep->tos = IPTOS_LOWDELAY; | 1963 | ep->tos = IPTOS_LOWDELAY; |
1964 | memcpy(&ep->com.local_addr, &cm_id->local_addr, | 1964 | memcpy(&ep->com.local_addr, &cm_id->m_local_addr, |
1965 | sizeof(ep->com.local_addr)); | 1965 | sizeof(ep->com.local_addr)); |
1966 | memcpy(&ep->com.remote_addr, &cm_id->remote_addr, | 1966 | memcpy(&ep->com.remote_addr, &cm_id->m_remote_addr, |
1967 | sizeof(ep->com.remote_addr)); | 1967 | sizeof(ep->com.remote_addr)); |
1968 | 1968 | ||
1969 | /* send connect request to rnic */ | 1969 | /* send connect request to rnic */ |
@@ -1992,7 +1992,7 @@ int iwch_create_listen(struct iw_cm_id *cm_id, int backlog) | |||
1992 | 1992 | ||
1993 | might_sleep(); | 1993 | might_sleep(); |
1994 | 1994 | ||
1995 | if (cm_id->local_addr.ss_family != PF_INET) { | 1995 | if (cm_id->m_local_addr.ss_family != PF_INET) { |
1996 | err = -ENOSYS; | 1996 | err = -ENOSYS; |
1997 | goto fail1; | 1997 | goto fail1; |
1998 | } | 1998 | } |
@@ -2008,7 +2008,7 @@ int iwch_create_listen(struct iw_cm_id *cm_id, int backlog) | |||
2008 | cm_id->add_ref(cm_id); | 2008 | cm_id->add_ref(cm_id); |
2009 | ep->com.cm_id = cm_id; | 2009 | ep->com.cm_id = cm_id; |
2010 | ep->backlog = backlog; | 2010 | ep->backlog = backlog; |
2011 | memcpy(&ep->com.local_addr, &cm_id->local_addr, | 2011 | memcpy(&ep->com.local_addr, &cm_id->m_local_addr, |
2012 | sizeof(ep->com.local_addr)); | 2012 | sizeof(ep->com.local_addr)); |
2013 | 2013 | ||
2014 | /* | 2014 | /* |
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c index cd2ff5f9518a..651711370d55 100644 --- a/drivers/infiniband/hw/cxgb4/cm.c +++ b/drivers/infiniband/hw/cxgb4/cm.c | |||
@@ -302,7 +302,7 @@ void _c4iw_free_ep(struct kref *kref) | |||
302 | if (ep->com.remote_addr.ss_family == AF_INET6) { | 302 | if (ep->com.remote_addr.ss_family == AF_INET6) { |
303 | struct sockaddr_in6 *sin6 = | 303 | struct sockaddr_in6 *sin6 = |
304 | (struct sockaddr_in6 *) | 304 | (struct sockaddr_in6 *) |
305 | &ep->com.mapped_local_addr; | 305 | &ep->com.local_addr; |
306 | 306 | ||
307 | cxgb4_clip_release( | 307 | cxgb4_clip_release( |
308 | ep->com.dev->rdev.lldi.ports[0], | 308 | ep->com.dev->rdev.lldi.ports[0], |
@@ -314,12 +314,6 @@ void _c4iw_free_ep(struct kref *kref) | |||
314 | dst_release(ep->dst); | 314 | dst_release(ep->dst); |
315 | cxgb4_l2t_release(ep->l2t); | 315 | cxgb4_l2t_release(ep->l2t); |
316 | } | 316 | } |
317 | if (test_bit(RELEASE_MAPINFO, &ep->com.flags)) { | ||
318 | print_addr(&ep->com, __func__, "remove_mapinfo/mapping"); | ||
319 | iwpm_remove_mapinfo(&ep->com.local_addr, | ||
320 | &ep->com.mapped_local_addr); | ||
321 | iwpm_remove_mapping(&ep->com.local_addr, RDMA_NL_C4IW); | ||
322 | } | ||
323 | kfree(ep); | 317 | kfree(ep); |
324 | } | 318 | } |
325 | 319 | ||
@@ -455,7 +449,7 @@ static void act_open_req_arp_failure(void *handle, struct sk_buff *skb) | |||
455 | state_set(&ep->com, DEAD); | 449 | state_set(&ep->com, DEAD); |
456 | if (ep->com.remote_addr.ss_family == AF_INET6) { | 450 | if (ep->com.remote_addr.ss_family == AF_INET6) { |
457 | struct sockaddr_in6 *sin6 = | 451 | struct sockaddr_in6 *sin6 = |
458 | (struct sockaddr_in6 *)&ep->com.mapped_local_addr; | 452 | (struct sockaddr_in6 *)&ep->com.local_addr; |
459 | cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0], | 453 | cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0], |
460 | (const u32 *)&sin6->sin6_addr.s6_addr, 1); | 454 | (const u32 *)&sin6->sin6_addr.s6_addr, 1); |
461 | } | 455 | } |
@@ -485,12 +479,19 @@ static void send_flowc(struct c4iw_ep *ep, struct sk_buff *skb) | |||
485 | unsigned int flowclen = 80; | 479 | unsigned int flowclen = 80; |
486 | struct fw_flowc_wr *flowc; | 480 | struct fw_flowc_wr *flowc; |
487 | int i; | 481 | int i; |
482 | u16 vlan = ep->l2t->vlan; | ||
483 | int nparams; | ||
484 | |||
485 | if (vlan == CPL_L2T_VLAN_NONE) | ||
486 | nparams = 8; | ||
487 | else | ||
488 | nparams = 9; | ||
488 | 489 | ||
489 | skb = get_skb(skb, flowclen, GFP_KERNEL); | 490 | skb = get_skb(skb, flowclen, GFP_KERNEL); |
490 | flowc = (struct fw_flowc_wr *)__skb_put(skb, flowclen); | 491 | flowc = (struct fw_flowc_wr *)__skb_put(skb, flowclen); |
491 | 492 | ||
492 | flowc->op_to_nparams = cpu_to_be32(FW_WR_OP_V(FW_FLOWC_WR) | | 493 | flowc->op_to_nparams = cpu_to_be32(FW_WR_OP_V(FW_FLOWC_WR) | |
493 | FW_FLOWC_WR_NPARAMS_V(8)); | 494 | FW_FLOWC_WR_NPARAMS_V(nparams)); |
494 | flowc->flowid_len16 = cpu_to_be32(FW_WR_LEN16_V(DIV_ROUND_UP(flowclen, | 495 | flowc->flowid_len16 = cpu_to_be32(FW_WR_LEN16_V(DIV_ROUND_UP(flowclen, |
495 | 16)) | FW_WR_FLOWID_V(ep->hwtid)); | 496 | 16)) | FW_WR_FLOWID_V(ep->hwtid)); |
496 | 497 | ||
@@ -511,9 +512,17 @@ static void send_flowc(struct c4iw_ep *ep, struct sk_buff *skb) | |||
511 | flowc->mnemval[6].val = cpu_to_be32(ep->snd_win); | 512 | flowc->mnemval[6].val = cpu_to_be32(ep->snd_win); |
512 | flowc->mnemval[7].mnemonic = FW_FLOWC_MNEM_MSS; | 513 | flowc->mnemval[7].mnemonic = FW_FLOWC_MNEM_MSS; |
513 | flowc->mnemval[7].val = cpu_to_be32(ep->emss); | 514 | flowc->mnemval[7].val = cpu_to_be32(ep->emss); |
514 | /* Pad WR to 16 byte boundary */ | 515 | if (nparams == 9) { |
515 | flowc->mnemval[8].mnemonic = 0; | 516 | u16 pri; |
516 | flowc->mnemval[8].val = 0; | 517 | |
518 | pri = (vlan & VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT; | ||
519 | flowc->mnemval[8].mnemonic = FW_FLOWC_MNEM_SCHEDCLASS; | ||
520 | flowc->mnemval[8].val = cpu_to_be32(pri); | ||
521 | } else { | ||
522 | /* Pad WR to 16 byte boundary */ | ||
523 | flowc->mnemval[8].mnemonic = 0; | ||
524 | flowc->mnemval[8].val = 0; | ||
525 | } | ||
517 | for (i = 0; i < 9; i++) { | 526 | for (i = 0; i < 9; i++) { |
518 | flowc->mnemval[i].r4[0] = 0; | 527 | flowc->mnemval[i].r4[0] = 0; |
519 | flowc->mnemval[i].r4[1] = 0; | 528 | flowc->mnemval[i].r4[1] = 0; |
@@ -568,54 +577,6 @@ static int send_abort(struct c4iw_ep *ep, struct sk_buff *skb, gfp_t gfp) | |||
568 | return c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t); | 577 | return c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t); |
569 | } | 578 | } |
570 | 579 | ||
571 | /* | ||
572 | * c4iw_form_pm_msg - Form a port mapper message with mapping info | ||
573 | */ | ||
574 | static void c4iw_form_pm_msg(struct c4iw_ep *ep, | ||
575 | struct iwpm_sa_data *pm_msg) | ||
576 | { | ||
577 | memcpy(&pm_msg->loc_addr, &ep->com.local_addr, | ||
578 | sizeof(ep->com.local_addr)); | ||
579 | memcpy(&pm_msg->rem_addr, &ep->com.remote_addr, | ||
580 | sizeof(ep->com.remote_addr)); | ||
581 | } | ||
582 | |||
583 | /* | ||
584 | * c4iw_form_reg_msg - Form a port mapper message with dev info | ||
585 | */ | ||
586 | static void c4iw_form_reg_msg(struct c4iw_dev *dev, | ||
587 | struct iwpm_dev_data *pm_msg) | ||
588 | { | ||
589 | memcpy(pm_msg->dev_name, dev->ibdev.name, IWPM_DEVNAME_SIZE); | ||
590 | memcpy(pm_msg->if_name, dev->rdev.lldi.ports[0]->name, | ||
591 | IWPM_IFNAME_SIZE); | ||
592 | } | ||
593 | |||
594 | static void c4iw_record_pm_msg(struct c4iw_ep *ep, | ||
595 | struct iwpm_sa_data *pm_msg) | ||
596 | { | ||
597 | memcpy(&ep->com.mapped_local_addr, &pm_msg->mapped_loc_addr, | ||
598 | sizeof(ep->com.mapped_local_addr)); | ||
599 | memcpy(&ep->com.mapped_remote_addr, &pm_msg->mapped_rem_addr, | ||
600 | sizeof(ep->com.mapped_remote_addr)); | ||
601 | } | ||
602 | |||
603 | static int get_remote_addr(struct c4iw_ep *parent_ep, struct c4iw_ep *child_ep) | ||
604 | { | ||
605 | int ret; | ||
606 | |||
607 | print_addr(&parent_ep->com, __func__, "get_remote_addr parent_ep "); | ||
608 | print_addr(&child_ep->com, __func__, "get_remote_addr child_ep "); | ||
609 | |||
610 | ret = iwpm_get_remote_info(&parent_ep->com.mapped_local_addr, | ||
611 | &child_ep->com.mapped_remote_addr, | ||
612 | &child_ep->com.remote_addr, RDMA_NL_C4IW); | ||
613 | if (ret) | ||
614 | PDBG("Unable to find remote peer addr info - err %d\n", ret); | ||
615 | |||
616 | return ret; | ||
617 | } | ||
618 | |||
619 | static void best_mtu(const unsigned short *mtus, unsigned short mtu, | 580 | static void best_mtu(const unsigned short *mtus, unsigned short mtu, |
620 | unsigned int *idx, int use_ts, int ipv6) | 581 | unsigned int *idx, int use_ts, int ipv6) |
621 | { | 582 | { |
@@ -645,13 +606,13 @@ static int send_connect(struct c4iw_ep *ep) | |||
645 | int wscale; | 606 | int wscale; |
646 | int win, sizev4, sizev6, wrlen; | 607 | int win, sizev4, sizev6, wrlen; |
647 | struct sockaddr_in *la = (struct sockaddr_in *) | 608 | struct sockaddr_in *la = (struct sockaddr_in *) |
648 | &ep->com.mapped_local_addr; | 609 | &ep->com.local_addr; |
649 | struct sockaddr_in *ra = (struct sockaddr_in *) | 610 | struct sockaddr_in *ra = (struct sockaddr_in *) |
650 | &ep->com.mapped_remote_addr; | 611 | &ep->com.remote_addr; |
651 | struct sockaddr_in6 *la6 = (struct sockaddr_in6 *) | 612 | struct sockaddr_in6 *la6 = (struct sockaddr_in6 *) |
652 | &ep->com.mapped_local_addr; | 613 | &ep->com.local_addr; |
653 | struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *) | 614 | struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *) |
654 | &ep->com.mapped_remote_addr; | 615 | &ep->com.remote_addr; |
655 | int ret; | 616 | int ret; |
656 | enum chip_type adapter_type = ep->com.dev->rdev.lldi.adapter_type; | 617 | enum chip_type adapter_type = ep->com.dev->rdev.lldi.adapter_type; |
657 | u32 isn = (prandom_u32() & ~7UL) - 1; | 618 | u32 isn = (prandom_u32() & ~7UL) - 1; |
@@ -710,7 +671,7 @@ static int send_connect(struct c4iw_ep *ep) | |||
710 | L2T_IDX_V(ep->l2t->idx) | | 671 | L2T_IDX_V(ep->l2t->idx) | |
711 | TX_CHAN_V(ep->tx_chan) | | 672 | TX_CHAN_V(ep->tx_chan) | |
712 | SMAC_SEL_V(ep->smac_idx) | | 673 | SMAC_SEL_V(ep->smac_idx) | |
713 | DSCP_V(ep->tos) | | 674 | DSCP_V(ep->tos >> 2) | |
714 | ULP_MODE_V(ULP_MODE_TCPDDP) | | 675 | ULP_MODE_V(ULP_MODE_TCPDDP) | |
715 | RCV_BUFSIZ_V(win); | 676 | RCV_BUFSIZ_V(win); |
716 | opt2 = RX_CHANNEL_V(0) | | 677 | opt2 = RX_CHANNEL_V(0) | |
@@ -1829,10 +1790,10 @@ static void send_fw_act_open_req(struct c4iw_ep *ep, unsigned int atid) | |||
1829 | req->le.filter = cpu_to_be32(cxgb4_select_ntuple( | 1790 | req->le.filter = cpu_to_be32(cxgb4_select_ntuple( |
1830 | ep->com.dev->rdev.lldi.ports[0], | 1791 | ep->com.dev->rdev.lldi.ports[0], |
1831 | ep->l2t)); | 1792 | ep->l2t)); |
1832 | sin = (struct sockaddr_in *)&ep->com.mapped_local_addr; | 1793 | sin = (struct sockaddr_in *)&ep->com.local_addr; |
1833 | req->le.lport = sin->sin_port; | 1794 | req->le.lport = sin->sin_port; |
1834 | req->le.u.ipv4.lip = sin->sin_addr.s_addr; | 1795 | req->le.u.ipv4.lip = sin->sin_addr.s_addr; |
1835 | sin = (struct sockaddr_in *)&ep->com.mapped_remote_addr; | 1796 | sin = (struct sockaddr_in *)&ep->com.remote_addr; |
1836 | req->le.pport = sin->sin_port; | 1797 | req->le.pport = sin->sin_port; |
1837 | req->le.u.ipv4.pip = sin->sin_addr.s_addr; | 1798 | req->le.u.ipv4.pip = sin->sin_addr.s_addr; |
1838 | req->tcb.t_state_to_astid = | 1799 | req->tcb.t_state_to_astid = |
@@ -1864,7 +1825,7 @@ static void send_fw_act_open_req(struct c4iw_ep *ep, unsigned int atid) | |||
1864 | L2T_IDX_V(ep->l2t->idx) | | 1825 | L2T_IDX_V(ep->l2t->idx) | |
1865 | TX_CHAN_V(ep->tx_chan) | | 1826 | TX_CHAN_V(ep->tx_chan) | |
1866 | SMAC_SEL_V(ep->smac_idx) | | 1827 | SMAC_SEL_V(ep->smac_idx) | |
1867 | DSCP_V(ep->tos) | | 1828 | DSCP_V(ep->tos >> 2) | |
1868 | ULP_MODE_V(ULP_MODE_TCPDDP) | | 1829 | ULP_MODE_V(ULP_MODE_TCPDDP) | |
1869 | RCV_BUFSIZ_V(win)); | 1830 | RCV_BUFSIZ_V(win)); |
1870 | req->tcb.opt2 = (__force __be32) (PACE_V(1) | | 1831 | req->tcb.opt2 = (__force __be32) (PACE_V(1) | |
@@ -1928,7 +1889,7 @@ static void set_tcp_window(struct c4iw_ep *ep, struct port_info *pi) | |||
1928 | 1889 | ||
1929 | static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip, | 1890 | static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip, |
1930 | struct dst_entry *dst, struct c4iw_dev *cdev, | 1891 | struct dst_entry *dst, struct c4iw_dev *cdev, |
1931 | bool clear_mpa_v1, enum chip_type adapter_type) | 1892 | bool clear_mpa_v1, enum chip_type adapter_type, u8 tos) |
1932 | { | 1893 | { |
1933 | struct neighbour *n; | 1894 | struct neighbour *n; |
1934 | int err, step; | 1895 | int err, step; |
@@ -1958,7 +1919,7 @@ static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip, | |||
1958 | goto out; | 1919 | goto out; |
1959 | } | 1920 | } |
1960 | ep->l2t = cxgb4_l2t_get(cdev->rdev.lldi.l2t, | 1921 | ep->l2t = cxgb4_l2t_get(cdev->rdev.lldi.l2t, |
1961 | n, pdev, 0); | 1922 | n, pdev, rt_tos2priority(tos)); |
1962 | if (!ep->l2t) | 1923 | if (!ep->l2t) |
1963 | goto out; | 1924 | goto out; |
1964 | ep->mtu = pdev->mtu; | 1925 | ep->mtu = pdev->mtu; |
@@ -2013,13 +1974,13 @@ static int c4iw_reconnect(struct c4iw_ep *ep) | |||
2013 | { | 1974 | { |
2014 | int err = 0; | 1975 | int err = 0; |
2015 | struct sockaddr_in *laddr = (struct sockaddr_in *) | 1976 | struct sockaddr_in *laddr = (struct sockaddr_in *) |
2016 | &ep->com.cm_id->local_addr; | 1977 | &ep->com.cm_id->m_local_addr; |
2017 | struct sockaddr_in *raddr = (struct sockaddr_in *) | 1978 | struct sockaddr_in *raddr = (struct sockaddr_in *) |
2018 | &ep->com.cm_id->remote_addr; | 1979 | &ep->com.cm_id->m_remote_addr; |
2019 | struct sockaddr_in6 *laddr6 = (struct sockaddr_in6 *) | 1980 | struct sockaddr_in6 *laddr6 = (struct sockaddr_in6 *) |
2020 | &ep->com.cm_id->local_addr; | 1981 | &ep->com.cm_id->m_local_addr; |
2021 | struct sockaddr_in6 *raddr6 = (struct sockaddr_in6 *) | 1982 | struct sockaddr_in6 *raddr6 = (struct sockaddr_in6 *) |
2022 | &ep->com.cm_id->remote_addr; | 1983 | &ep->com.cm_id->m_remote_addr; |
2023 | int iptype; | 1984 | int iptype; |
2024 | __u8 *ra; | 1985 | __u8 *ra; |
2025 | 1986 | ||
@@ -2038,10 +1999,10 @@ static int c4iw_reconnect(struct c4iw_ep *ep) | |||
2038 | insert_handle(ep->com.dev, &ep->com.dev->atid_idr, ep, ep->atid); | 1999 | insert_handle(ep->com.dev, &ep->com.dev->atid_idr, ep, ep->atid); |
2039 | 2000 | ||
2040 | /* find a route */ | 2001 | /* find a route */ |
2041 | if (ep->com.cm_id->local_addr.ss_family == AF_INET) { | 2002 | if (ep->com.cm_id->m_local_addr.ss_family == AF_INET) { |
2042 | ep->dst = find_route(ep->com.dev, laddr->sin_addr.s_addr, | 2003 | ep->dst = find_route(ep->com.dev, laddr->sin_addr.s_addr, |
2043 | raddr->sin_addr.s_addr, laddr->sin_port, | 2004 | raddr->sin_addr.s_addr, laddr->sin_port, |
2044 | raddr->sin_port, 0); | 2005 | raddr->sin_port, ep->com.cm_id->tos); |
2045 | iptype = 4; | 2006 | iptype = 4; |
2046 | ra = (__u8 *)&raddr->sin_addr; | 2007 | ra = (__u8 *)&raddr->sin_addr; |
2047 | } else { | 2008 | } else { |
@@ -2058,7 +2019,8 @@ static int c4iw_reconnect(struct c4iw_ep *ep) | |||
2058 | goto fail3; | 2019 | goto fail3; |
2059 | } | 2020 | } |
2060 | err = import_ep(ep, iptype, ra, ep->dst, ep->com.dev, false, | 2021 | err = import_ep(ep, iptype, ra, ep->dst, ep->com.dev, false, |
2061 | ep->com.dev->rdev.lldi.adapter_type); | 2022 | ep->com.dev->rdev.lldi.adapter_type, |
2023 | ep->com.cm_id->tos); | ||
2062 | if (err) { | 2024 | if (err) { |
2063 | pr_err("%s - cannot alloc l2e.\n", __func__); | 2025 | pr_err("%s - cannot alloc l2e.\n", __func__); |
2064 | goto fail4; | 2026 | goto fail4; |
@@ -2069,7 +2031,7 @@ static int c4iw_reconnect(struct c4iw_ep *ep) | |||
2069 | ep->l2t->idx); | 2031 | ep->l2t->idx); |
2070 | 2032 | ||
2071 | state_set(&ep->com, CONNECTING); | 2033 | state_set(&ep->com, CONNECTING); |
2072 | ep->tos = 0; | 2034 | ep->tos = ep->com.cm_id->tos; |
2073 | 2035 | ||
2074 | /* send connect request to rnic */ | 2036 | /* send connect request to rnic */ |
2075 | err = send_connect(ep); | 2037 | err = send_connect(ep); |
@@ -2109,10 +2071,10 @@ static int act_open_rpl(struct c4iw_dev *dev, struct sk_buff *skb) | |||
2109 | struct sockaddr_in6 *ra6; | 2071 | struct sockaddr_in6 *ra6; |
2110 | 2072 | ||
2111 | ep = lookup_atid(t, atid); | 2073 | ep = lookup_atid(t, atid); |
2112 | la = (struct sockaddr_in *)&ep->com.mapped_local_addr; | 2074 | la = (struct sockaddr_in *)&ep->com.local_addr; |
2113 | ra = (struct sockaddr_in *)&ep->com.mapped_remote_addr; | 2075 | ra = (struct sockaddr_in *)&ep->com.remote_addr; |
2114 | la6 = (struct sockaddr_in6 *)&ep->com.mapped_local_addr; | 2076 | la6 = (struct sockaddr_in6 *)&ep->com.local_addr; |
2115 | ra6 = (struct sockaddr_in6 *)&ep->com.mapped_remote_addr; | 2077 | ra6 = (struct sockaddr_in6 *)&ep->com.remote_addr; |
2116 | 2078 | ||
2117 | PDBG("%s ep %p atid %u status %u errno %d\n", __func__, ep, atid, | 2079 | PDBG("%s ep %p atid %u status %u errno %d\n", __func__, ep, atid, |
2118 | status, status2errno(status)); | 2080 | status, status2errno(status)); |
@@ -2154,7 +2116,7 @@ static int act_open_rpl(struct c4iw_dev *dev, struct sk_buff *skb) | |||
2154 | if (ep->com.remote_addr.ss_family == AF_INET6) { | 2116 | if (ep->com.remote_addr.ss_family == AF_INET6) { |
2155 | struct sockaddr_in6 *sin6 = | 2117 | struct sockaddr_in6 *sin6 = |
2156 | (struct sockaddr_in6 *) | 2118 | (struct sockaddr_in6 *) |
2157 | &ep->com.mapped_local_addr; | 2119 | &ep->com.local_addr; |
2158 | cxgb4_clip_release( | 2120 | cxgb4_clip_release( |
2159 | ep->com.dev->rdev.lldi.ports[0], | 2121 | ep->com.dev->rdev.lldi.ports[0], |
2160 | (const u32 *) | 2122 | (const u32 *) |
@@ -2189,7 +2151,7 @@ static int act_open_rpl(struct c4iw_dev *dev, struct sk_buff *skb) | |||
2189 | 2151 | ||
2190 | if (ep->com.remote_addr.ss_family == AF_INET6) { | 2152 | if (ep->com.remote_addr.ss_family == AF_INET6) { |
2191 | struct sockaddr_in6 *sin6 = | 2153 | struct sockaddr_in6 *sin6 = |
2192 | (struct sockaddr_in6 *)&ep->com.mapped_local_addr; | 2154 | (struct sockaddr_in6 *)&ep->com.local_addr; |
2193 | cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0], | 2155 | cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0], |
2194 | (const u32 *)&sin6->sin6_addr.s6_addr, 1); | 2156 | (const u32 *)&sin6->sin6_addr.s6_addr, 1); |
2195 | } | 2157 | } |
@@ -2391,6 +2353,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) | |||
2391 | u16 peer_mss = ntohs(req->tcpopt.mss); | 2353 | u16 peer_mss = ntohs(req->tcpopt.mss); |
2392 | int iptype; | 2354 | int iptype; |
2393 | unsigned short hdrs; | 2355 | unsigned short hdrs; |
2356 | u8 tos = PASS_OPEN_TOS_G(ntohl(req->tos_stid)); | ||
2394 | 2357 | ||
2395 | parent_ep = lookup_stid(t, stid); | 2358 | parent_ep = lookup_stid(t, stid); |
2396 | if (!parent_ep) { | 2359 | if (!parent_ep) { |
@@ -2399,8 +2362,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) | |||
2399 | } | 2362 | } |
2400 | 2363 | ||
2401 | if (state_read(&parent_ep->com) != LISTEN) { | 2364 | if (state_read(&parent_ep->com) != LISTEN) { |
2402 | printk(KERN_ERR "%s - listening ep not in LISTEN\n", | 2365 | PDBG("%s - listening ep not in LISTEN\n", __func__); |
2403 | __func__); | ||
2404 | goto reject; | 2366 | goto reject; |
2405 | } | 2367 | } |
2406 | 2368 | ||
@@ -2415,7 +2377,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) | |||
2415 | ntohs(peer_port), peer_mss); | 2377 | ntohs(peer_port), peer_mss); |
2416 | dst = find_route(dev, *(__be32 *)local_ip, *(__be32 *)peer_ip, | 2378 | dst = find_route(dev, *(__be32 *)local_ip, *(__be32 *)peer_ip, |
2417 | local_port, peer_port, | 2379 | local_port, peer_port, |
2418 | PASS_OPEN_TOS_G(ntohl(req->tos_stid))); | 2380 | tos); |
2419 | } else { | 2381 | } else { |
2420 | PDBG("%s parent ep %p hwtid %u laddr %pI6 raddr %pI6 lport %d rport %d peer_mss %d\n" | 2382 | PDBG("%s parent ep %p hwtid %u laddr %pI6 raddr %pI6 lport %d rport %d peer_mss %d\n" |
2421 | , __func__, parent_ep, hwtid, | 2383 | , __func__, parent_ep, hwtid, |
@@ -2441,7 +2403,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) | |||
2441 | } | 2403 | } |
2442 | 2404 | ||
2443 | err = import_ep(child_ep, iptype, peer_ip, dst, dev, false, | 2405 | err = import_ep(child_ep, iptype, peer_ip, dst, dev, false, |
2444 | parent_ep->com.dev->rdev.lldi.adapter_type); | 2406 | parent_ep->com.dev->rdev.lldi.adapter_type, tos); |
2445 | if (err) { | 2407 | if (err) { |
2446 | printk(KERN_ERR MOD "%s - failed to allocate l2t entry!\n", | 2408 | printk(KERN_ERR MOD "%s - failed to allocate l2t entry!\n", |
2447 | __func__); | 2409 | __func__); |
@@ -2459,18 +2421,9 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) | |||
2459 | child_ep->com.dev = dev; | 2421 | child_ep->com.dev = dev; |
2460 | child_ep->com.cm_id = NULL; | 2422 | child_ep->com.cm_id = NULL; |
2461 | 2423 | ||
2462 | /* | ||
2463 | * The mapped_local and mapped_remote addresses get setup with | ||
2464 | * the actual 4-tuple. The local address will be based on the | ||
2465 | * actual local address of the connection, but on the port number | ||
2466 | * of the parent listening endpoint. The remote address is | ||
2467 | * setup based on a query to the IWPM since we don't know what it | ||
2468 | * originally was before mapping. If no mapping was done, then | ||
2469 | * mapped_remote == remote, and mapped_local == local. | ||
2470 | */ | ||
2471 | if (iptype == 4) { | 2424 | if (iptype == 4) { |
2472 | struct sockaddr_in *sin = (struct sockaddr_in *) | 2425 | struct sockaddr_in *sin = (struct sockaddr_in *) |
2473 | &child_ep->com.mapped_local_addr; | 2426 | &child_ep->com.local_addr; |
2474 | 2427 | ||
2475 | sin->sin_family = PF_INET; | 2428 | sin->sin_family = PF_INET; |
2476 | sin->sin_port = local_port; | 2429 | sin->sin_port = local_port; |
@@ -2482,12 +2435,12 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) | |||
2482 | &parent_ep->com.local_addr)->sin_port; | 2435 | &parent_ep->com.local_addr)->sin_port; |
2483 | sin->sin_addr.s_addr = *(__be32 *)local_ip; | 2436 | sin->sin_addr.s_addr = *(__be32 *)local_ip; |
2484 | 2437 | ||
2485 | sin = (struct sockaddr_in *)&child_ep->com.mapped_remote_addr; | 2438 | sin = (struct sockaddr_in *)&child_ep->com.remote_addr; |
2486 | sin->sin_family = PF_INET; | 2439 | sin->sin_family = PF_INET; |
2487 | sin->sin_port = peer_port; | 2440 | sin->sin_port = peer_port; |
2488 | sin->sin_addr.s_addr = *(__be32 *)peer_ip; | 2441 | sin->sin_addr.s_addr = *(__be32 *)peer_ip; |
2489 | } else { | 2442 | } else { |
2490 | sin6 = (struct sockaddr_in6 *)&child_ep->com.mapped_local_addr; | 2443 | sin6 = (struct sockaddr_in6 *)&child_ep->com.local_addr; |
2491 | sin6->sin6_family = PF_INET6; | 2444 | sin6->sin6_family = PF_INET6; |
2492 | sin6->sin6_port = local_port; | 2445 | sin6->sin6_port = local_port; |
2493 | memcpy(sin6->sin6_addr.s6_addr, local_ip, 16); | 2446 | memcpy(sin6->sin6_addr.s6_addr, local_ip, 16); |
@@ -2498,18 +2451,15 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) | |||
2498 | &parent_ep->com.local_addr)->sin6_port; | 2451 | &parent_ep->com.local_addr)->sin6_port; |
2499 | memcpy(sin6->sin6_addr.s6_addr, local_ip, 16); | 2452 | memcpy(sin6->sin6_addr.s6_addr, local_ip, 16); |
2500 | 2453 | ||
2501 | sin6 = (struct sockaddr_in6 *)&child_ep->com.mapped_remote_addr; | 2454 | sin6 = (struct sockaddr_in6 *)&child_ep->com.remote_addr; |
2502 | sin6->sin6_family = PF_INET6; | 2455 | sin6->sin6_family = PF_INET6; |
2503 | sin6->sin6_port = peer_port; | 2456 | sin6->sin6_port = peer_port; |
2504 | memcpy(sin6->sin6_addr.s6_addr, peer_ip, 16); | 2457 | memcpy(sin6->sin6_addr.s6_addr, peer_ip, 16); |
2505 | } | 2458 | } |
2506 | memcpy(&child_ep->com.remote_addr, &child_ep->com.mapped_remote_addr, | ||
2507 | sizeof(child_ep->com.remote_addr)); | ||
2508 | get_remote_addr(parent_ep, child_ep); | ||
2509 | 2459 | ||
2510 | c4iw_get_ep(&parent_ep->com); | 2460 | c4iw_get_ep(&parent_ep->com); |
2511 | child_ep->parent_ep = parent_ep; | 2461 | child_ep->parent_ep = parent_ep; |
2512 | child_ep->tos = PASS_OPEN_TOS_G(ntohl(req->tos_stid)); | 2462 | child_ep->tos = tos; |
2513 | child_ep->dst = dst; | 2463 | child_ep->dst = dst; |
2514 | child_ep->hwtid = hwtid; | 2464 | child_ep->hwtid = hwtid; |
2515 | 2465 | ||
@@ -2522,7 +2472,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb) | |||
2522 | accept_cr(child_ep, skb, req); | 2472 | accept_cr(child_ep, skb, req); |
2523 | set_bit(PASS_ACCEPT_REQ, &child_ep->com.history); | 2473 | set_bit(PASS_ACCEPT_REQ, &child_ep->com.history); |
2524 | if (iptype == 6) { | 2474 | if (iptype == 6) { |
2525 | sin6 = (struct sockaddr_in6 *)&child_ep->com.mapped_local_addr; | 2475 | sin6 = (struct sockaddr_in6 *)&child_ep->com.local_addr; |
2526 | cxgb4_clip_get(child_ep->com.dev->rdev.lldi.ports[0], | 2476 | cxgb4_clip_get(child_ep->com.dev->rdev.lldi.ports[0], |
2527 | (const u32 *)&sin6->sin6_addr.s6_addr, 1); | 2477 | (const u32 *)&sin6->sin6_addr.s6_addr, 1); |
2528 | } | 2478 | } |
@@ -2765,7 +2715,7 @@ out: | |||
2765 | if (ep->com.remote_addr.ss_family == AF_INET6) { | 2715 | if (ep->com.remote_addr.ss_family == AF_INET6) { |
2766 | struct sockaddr_in6 *sin6 = | 2716 | struct sockaddr_in6 *sin6 = |
2767 | (struct sockaddr_in6 *) | 2717 | (struct sockaddr_in6 *) |
2768 | &ep->com.mapped_local_addr; | 2718 | &ep->com.local_addr; |
2769 | cxgb4_clip_release( | 2719 | cxgb4_clip_release( |
2770 | ep->com.dev->rdev.lldi.ports[0], | 2720 | ep->com.dev->rdev.lldi.ports[0], |
2771 | (const u32 *)&sin6->sin6_addr.s6_addr, | 2721 | (const u32 *)&sin6->sin6_addr.s6_addr, |
@@ -3026,8 +2976,8 @@ static int pick_local_ipaddrs(struct c4iw_dev *dev, struct iw_cm_id *cm_id) | |||
3026 | { | 2976 | { |
3027 | struct in_device *ind; | 2977 | struct in_device *ind; |
3028 | int found = 0; | 2978 | int found = 0; |
3029 | struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr; | 2979 | struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->m_local_addr; |
3030 | struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr; | 2980 | struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->m_remote_addr; |
3031 | 2981 | ||
3032 | ind = in_dev_get(dev->rdev.lldi.ports[0]); | 2982 | ind = in_dev_get(dev->rdev.lldi.ports[0]); |
3033 | if (!ind) | 2983 | if (!ind) |
@@ -3072,8 +3022,8 @@ static int get_lladdr(struct net_device *dev, struct in6_addr *addr, | |||
3072 | static int pick_local_ip6addrs(struct c4iw_dev *dev, struct iw_cm_id *cm_id) | 3022 | static int pick_local_ip6addrs(struct c4iw_dev *dev, struct iw_cm_id *cm_id) |
3073 | { | 3023 | { |
3074 | struct in6_addr uninitialized_var(addr); | 3024 | struct in6_addr uninitialized_var(addr); |
3075 | struct sockaddr_in6 *la6 = (struct sockaddr_in6 *)&cm_id->local_addr; | 3025 | struct sockaddr_in6 *la6 = (struct sockaddr_in6 *)&cm_id->m_local_addr; |
3076 | struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *)&cm_id->remote_addr; | 3026 | struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *)&cm_id->m_remote_addr; |
3077 | 3027 | ||
3078 | if (!get_lladdr(dev->rdev.lldi.ports[0], &addr, IFA_F_TENTATIVE)) { | 3028 | if (!get_lladdr(dev->rdev.lldi.ports[0], &addr, IFA_F_TENTATIVE)) { |
3079 | memcpy(la6->sin6_addr.s6_addr, &addr, 16); | 3029 | memcpy(la6->sin6_addr.s6_addr, &addr, 16); |
@@ -3092,11 +3042,8 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
3092 | struct sockaddr_in *raddr; | 3042 | struct sockaddr_in *raddr; |
3093 | struct sockaddr_in6 *laddr6; | 3043 | struct sockaddr_in6 *laddr6; |
3094 | struct sockaddr_in6 *raddr6; | 3044 | struct sockaddr_in6 *raddr6; |
3095 | struct iwpm_dev_data pm_reg_msg; | ||
3096 | struct iwpm_sa_data pm_msg; | ||
3097 | __u8 *ra; | 3045 | __u8 *ra; |
3098 | int iptype; | 3046 | int iptype; |
3099 | int iwpm_err = 0; | ||
3100 | 3047 | ||
3101 | if ((conn_param->ord > cur_max_read_depth(dev)) || | 3048 | if ((conn_param->ord > cur_max_read_depth(dev)) || |
3102 | (conn_param->ird > cur_max_read_depth(dev))) { | 3049 | (conn_param->ird > cur_max_read_depth(dev))) { |
@@ -3144,47 +3091,17 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
3144 | } | 3091 | } |
3145 | insert_handle(dev, &dev->atid_idr, ep, ep->atid); | 3092 | insert_handle(dev, &dev->atid_idr, ep, ep->atid); |
3146 | 3093 | ||
3147 | memcpy(&ep->com.local_addr, &cm_id->local_addr, | 3094 | memcpy(&ep->com.local_addr, &cm_id->m_local_addr, |
3148 | sizeof(ep->com.local_addr)); | 3095 | sizeof(ep->com.local_addr)); |
3149 | memcpy(&ep->com.remote_addr, &cm_id->remote_addr, | 3096 | memcpy(&ep->com.remote_addr, &cm_id->m_remote_addr, |
3150 | sizeof(ep->com.remote_addr)); | 3097 | sizeof(ep->com.remote_addr)); |
3151 | 3098 | ||
3152 | /* No port mapper available, go with the specified peer information */ | 3099 | laddr = (struct sockaddr_in *)&ep->com.local_addr; |
3153 | memcpy(&ep->com.mapped_local_addr, &cm_id->local_addr, | 3100 | raddr = (struct sockaddr_in *)&ep->com.remote_addr; |
3154 | sizeof(ep->com.mapped_local_addr)); | 3101 | laddr6 = (struct sockaddr_in6 *)&ep->com.local_addr; |
3155 | memcpy(&ep->com.mapped_remote_addr, &cm_id->remote_addr, | 3102 | raddr6 = (struct sockaddr_in6 *) &ep->com.remote_addr; |
3156 | sizeof(ep->com.mapped_remote_addr)); | ||
3157 | |||
3158 | c4iw_form_reg_msg(dev, &pm_reg_msg); | ||
3159 | iwpm_err = iwpm_register_pid(&pm_reg_msg, RDMA_NL_C4IW); | ||
3160 | if (iwpm_err) { | ||
3161 | PDBG("%s: Port Mapper reg pid fail (err = %d).\n", | ||
3162 | __func__, iwpm_err); | ||
3163 | } | ||
3164 | if (iwpm_valid_pid() && !iwpm_err) { | ||
3165 | c4iw_form_pm_msg(ep, &pm_msg); | ||
3166 | iwpm_err = iwpm_add_and_query_mapping(&pm_msg, RDMA_NL_C4IW); | ||
3167 | if (iwpm_err) | ||
3168 | PDBG("%s: Port Mapper query fail (err = %d).\n", | ||
3169 | __func__, iwpm_err); | ||
3170 | else | ||
3171 | c4iw_record_pm_msg(ep, &pm_msg); | ||
3172 | } | ||
3173 | if (iwpm_create_mapinfo(&ep->com.local_addr, | ||
3174 | &ep->com.mapped_local_addr, RDMA_NL_C4IW)) { | ||
3175 | iwpm_remove_mapping(&ep->com.local_addr, RDMA_NL_C4IW); | ||
3176 | err = -ENOMEM; | ||
3177 | goto fail1; | ||
3178 | } | ||
3179 | print_addr(&ep->com, __func__, "add_query/create_mapinfo"); | ||
3180 | set_bit(RELEASE_MAPINFO, &ep->com.flags); | ||
3181 | |||
3182 | laddr = (struct sockaddr_in *)&ep->com.mapped_local_addr; | ||
3183 | raddr = (struct sockaddr_in *)&ep->com.mapped_remote_addr; | ||
3184 | laddr6 = (struct sockaddr_in6 *)&ep->com.mapped_local_addr; | ||
3185 | raddr6 = (struct sockaddr_in6 *) &ep->com.mapped_remote_addr; | ||
3186 | 3103 | ||
3187 | if (cm_id->remote_addr.ss_family == AF_INET) { | 3104 | if (cm_id->m_remote_addr.ss_family == AF_INET) { |
3188 | iptype = 4; | 3105 | iptype = 4; |
3189 | ra = (__u8 *)&raddr->sin_addr; | 3106 | ra = (__u8 *)&raddr->sin_addr; |
3190 | 3107 | ||
@@ -3203,7 +3120,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
3203 | ra, ntohs(raddr->sin_port)); | 3120 | ra, ntohs(raddr->sin_port)); |
3204 | ep->dst = find_route(dev, laddr->sin_addr.s_addr, | 3121 | ep->dst = find_route(dev, laddr->sin_addr.s_addr, |
3205 | raddr->sin_addr.s_addr, laddr->sin_port, | 3122 | raddr->sin_addr.s_addr, laddr->sin_port, |
3206 | raddr->sin_port, 0); | 3123 | raddr->sin_port, cm_id->tos); |
3207 | } else { | 3124 | } else { |
3208 | iptype = 6; | 3125 | iptype = 6; |
3209 | ra = (__u8 *)&raddr6->sin6_addr; | 3126 | ra = (__u8 *)&raddr6->sin6_addr; |
@@ -3234,7 +3151,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
3234 | } | 3151 | } |
3235 | 3152 | ||
3236 | err = import_ep(ep, iptype, ra, ep->dst, ep->com.dev, true, | 3153 | err = import_ep(ep, iptype, ra, ep->dst, ep->com.dev, true, |
3237 | ep->com.dev->rdev.lldi.adapter_type); | 3154 | ep->com.dev->rdev.lldi.adapter_type, cm_id->tos); |
3238 | if (err) { | 3155 | if (err) { |
3239 | printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__); | 3156 | printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__); |
3240 | goto fail3; | 3157 | goto fail3; |
@@ -3245,7 +3162,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
3245 | ep->l2t->idx); | 3162 | ep->l2t->idx); |
3246 | 3163 | ||
3247 | state_set(&ep->com, CONNECTING); | 3164 | state_set(&ep->com, CONNECTING); |
3248 | ep->tos = 0; | 3165 | ep->tos = cm_id->tos; |
3249 | 3166 | ||
3250 | /* send connect request to rnic */ | 3167 | /* send connect request to rnic */ |
3251 | err = send_connect(ep); | 3168 | err = send_connect(ep); |
@@ -3269,7 +3186,7 @@ static int create_server6(struct c4iw_dev *dev, struct c4iw_listen_ep *ep) | |||
3269 | { | 3186 | { |
3270 | int err; | 3187 | int err; |
3271 | struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) | 3188 | struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) |
3272 | &ep->com.mapped_local_addr; | 3189 | &ep->com.local_addr; |
3273 | 3190 | ||
3274 | if (ipv6_addr_type(&sin6->sin6_addr) != IPV6_ADDR_ANY) { | 3191 | if (ipv6_addr_type(&sin6->sin6_addr) != IPV6_ADDR_ANY) { |
3275 | err = cxgb4_clip_get(ep->com.dev->rdev.lldi.ports[0], | 3192 | err = cxgb4_clip_get(ep->com.dev->rdev.lldi.ports[0], |
@@ -3302,7 +3219,7 @@ static int create_server4(struct c4iw_dev *dev, struct c4iw_listen_ep *ep) | |||
3302 | { | 3219 | { |
3303 | int err; | 3220 | int err; |
3304 | struct sockaddr_in *sin = (struct sockaddr_in *) | 3221 | struct sockaddr_in *sin = (struct sockaddr_in *) |
3305 | &ep->com.mapped_local_addr; | 3222 | &ep->com.local_addr; |
3306 | 3223 | ||
3307 | if (dev->rdev.lldi.enable_fw_ofld_conn) { | 3224 | if (dev->rdev.lldi.enable_fw_ofld_conn) { |
3308 | do { | 3225 | do { |
@@ -3343,9 +3260,6 @@ int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog) | |||
3343 | int err = 0; | 3260 | int err = 0; |
3344 | struct c4iw_dev *dev = to_c4iw_dev(cm_id->device); | 3261 | struct c4iw_dev *dev = to_c4iw_dev(cm_id->device); |
3345 | struct c4iw_listen_ep *ep; | 3262 | struct c4iw_listen_ep *ep; |
3346 | struct iwpm_dev_data pm_reg_msg; | ||
3347 | struct iwpm_sa_data pm_msg; | ||
3348 | int iwpm_err = 0; | ||
3349 | 3263 | ||
3350 | might_sleep(); | 3264 | might_sleep(); |
3351 | 3265 | ||
@@ -3360,7 +3274,7 @@ int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog) | |||
3360 | ep->com.cm_id = cm_id; | 3274 | ep->com.cm_id = cm_id; |
3361 | ep->com.dev = dev; | 3275 | ep->com.dev = dev; |
3362 | ep->backlog = backlog; | 3276 | ep->backlog = backlog; |
3363 | memcpy(&ep->com.local_addr, &cm_id->local_addr, | 3277 | memcpy(&ep->com.local_addr, &cm_id->m_local_addr, |
3364 | sizeof(ep->com.local_addr)); | 3278 | sizeof(ep->com.local_addr)); |
3365 | 3279 | ||
3366 | /* | 3280 | /* |
@@ -3369,10 +3283,10 @@ int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog) | |||
3369 | if (dev->rdev.lldi.enable_fw_ofld_conn && | 3283 | if (dev->rdev.lldi.enable_fw_ofld_conn && |
3370 | ep->com.local_addr.ss_family == AF_INET) | 3284 | ep->com.local_addr.ss_family == AF_INET) |
3371 | ep->stid = cxgb4_alloc_sftid(dev->rdev.lldi.tids, | 3285 | ep->stid = cxgb4_alloc_sftid(dev->rdev.lldi.tids, |
3372 | cm_id->local_addr.ss_family, ep); | 3286 | cm_id->m_local_addr.ss_family, ep); |
3373 | else | 3287 | else |
3374 | ep->stid = cxgb4_alloc_stid(dev->rdev.lldi.tids, | 3288 | ep->stid = cxgb4_alloc_stid(dev->rdev.lldi.tids, |
3375 | cm_id->local_addr.ss_family, ep); | 3289 | cm_id->m_local_addr.ss_family, ep); |
3376 | 3290 | ||
3377 | if (ep->stid == -1) { | 3291 | if (ep->stid == -1) { |
3378 | printk(KERN_ERR MOD "%s - cannot alloc stid.\n", __func__); | 3292 | printk(KERN_ERR MOD "%s - cannot alloc stid.\n", __func__); |
@@ -3381,36 +3295,9 @@ int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog) | |||
3381 | } | 3295 | } |
3382 | insert_handle(dev, &dev->stid_idr, ep, ep->stid); | 3296 | insert_handle(dev, &dev->stid_idr, ep, ep->stid); |
3383 | 3297 | ||
3384 | /* No port mapper available, go with the specified info */ | 3298 | memcpy(&ep->com.local_addr, &cm_id->m_local_addr, |
3385 | memcpy(&ep->com.mapped_local_addr, &cm_id->local_addr, | 3299 | sizeof(ep->com.local_addr)); |
3386 | sizeof(ep->com.mapped_local_addr)); | ||
3387 | |||
3388 | c4iw_form_reg_msg(dev, &pm_reg_msg); | ||
3389 | iwpm_err = iwpm_register_pid(&pm_reg_msg, RDMA_NL_C4IW); | ||
3390 | if (iwpm_err) { | ||
3391 | PDBG("%s: Port Mapper reg pid fail (err = %d).\n", | ||
3392 | __func__, iwpm_err); | ||
3393 | } | ||
3394 | if (iwpm_valid_pid() && !iwpm_err) { | ||
3395 | memcpy(&pm_msg.loc_addr, &ep->com.local_addr, | ||
3396 | sizeof(ep->com.local_addr)); | ||
3397 | iwpm_err = iwpm_add_mapping(&pm_msg, RDMA_NL_C4IW); | ||
3398 | if (iwpm_err) | ||
3399 | PDBG("%s: Port Mapper query fail (err = %d).\n", | ||
3400 | __func__, iwpm_err); | ||
3401 | else | ||
3402 | memcpy(&ep->com.mapped_local_addr, | ||
3403 | &pm_msg.mapped_loc_addr, | ||
3404 | sizeof(ep->com.mapped_local_addr)); | ||
3405 | } | ||
3406 | if (iwpm_create_mapinfo(&ep->com.local_addr, | ||
3407 | &ep->com.mapped_local_addr, RDMA_NL_C4IW)) { | ||
3408 | err = -ENOMEM; | ||
3409 | goto fail3; | ||
3410 | } | ||
3411 | print_addr(&ep->com, __func__, "add_mapping/create_mapinfo"); | ||
3412 | 3300 | ||
3413 | set_bit(RELEASE_MAPINFO, &ep->com.flags); | ||
3414 | state_set(&ep->com, LISTEN); | 3301 | state_set(&ep->com, LISTEN); |
3415 | if (ep->com.local_addr.ss_family == AF_INET) | 3302 | if (ep->com.local_addr.ss_family == AF_INET) |
3416 | err = create_server4(dev, ep); | 3303 | err = create_server4(dev, ep); |
@@ -3421,7 +3308,6 @@ int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog) | |||
3421 | goto out; | 3308 | goto out; |
3422 | } | 3309 | } |
3423 | 3310 | ||
3424 | fail3: | ||
3425 | cxgb4_free_stid(ep->com.dev->rdev.lldi.tids, ep->stid, | 3311 | cxgb4_free_stid(ep->com.dev->rdev.lldi.tids, ep->stid, |
3426 | ep->com.local_addr.ss_family); | 3312 | ep->com.local_addr.ss_family); |
3427 | fail2: | 3313 | fail2: |
@@ -3456,7 +3342,7 @@ int c4iw_destroy_listen(struct iw_cm_id *cm_id) | |||
3456 | goto done; | 3342 | goto done; |
3457 | err = c4iw_wait_for_reply(&ep->com.dev->rdev, &ep->com.wr_wait, | 3343 | err = c4iw_wait_for_reply(&ep->com.dev->rdev, &ep->com.wr_wait, |
3458 | 0, 0, __func__); | 3344 | 0, 0, __func__); |
3459 | sin6 = (struct sockaddr_in6 *)&ep->com.mapped_local_addr; | 3345 | sin6 = (struct sockaddr_in6 *)&ep->com.local_addr; |
3460 | cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0], | 3346 | cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0], |
3461 | (const u32 *)&sin6->sin6_addr.s6_addr, 1); | 3347 | (const u32 *)&sin6->sin6_addr.s6_addr, 1); |
3462 | } | 3348 | } |
@@ -3580,7 +3466,7 @@ static void active_ofld_conn_reply(struct c4iw_dev *dev, struct sk_buff *skb, | |||
3580 | state_set(&ep->com, DEAD); | 3466 | state_set(&ep->com, DEAD); |
3581 | if (ep->com.remote_addr.ss_family == AF_INET6) { | 3467 | if (ep->com.remote_addr.ss_family == AF_INET6) { |
3582 | struct sockaddr_in6 *sin6 = | 3468 | struct sockaddr_in6 *sin6 = |
3583 | (struct sockaddr_in6 *)&ep->com.mapped_local_addr; | 3469 | (struct sockaddr_in6 *)&ep->com.local_addr; |
3584 | cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0], | 3470 | cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0], |
3585 | (const u32 *)&sin6->sin6_addr.s6_addr, 1); | 3471 | (const u32 *)&sin6->sin6_addr.s6_addr, 1); |
3586 | } | 3472 | } |
diff --git a/drivers/infiniband/hw/cxgb4/device.c b/drivers/infiniband/hw/cxgb4/device.c index 8024ea4417b8..ae2e8b23d2dd 100644 --- a/drivers/infiniband/hw/cxgb4/device.c +++ b/drivers/infiniband/hw/cxgb4/device.c | |||
@@ -87,17 +87,6 @@ struct c4iw_debugfs_data { | |||
87 | int pos; | 87 | int pos; |
88 | }; | 88 | }; |
89 | 89 | ||
90 | /* registered cxgb4 netlink callbacks */ | ||
91 | static struct ibnl_client_cbs c4iw_nl_cb_table[] = { | ||
92 | [RDMA_NL_IWPM_REG_PID] = {.dump = iwpm_register_pid_cb}, | ||
93 | [RDMA_NL_IWPM_ADD_MAPPING] = {.dump = iwpm_add_mapping_cb}, | ||
94 | [RDMA_NL_IWPM_QUERY_MAPPING] = {.dump = iwpm_add_and_query_mapping_cb}, | ||
95 | [RDMA_NL_IWPM_HANDLE_ERR] = {.dump = iwpm_mapping_error_cb}, | ||
96 | [RDMA_NL_IWPM_REMOTE_INFO] = {.dump = iwpm_remote_info_cb}, | ||
97 | [RDMA_NL_IWPM_MAPINFO] = {.dump = iwpm_mapping_info_cb}, | ||
98 | [RDMA_NL_IWPM_MAPINFO_NUM] = {.dump = iwpm_ack_mapping_info_cb} | ||
99 | }; | ||
100 | |||
101 | static int count_idrs(int id, void *p, void *data) | 90 | static int count_idrs(int id, void *p, void *data) |
102 | { | 91 | { |
103 | int *countp = data; | 92 | int *countp = data; |
@@ -242,13 +231,13 @@ static int dump_qp(int id, void *p, void *data) | |||
242 | if (qp->ep) { | 231 | if (qp->ep) { |
243 | if (qp->ep->com.local_addr.ss_family == AF_INET) { | 232 | if (qp->ep->com.local_addr.ss_family == AF_INET) { |
244 | struct sockaddr_in *lsin = (struct sockaddr_in *) | 233 | struct sockaddr_in *lsin = (struct sockaddr_in *) |
245 | &qp->ep->com.local_addr; | 234 | &qp->ep->com.cm_id->local_addr; |
246 | struct sockaddr_in *rsin = (struct sockaddr_in *) | 235 | struct sockaddr_in *rsin = (struct sockaddr_in *) |
247 | &qp->ep->com.remote_addr; | 236 | &qp->ep->com.cm_id->remote_addr; |
248 | struct sockaddr_in *mapped_lsin = (struct sockaddr_in *) | 237 | struct sockaddr_in *mapped_lsin = (struct sockaddr_in *) |
249 | &qp->ep->com.mapped_local_addr; | 238 | &qp->ep->com.cm_id->m_local_addr; |
250 | struct sockaddr_in *mapped_rsin = (struct sockaddr_in *) | 239 | struct sockaddr_in *mapped_rsin = (struct sockaddr_in *) |
251 | &qp->ep->com.mapped_remote_addr; | 240 | &qp->ep->com.cm_id->m_remote_addr; |
252 | 241 | ||
253 | cc = snprintf(qpd->buf + qpd->pos, space, | 242 | cc = snprintf(qpd->buf + qpd->pos, space, |
254 | "rc qp sq id %u rq id %u state %u " | 243 | "rc qp sq id %u rq id %u state %u " |
@@ -264,15 +253,15 @@ static int dump_qp(int id, void *p, void *data) | |||
264 | ntohs(mapped_rsin->sin_port)); | 253 | ntohs(mapped_rsin->sin_port)); |
265 | } else { | 254 | } else { |
266 | struct sockaddr_in6 *lsin6 = (struct sockaddr_in6 *) | 255 | struct sockaddr_in6 *lsin6 = (struct sockaddr_in6 *) |
267 | &qp->ep->com.local_addr; | 256 | &qp->ep->com.cm_id->local_addr; |
268 | struct sockaddr_in6 *rsin6 = (struct sockaddr_in6 *) | 257 | struct sockaddr_in6 *rsin6 = (struct sockaddr_in6 *) |
269 | &qp->ep->com.remote_addr; | 258 | &qp->ep->com.cm_id->remote_addr; |
270 | struct sockaddr_in6 *mapped_lsin6 = | 259 | struct sockaddr_in6 *mapped_lsin6 = |
271 | (struct sockaddr_in6 *) | 260 | (struct sockaddr_in6 *) |
272 | &qp->ep->com.mapped_local_addr; | 261 | &qp->ep->com.cm_id->m_local_addr; |
273 | struct sockaddr_in6 *mapped_rsin6 = | 262 | struct sockaddr_in6 *mapped_rsin6 = |
274 | (struct sockaddr_in6 *) | 263 | (struct sockaddr_in6 *) |
275 | &qp->ep->com.mapped_remote_addr; | 264 | &qp->ep->com.cm_id->m_remote_addr; |
276 | 265 | ||
277 | cc = snprintf(qpd->buf + qpd->pos, space, | 266 | cc = snprintf(qpd->buf + qpd->pos, space, |
278 | "rc qp sq id %u rq id %u state %u " | 267 | "rc qp sq id %u rq id %u state %u " |
@@ -545,13 +534,13 @@ static int dump_ep(int id, void *p, void *data) | |||
545 | 534 | ||
546 | if (ep->com.local_addr.ss_family == AF_INET) { | 535 | if (ep->com.local_addr.ss_family == AF_INET) { |
547 | struct sockaddr_in *lsin = (struct sockaddr_in *) | 536 | struct sockaddr_in *lsin = (struct sockaddr_in *) |
548 | &ep->com.local_addr; | 537 | &ep->com.cm_id->local_addr; |
549 | struct sockaddr_in *rsin = (struct sockaddr_in *) | 538 | struct sockaddr_in *rsin = (struct sockaddr_in *) |
550 | &ep->com.remote_addr; | 539 | &ep->com.cm_id->remote_addr; |
551 | struct sockaddr_in *mapped_lsin = (struct sockaddr_in *) | 540 | struct sockaddr_in *mapped_lsin = (struct sockaddr_in *) |
552 | &ep->com.mapped_local_addr; | 541 | &ep->com.cm_id->m_local_addr; |
553 | struct sockaddr_in *mapped_rsin = (struct sockaddr_in *) | 542 | struct sockaddr_in *mapped_rsin = (struct sockaddr_in *) |
554 | &ep->com.mapped_remote_addr; | 543 | &ep->com.cm_id->m_remote_addr; |
555 | 544 | ||
556 | cc = snprintf(epd->buf + epd->pos, space, | 545 | cc = snprintf(epd->buf + epd->pos, space, |
557 | "ep %p cm_id %p qp %p state %d flags 0x%lx " | 546 | "ep %p cm_id %p qp %p state %d flags 0x%lx " |
@@ -569,13 +558,13 @@ static int dump_ep(int id, void *p, void *data) | |||
569 | ntohs(mapped_rsin->sin_port)); | 558 | ntohs(mapped_rsin->sin_port)); |
570 | } else { | 559 | } else { |
571 | struct sockaddr_in6 *lsin6 = (struct sockaddr_in6 *) | 560 | struct sockaddr_in6 *lsin6 = (struct sockaddr_in6 *) |
572 | &ep->com.local_addr; | 561 | &ep->com.cm_id->local_addr; |
573 | struct sockaddr_in6 *rsin6 = (struct sockaddr_in6 *) | 562 | struct sockaddr_in6 *rsin6 = (struct sockaddr_in6 *) |
574 | &ep->com.remote_addr; | 563 | &ep->com.cm_id->remote_addr; |
575 | struct sockaddr_in6 *mapped_lsin6 = (struct sockaddr_in6 *) | 564 | struct sockaddr_in6 *mapped_lsin6 = (struct sockaddr_in6 *) |
576 | &ep->com.mapped_local_addr; | 565 | &ep->com.cm_id->m_local_addr; |
577 | struct sockaddr_in6 *mapped_rsin6 = (struct sockaddr_in6 *) | 566 | struct sockaddr_in6 *mapped_rsin6 = (struct sockaddr_in6 *) |
578 | &ep->com.mapped_remote_addr; | 567 | &ep->com.cm_id->m_remote_addr; |
579 | 568 | ||
580 | cc = snprintf(epd->buf + epd->pos, space, | 569 | cc = snprintf(epd->buf + epd->pos, space, |
581 | "ep %p cm_id %p qp %p state %d flags 0x%lx " | 570 | "ep %p cm_id %p qp %p state %d flags 0x%lx " |
@@ -610,9 +599,9 @@ static int dump_listen_ep(int id, void *p, void *data) | |||
610 | 599 | ||
611 | if (ep->com.local_addr.ss_family == AF_INET) { | 600 | if (ep->com.local_addr.ss_family == AF_INET) { |
612 | struct sockaddr_in *lsin = (struct sockaddr_in *) | 601 | struct sockaddr_in *lsin = (struct sockaddr_in *) |
613 | &ep->com.local_addr; | 602 | &ep->com.cm_id->local_addr; |
614 | struct sockaddr_in *mapped_lsin = (struct sockaddr_in *) | 603 | struct sockaddr_in *mapped_lsin = (struct sockaddr_in *) |
615 | &ep->com.mapped_local_addr; | 604 | &ep->com.cm_id->m_local_addr; |
616 | 605 | ||
617 | cc = snprintf(epd->buf + epd->pos, space, | 606 | cc = snprintf(epd->buf + epd->pos, space, |
618 | "ep %p cm_id %p state %d flags 0x%lx stid %d " | 607 | "ep %p cm_id %p state %d flags 0x%lx stid %d " |
@@ -623,9 +612,9 @@ static int dump_listen_ep(int id, void *p, void *data) | |||
623 | ntohs(mapped_lsin->sin_port)); | 612 | ntohs(mapped_lsin->sin_port)); |
624 | } else { | 613 | } else { |
625 | struct sockaddr_in6 *lsin6 = (struct sockaddr_in6 *) | 614 | struct sockaddr_in6 *lsin6 = (struct sockaddr_in6 *) |
626 | &ep->com.local_addr; | 615 | &ep->com.cm_id->local_addr; |
627 | struct sockaddr_in6 *mapped_lsin6 = (struct sockaddr_in6 *) | 616 | struct sockaddr_in6 *mapped_lsin6 = (struct sockaddr_in6 *) |
628 | &ep->com.mapped_local_addr; | 617 | &ep->com.cm_id->m_local_addr; |
629 | 618 | ||
630 | cc = snprintf(epd->buf + epd->pos, space, | 619 | cc = snprintf(epd->buf + epd->pos, space, |
631 | "ep %p cm_id %p state %d flags 0x%lx stid %d " | 620 | "ep %p cm_id %p state %d flags 0x%lx stid %d " |
@@ -801,10 +790,9 @@ static int c4iw_rdev_open(struct c4iw_rdev *rdev) | |||
801 | rdev->lldi.vr->qp.size, | 790 | rdev->lldi.vr->qp.size, |
802 | rdev->lldi.vr->cq.start, | 791 | rdev->lldi.vr->cq.start, |
803 | rdev->lldi.vr->cq.size); | 792 | rdev->lldi.vr->cq.size); |
804 | PDBG("udb len 0x%x udb base %p db_reg %p gts_reg %p " | 793 | PDBG("udb %pR db_reg %p gts_reg %p " |
805 | "qpmask 0x%x cqmask 0x%x\n", | 794 | "qpmask 0x%x cqmask 0x%x\n", |
806 | (unsigned)pci_resource_len(rdev->lldi.pdev, 2), | 795 | &rdev->lldi.pdev->resource[2], |
807 | (void *)pci_resource_start(rdev->lldi.pdev, 2), | ||
808 | rdev->lldi.db_reg, rdev->lldi.gts_reg, | 796 | rdev->lldi.db_reg, rdev->lldi.gts_reg, |
809 | rdev->qpmask, rdev->cqmask); | 797 | rdev->qpmask, rdev->cqmask); |
810 | 798 | ||
@@ -1506,20 +1494,6 @@ static int __init c4iw_init_module(void) | |||
1506 | printk(KERN_WARNING MOD | 1494 | printk(KERN_WARNING MOD |
1507 | "could not create debugfs entry, continuing\n"); | 1495 | "could not create debugfs entry, continuing\n"); |
1508 | 1496 | ||
1509 | if (ibnl_add_client(RDMA_NL_C4IW, RDMA_NL_IWPM_NUM_OPS, | ||
1510 | c4iw_nl_cb_table)) | ||
1511 | pr_err("%s[%u]: Failed to add netlink callback\n" | ||
1512 | , __func__, __LINE__); | ||
1513 | |||
1514 | err = iwpm_init(RDMA_NL_C4IW); | ||
1515 | if (err) { | ||
1516 | pr_err("port mapper initialization failed with %d\n", err); | ||
1517 | ibnl_remove_client(RDMA_NL_C4IW); | ||
1518 | c4iw_cm_term(); | ||
1519 | debugfs_remove_recursive(c4iw_debugfs_root); | ||
1520 | return err; | ||
1521 | } | ||
1522 | |||
1523 | cxgb4_register_uld(CXGB4_ULD_RDMA, &c4iw_uld_info); | 1497 | cxgb4_register_uld(CXGB4_ULD_RDMA, &c4iw_uld_info); |
1524 | 1498 | ||
1525 | return 0; | 1499 | return 0; |
@@ -1537,8 +1511,6 @@ static void __exit c4iw_exit_module(void) | |||
1537 | } | 1511 | } |
1538 | mutex_unlock(&dev_mutex); | 1512 | mutex_unlock(&dev_mutex); |
1539 | cxgb4_unregister_uld(CXGB4_ULD_RDMA); | 1513 | cxgb4_unregister_uld(CXGB4_ULD_RDMA); |
1540 | iwpm_exit(RDMA_NL_C4IW); | ||
1541 | ibnl_remove_client(RDMA_NL_C4IW); | ||
1542 | c4iw_cm_term(); | 1514 | c4iw_cm_term(); |
1543 | debugfs_remove_recursive(c4iw_debugfs_root); | 1515 | debugfs_remove_recursive(c4iw_debugfs_root); |
1544 | } | 1516 | } |
diff --git a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h index 97c0e5aa5c64..df43f871ab61 100644 --- a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h +++ b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h | |||
@@ -755,7 +755,6 @@ enum c4iw_ep_flags { | |||
755 | CLOSE_SENT = 3, | 755 | CLOSE_SENT = 3, |
756 | TIMEOUT = 4, | 756 | TIMEOUT = 4, |
757 | QP_REFERENCED = 5, | 757 | QP_REFERENCED = 5, |
758 | RELEASE_MAPINFO = 6, | ||
759 | }; | 758 | }; |
760 | 759 | ||
761 | enum c4iw_ep_history { | 760 | enum c4iw_ep_history { |
@@ -792,8 +791,6 @@ struct c4iw_ep_common { | |||
792 | struct mutex mutex; | 791 | struct mutex mutex; |
793 | struct sockaddr_storage local_addr; | 792 | struct sockaddr_storage local_addr; |
794 | struct sockaddr_storage remote_addr; | 793 | struct sockaddr_storage remote_addr; |
795 | struct sockaddr_storage mapped_local_addr; | ||
796 | struct sockaddr_storage mapped_remote_addr; | ||
797 | struct c4iw_wr_wait wr_wait; | 794 | struct c4iw_wr_wait wr_wait; |
798 | unsigned long flags; | 795 | unsigned long flags; |
799 | unsigned long history; | 796 | unsigned long history; |
@@ -845,45 +842,6 @@ struct c4iw_ep { | |||
845 | struct c4iw_ep_stats stats; | 842 | struct c4iw_ep_stats stats; |
846 | }; | 843 | }; |
847 | 844 | ||
848 | static inline void print_addr(struct c4iw_ep_common *epc, const char *func, | ||
849 | const char *msg) | ||
850 | { | ||
851 | |||
852 | #define SINA(a) (&(((struct sockaddr_in *)(a))->sin_addr.s_addr)) | ||
853 | #define SINP(a) ntohs(((struct sockaddr_in *)(a))->sin_port) | ||
854 | #define SIN6A(a) (&(((struct sockaddr_in6 *)(a))->sin6_addr)) | ||
855 | #define SIN6P(a) ntohs(((struct sockaddr_in6 *)(a))->sin6_port) | ||
856 | |||
857 | if (c4iw_debug) { | ||
858 | switch (epc->local_addr.ss_family) { | ||
859 | case AF_INET: | ||
860 | PDBG("%s %s %pI4:%u/%u <-> %pI4:%u/%u\n", | ||
861 | func, msg, SINA(&epc->local_addr), | ||
862 | SINP(&epc->local_addr), | ||
863 | SINP(&epc->mapped_local_addr), | ||
864 | SINA(&epc->remote_addr), | ||
865 | SINP(&epc->remote_addr), | ||
866 | SINP(&epc->mapped_remote_addr)); | ||
867 | break; | ||
868 | case AF_INET6: | ||
869 | PDBG("%s %s %pI6:%u/%u <-> %pI6:%u/%u\n", | ||
870 | func, msg, SIN6A(&epc->local_addr), | ||
871 | SIN6P(&epc->local_addr), | ||
872 | SIN6P(&epc->mapped_local_addr), | ||
873 | SIN6A(&epc->remote_addr), | ||
874 | SIN6P(&epc->remote_addr), | ||
875 | SIN6P(&epc->mapped_remote_addr)); | ||
876 | break; | ||
877 | default: | ||
878 | break; | ||
879 | } | ||
880 | } | ||
881 | #undef SINA | ||
882 | #undef SINP | ||
883 | #undef SIN6A | ||
884 | #undef SIN6P | ||
885 | } | ||
886 | |||
887 | static inline struct c4iw_ep *to_ep(struct iw_cm_id *cm_id) | 845 | static inline struct c4iw_ep *to_ep(struct iw_cm_id *cm_id) |
888 | { | 846 | { |
889 | return cm_id->provider_data; | 847 | return cm_id->provider_data; |
diff --git a/drivers/infiniband/hw/cxgb4/mem.c b/drivers/infiniband/hw/cxgb4/mem.c index 766d39cff06c..008be07d5604 100644 --- a/drivers/infiniband/hw/cxgb4/mem.c +++ b/drivers/infiniband/hw/cxgb4/mem.c | |||
@@ -619,12 +619,14 @@ struct ib_mr *c4iw_alloc_mr(struct ib_pd *pd, | |||
619 | int ret = 0; | 619 | int ret = 0; |
620 | int length = roundup(max_num_sg * sizeof(u64), 32); | 620 | int length = roundup(max_num_sg * sizeof(u64), 32); |
621 | 621 | ||
622 | php = to_c4iw_pd(pd); | ||
623 | rhp = php->rhp; | ||
624 | |||
622 | if (mr_type != IB_MR_TYPE_MEM_REG || | 625 | if (mr_type != IB_MR_TYPE_MEM_REG || |
623 | max_num_sg > t4_max_fr_depth(use_dsgl)) | 626 | max_num_sg > t4_max_fr_depth(&rhp->rdev.lldi.ulptx_memwrite_dsgl && |
627 | use_dsgl)) | ||
624 | return ERR_PTR(-EINVAL); | 628 | return ERR_PTR(-EINVAL); |
625 | 629 | ||
626 | php = to_c4iw_pd(pd); | ||
627 | rhp = php->rhp; | ||
628 | mhp = kzalloc(sizeof(*mhp), GFP_KERNEL); | 630 | mhp = kzalloc(sizeof(*mhp), GFP_KERNEL); |
629 | if (!mhp) { | 631 | if (!mhp) { |
630 | ret = -ENOMEM; | 632 | ret = -ENOMEM; |
diff --git a/drivers/infiniband/hw/cxgb4/provider.c b/drivers/infiniband/hw/cxgb4/provider.c index 104662d38d1e..124682dc5709 100644 --- a/drivers/infiniband/hw/cxgb4/provider.c +++ b/drivers/infiniband/hw/cxgb4/provider.c | |||
@@ -339,7 +339,8 @@ static int c4iw_query_device(struct ib_device *ibdev, struct ib_device_attr *pro | |||
339 | props->max_mr = c4iw_num_stags(&dev->rdev); | 339 | props->max_mr = c4iw_num_stags(&dev->rdev); |
340 | props->max_pd = T4_MAX_NUM_PD; | 340 | props->max_pd = T4_MAX_NUM_PD; |
341 | props->local_ca_ack_delay = 0; | 341 | props->local_ca_ack_delay = 0; |
342 | props->max_fast_reg_page_list_len = t4_max_fr_depth(use_dsgl); | 342 | props->max_fast_reg_page_list_len = |
343 | t4_max_fr_depth(dev->rdev.lldi.ulptx_memwrite_dsgl && use_dsgl); | ||
343 | 344 | ||
344 | return 0; | 345 | return 0; |
345 | } | 346 | } |
diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c index 7b1b1e840ef1..e17fb5d5e033 100644 --- a/drivers/infiniband/hw/cxgb4/qp.c +++ b/drivers/infiniband/hw/cxgb4/qp.c | |||
@@ -606,7 +606,7 @@ static int build_rdma_recv(struct c4iw_qp *qhp, union t4_recv_wr *wqe, | |||
606 | } | 606 | } |
607 | 607 | ||
608 | static int build_memreg(struct t4_sq *sq, union t4_wr *wqe, | 608 | static int build_memreg(struct t4_sq *sq, union t4_wr *wqe, |
609 | struct ib_reg_wr *wr, u8 *len16, u8 t5dev) | 609 | struct ib_reg_wr *wr, u8 *len16, bool dsgl_supported) |
610 | { | 610 | { |
611 | struct c4iw_mr *mhp = to_c4iw_mr(wr->mr); | 611 | struct c4iw_mr *mhp = to_c4iw_mr(wr->mr); |
612 | struct fw_ri_immd *imdp; | 612 | struct fw_ri_immd *imdp; |
@@ -615,7 +615,7 @@ static int build_memreg(struct t4_sq *sq, union t4_wr *wqe, | |||
615 | int pbllen = roundup(mhp->mpl_len * sizeof(u64), 32); | 615 | int pbllen = roundup(mhp->mpl_len * sizeof(u64), 32); |
616 | int rem; | 616 | int rem; |
617 | 617 | ||
618 | if (mhp->mpl_len > t4_max_fr_depth(use_dsgl)) | 618 | if (mhp->mpl_len > t4_max_fr_depth(dsgl_supported && use_dsgl)) |
619 | return -EINVAL; | 619 | return -EINVAL; |
620 | 620 | ||
621 | wqe->fr.qpbinde_to_dcacpu = 0; | 621 | wqe->fr.qpbinde_to_dcacpu = 0; |
@@ -629,7 +629,7 @@ static int build_memreg(struct t4_sq *sq, union t4_wr *wqe, | |||
629 | wqe->fr.va_lo_fbo = cpu_to_be32(mhp->ibmr.iova & | 629 | wqe->fr.va_lo_fbo = cpu_to_be32(mhp->ibmr.iova & |
630 | 0xffffffff); | 630 | 0xffffffff); |
631 | 631 | ||
632 | if (t5dev && use_dsgl && (pbllen > max_fr_immd)) { | 632 | if (dsgl_supported && use_dsgl && (pbllen > max_fr_immd)) { |
633 | struct fw_ri_dsgl *sglp; | 633 | struct fw_ri_dsgl *sglp; |
634 | 634 | ||
635 | for (i = 0; i < mhp->mpl_len; i++) | 635 | for (i = 0; i < mhp->mpl_len; i++) |
@@ -808,9 +808,7 @@ int c4iw_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
808 | fw_opcode = FW_RI_FR_NSMR_WR; | 808 | fw_opcode = FW_RI_FR_NSMR_WR; |
809 | swsqe->opcode = FW_RI_FAST_REGISTER; | 809 | swsqe->opcode = FW_RI_FAST_REGISTER; |
810 | err = build_memreg(&qhp->wq.sq, wqe, reg_wr(wr), &len16, | 810 | err = build_memreg(&qhp->wq.sq, wqe, reg_wr(wr), &len16, |
811 | is_t5( | 811 | qhp->rhp->rdev.lldi.ulptx_memwrite_dsgl); |
812 | qhp->rhp->rdev.lldi.adapter_type) ? | ||
813 | 1 : 0); | ||
814 | break; | 812 | break; |
815 | case IB_WR_LOCAL_INV: | 813 | case IB_WR_LOCAL_INV: |
816 | if (wr->send_flags & IB_SEND_FENCE) | 814 | if (wr->send_flags & IB_SEND_FENCE) |
@@ -1621,7 +1619,8 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs, | |||
1621 | unsigned int sqsize, rqsize; | 1619 | unsigned int sqsize, rqsize; |
1622 | struct c4iw_ucontext *ucontext; | 1620 | struct c4iw_ucontext *ucontext; |
1623 | int ret; | 1621 | int ret; |
1624 | struct c4iw_mm_entry *mm1, *mm2, *mm3, *mm4, *mm5 = NULL; | 1622 | struct c4iw_mm_entry *sq_key_mm, *rq_key_mm = NULL, *sq_db_key_mm; |
1623 | struct c4iw_mm_entry *rq_db_key_mm = NULL, *ma_sync_key_mm = NULL; | ||
1625 | 1624 | ||
1626 | PDBG("%s ib_pd %p\n", __func__, pd); | 1625 | PDBG("%s ib_pd %p\n", __func__, pd); |
1627 | 1626 | ||
@@ -1708,29 +1707,30 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs, | |||
1708 | goto err2; | 1707 | goto err2; |
1709 | 1708 | ||
1710 | if (udata) { | 1709 | if (udata) { |
1711 | mm1 = kmalloc(sizeof *mm1, GFP_KERNEL); | 1710 | sq_key_mm = kmalloc(sizeof(*sq_key_mm), GFP_KERNEL); |
1712 | if (!mm1) { | 1711 | if (!sq_key_mm) { |
1713 | ret = -ENOMEM; | 1712 | ret = -ENOMEM; |
1714 | goto err3; | 1713 | goto err3; |
1715 | } | 1714 | } |
1716 | mm2 = kmalloc(sizeof *mm2, GFP_KERNEL); | 1715 | rq_key_mm = kmalloc(sizeof(*rq_key_mm), GFP_KERNEL); |
1717 | if (!mm2) { | 1716 | if (!rq_key_mm) { |
1718 | ret = -ENOMEM; | 1717 | ret = -ENOMEM; |
1719 | goto err4; | 1718 | goto err4; |
1720 | } | 1719 | } |
1721 | mm3 = kmalloc(sizeof *mm3, GFP_KERNEL); | 1720 | sq_db_key_mm = kmalloc(sizeof(*sq_db_key_mm), GFP_KERNEL); |
1722 | if (!mm3) { | 1721 | if (!sq_db_key_mm) { |
1723 | ret = -ENOMEM; | 1722 | ret = -ENOMEM; |
1724 | goto err5; | 1723 | goto err5; |
1725 | } | 1724 | } |
1726 | mm4 = kmalloc(sizeof *mm4, GFP_KERNEL); | 1725 | rq_db_key_mm = kmalloc(sizeof(*rq_db_key_mm), GFP_KERNEL); |
1727 | if (!mm4) { | 1726 | if (!rq_db_key_mm) { |
1728 | ret = -ENOMEM; | 1727 | ret = -ENOMEM; |
1729 | goto err6; | 1728 | goto err6; |
1730 | } | 1729 | } |
1731 | if (t4_sq_onchip(&qhp->wq.sq)) { | 1730 | if (t4_sq_onchip(&qhp->wq.sq)) { |
1732 | mm5 = kmalloc(sizeof *mm5, GFP_KERNEL); | 1731 | ma_sync_key_mm = kmalloc(sizeof(*ma_sync_key_mm), |
1733 | if (!mm5) { | 1732 | GFP_KERNEL); |
1733 | if (!ma_sync_key_mm) { | ||
1734 | ret = -ENOMEM; | 1734 | ret = -ENOMEM; |
1735 | goto err7; | 1735 | goto err7; |
1736 | } | 1736 | } |
@@ -1745,7 +1745,7 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs, | |||
1745 | uresp.rq_size = qhp->wq.rq.size; | 1745 | uresp.rq_size = qhp->wq.rq.size; |
1746 | uresp.rq_memsize = qhp->wq.rq.memsize; | 1746 | uresp.rq_memsize = qhp->wq.rq.memsize; |
1747 | spin_lock(&ucontext->mmap_lock); | 1747 | spin_lock(&ucontext->mmap_lock); |
1748 | if (mm5) { | 1748 | if (ma_sync_key_mm) { |
1749 | uresp.ma_sync_key = ucontext->key; | 1749 | uresp.ma_sync_key = ucontext->key; |
1750 | ucontext->key += PAGE_SIZE; | 1750 | ucontext->key += PAGE_SIZE; |
1751 | } else { | 1751 | } else { |
@@ -1763,28 +1763,29 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs, | |||
1763 | ret = ib_copy_to_udata(udata, &uresp, sizeof uresp); | 1763 | ret = ib_copy_to_udata(udata, &uresp, sizeof uresp); |
1764 | if (ret) | 1764 | if (ret) |
1765 | goto err8; | 1765 | goto err8; |
1766 | mm1->key = uresp.sq_key; | 1766 | sq_key_mm->key = uresp.sq_key; |
1767 | mm1->addr = qhp->wq.sq.phys_addr; | 1767 | sq_key_mm->addr = qhp->wq.sq.phys_addr; |
1768 | mm1->len = PAGE_ALIGN(qhp->wq.sq.memsize); | 1768 | sq_key_mm->len = PAGE_ALIGN(qhp->wq.sq.memsize); |
1769 | insert_mmap(ucontext, mm1); | 1769 | insert_mmap(ucontext, sq_key_mm); |
1770 | mm2->key = uresp.rq_key; | 1770 | rq_key_mm->key = uresp.rq_key; |
1771 | mm2->addr = virt_to_phys(qhp->wq.rq.queue); | 1771 | rq_key_mm->addr = virt_to_phys(qhp->wq.rq.queue); |
1772 | mm2->len = PAGE_ALIGN(qhp->wq.rq.memsize); | 1772 | rq_key_mm->len = PAGE_ALIGN(qhp->wq.rq.memsize); |
1773 | insert_mmap(ucontext, mm2); | 1773 | insert_mmap(ucontext, rq_key_mm); |
1774 | mm3->key = uresp.sq_db_gts_key; | 1774 | sq_db_key_mm->key = uresp.sq_db_gts_key; |
1775 | mm3->addr = (__force unsigned long)qhp->wq.sq.bar2_pa; | 1775 | sq_db_key_mm->addr = (u64)(unsigned long)qhp->wq.sq.bar2_pa; |
1776 | mm3->len = PAGE_SIZE; | 1776 | sq_db_key_mm->len = PAGE_SIZE; |
1777 | insert_mmap(ucontext, mm3); | 1777 | insert_mmap(ucontext, sq_db_key_mm); |
1778 | mm4->key = uresp.rq_db_gts_key; | 1778 | rq_db_key_mm->key = uresp.rq_db_gts_key; |
1779 | mm4->addr = (__force unsigned long)qhp->wq.rq.bar2_pa; | 1779 | rq_db_key_mm->addr = (u64)(unsigned long)qhp->wq.rq.bar2_pa; |
1780 | mm4->len = PAGE_SIZE; | 1780 | rq_db_key_mm->len = PAGE_SIZE; |
1781 | insert_mmap(ucontext, mm4); | 1781 | insert_mmap(ucontext, rq_db_key_mm); |
1782 | if (mm5) { | 1782 | if (ma_sync_key_mm) { |
1783 | mm5->key = uresp.ma_sync_key; | 1783 | ma_sync_key_mm->key = uresp.ma_sync_key; |
1784 | mm5->addr = (pci_resource_start(rhp->rdev.lldi.pdev, 0) | 1784 | ma_sync_key_mm->addr = |
1785 | + PCIE_MA_SYNC_A) & PAGE_MASK; | 1785 | (pci_resource_start(rhp->rdev.lldi.pdev, 0) + |
1786 | mm5->len = PAGE_SIZE; | 1786 | PCIE_MA_SYNC_A) & PAGE_MASK; |
1787 | insert_mmap(ucontext, mm5); | 1787 | ma_sync_key_mm->len = PAGE_SIZE; |
1788 | insert_mmap(ucontext, ma_sync_key_mm); | ||
1788 | } | 1789 | } |
1789 | } | 1790 | } |
1790 | qhp->ibqp.qp_num = qhp->wq.sq.qid; | 1791 | qhp->ibqp.qp_num = qhp->wq.sq.qid; |
@@ -1797,15 +1798,15 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs, | |||
1797 | qhp->wq.rq.memsize, attrs->cap.max_recv_wr); | 1798 | qhp->wq.rq.memsize, attrs->cap.max_recv_wr); |
1798 | return &qhp->ibqp; | 1799 | return &qhp->ibqp; |
1799 | err8: | 1800 | err8: |
1800 | kfree(mm5); | 1801 | kfree(ma_sync_key_mm); |
1801 | err7: | 1802 | err7: |
1802 | kfree(mm4); | 1803 | kfree(rq_db_key_mm); |
1803 | err6: | 1804 | err6: |
1804 | kfree(mm3); | 1805 | kfree(sq_db_key_mm); |
1805 | err5: | 1806 | err5: |
1806 | kfree(mm2); | 1807 | kfree(rq_key_mm); |
1807 | err4: | 1808 | err4: |
1808 | kfree(mm1); | 1809 | kfree(sq_key_mm); |
1809 | err3: | 1810 | err3: |
1810 | remove_handle(rhp, &rhp->qpidr, qhp->wq.sq.qid); | 1811 | remove_handle(rhp, &rhp->qpidr, qhp->wq.sq.qid); |
1811 | err2: | 1812 | err2: |
diff --git a/drivers/infiniband/hw/nes/Kconfig b/drivers/infiniband/hw/nes/Kconfig index 846dc97cf260..7964eba8e7ed 100644 --- a/drivers/infiniband/hw/nes/Kconfig +++ b/drivers/infiniband/hw/nes/Kconfig | |||
@@ -2,7 +2,6 @@ config INFINIBAND_NES | |||
2 | tristate "NetEffect RNIC Driver" | 2 | tristate "NetEffect RNIC Driver" |
3 | depends on PCI && INET && INFINIBAND | 3 | depends on PCI && INET && INFINIBAND |
4 | select LIBCRC32C | 4 | select LIBCRC32C |
5 | select INET_LRO | ||
6 | ---help--- | 5 | ---help--- |
7 | This is the RDMA Network Interface Card (RNIC) driver for | 6 | This is the RDMA Network Interface Card (RNIC) driver for |
8 | NetEffect Ethernet Cluster Server Adapters. | 7 | NetEffect Ethernet Cluster Server Adapters. |
diff --git a/drivers/infiniband/hw/nes/nes.c b/drivers/infiniband/hw/nes/nes.c index 9f9d5c563a61..35cbb17bec12 100644 --- a/drivers/infiniband/hw/nes/nes.c +++ b/drivers/infiniband/hw/nes/nes.c | |||
@@ -111,17 +111,6 @@ static struct pci_device_id nes_pci_table[] = { | |||
111 | 111 | ||
112 | MODULE_DEVICE_TABLE(pci, nes_pci_table); | 112 | MODULE_DEVICE_TABLE(pci, nes_pci_table); |
113 | 113 | ||
114 | /* registered nes netlink callbacks */ | ||
115 | static struct ibnl_client_cbs nes_nl_cb_table[] = { | ||
116 | [RDMA_NL_IWPM_REG_PID] = {.dump = iwpm_register_pid_cb}, | ||
117 | [RDMA_NL_IWPM_ADD_MAPPING] = {.dump = iwpm_add_mapping_cb}, | ||
118 | [RDMA_NL_IWPM_QUERY_MAPPING] = {.dump = iwpm_add_and_query_mapping_cb}, | ||
119 | [RDMA_NL_IWPM_REMOTE_INFO] = {.dump = iwpm_remote_info_cb}, | ||
120 | [RDMA_NL_IWPM_HANDLE_ERR] = {.dump = iwpm_mapping_error_cb}, | ||
121 | [RDMA_NL_IWPM_MAPINFO] = {.dump = iwpm_mapping_info_cb}, | ||
122 | [RDMA_NL_IWPM_MAPINFO_NUM] = {.dump = iwpm_ack_mapping_info_cb} | ||
123 | }; | ||
124 | |||
125 | static int nes_inetaddr_event(struct notifier_block *, unsigned long, void *); | 114 | static int nes_inetaddr_event(struct notifier_block *, unsigned long, void *); |
126 | static int nes_net_event(struct notifier_block *, unsigned long, void *); | 115 | static int nes_net_event(struct notifier_block *, unsigned long, void *); |
127 | static int nes_notifiers_registered; | 116 | static int nes_notifiers_registered; |
@@ -682,17 +671,6 @@ static int nes_probe(struct pci_dev *pcidev, const struct pci_device_id *ent) | |||
682 | } | 671 | } |
683 | nes_notifiers_registered++; | 672 | nes_notifiers_registered++; |
684 | 673 | ||
685 | if (ibnl_add_client(RDMA_NL_NES, RDMA_NL_IWPM_NUM_OPS, nes_nl_cb_table)) | ||
686 | printk(KERN_ERR PFX "%s[%u]: Failed to add netlink callback\n", | ||
687 | __func__, __LINE__); | ||
688 | |||
689 | ret = iwpm_init(RDMA_NL_NES); | ||
690 | if (ret) { | ||
691 | printk(KERN_ERR PFX "%s: port mapper initialization failed\n", | ||
692 | pci_name(pcidev)); | ||
693 | goto bail7; | ||
694 | } | ||
695 | |||
696 | INIT_DELAYED_WORK(&nesdev->work, nes_recheck_link_status); | 674 | INIT_DELAYED_WORK(&nesdev->work, nes_recheck_link_status); |
697 | 675 | ||
698 | /* Initialize network devices */ | 676 | /* Initialize network devices */ |
@@ -731,7 +709,6 @@ static int nes_probe(struct pci_dev *pcidev, const struct pci_device_id *ent) | |||
731 | 709 | ||
732 | nes_debug(NES_DBG_INIT, "netdev_count=%d, nesadapter->netdev_count=%d\n", | 710 | nes_debug(NES_DBG_INIT, "netdev_count=%d, nesadapter->netdev_count=%d\n", |
733 | nesdev->netdev_count, nesdev->nesadapter->netdev_count); | 711 | nesdev->netdev_count, nesdev->nesadapter->netdev_count); |
734 | ibnl_remove_client(RDMA_NL_NES); | ||
735 | 712 | ||
736 | nes_notifiers_registered--; | 713 | nes_notifiers_registered--; |
737 | if (nes_notifiers_registered == 0) { | 714 | if (nes_notifiers_registered == 0) { |
@@ -795,8 +772,6 @@ static void nes_remove(struct pci_dev *pcidev) | |||
795 | nesdev->nesadapter->netdev_count--; | 772 | nesdev->nesadapter->netdev_count--; |
796 | } | 773 | } |
797 | } | 774 | } |
798 | ibnl_remove_client(RDMA_NL_NES); | ||
799 | iwpm_exit(RDMA_NL_NES); | ||
800 | 775 | ||
801 | nes_notifiers_registered--; | 776 | nes_notifiers_registered--; |
802 | if (nes_notifiers_registered == 0) { | 777 | if (nes_notifiers_registered == 0) { |
diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c index cb9f0f27308d..7f0aa23aef9d 100644 --- a/drivers/infiniband/hw/nes/nes_cm.c +++ b/drivers/infiniband/hw/nes/nes_cm.c | |||
@@ -482,11 +482,11 @@ static void form_cm_frame(struct sk_buff *skb, | |||
482 | iph->ttl = 0x40; | 482 | iph->ttl = 0x40; |
483 | iph->protocol = 0x06; /* IPPROTO_TCP */ | 483 | iph->protocol = 0x06; /* IPPROTO_TCP */ |
484 | 484 | ||
485 | iph->saddr = htonl(cm_node->mapped_loc_addr); | 485 | iph->saddr = htonl(cm_node->loc_addr); |
486 | iph->daddr = htonl(cm_node->mapped_rem_addr); | 486 | iph->daddr = htonl(cm_node->rem_addr); |
487 | 487 | ||
488 | tcph->source = htons(cm_node->mapped_loc_port); | 488 | tcph->source = htons(cm_node->loc_port); |
489 | tcph->dest = htons(cm_node->mapped_rem_port); | 489 | tcph->dest = htons(cm_node->rem_port); |
490 | tcph->seq = htonl(cm_node->tcp_cntxt.loc_seq_num); | 490 | tcph->seq = htonl(cm_node->tcp_cntxt.loc_seq_num); |
491 | 491 | ||
492 | if (flags & SET_ACK) { | 492 | if (flags & SET_ACK) { |
@@ -525,125 +525,6 @@ static void form_cm_frame(struct sk_buff *skb, | |||
525 | cm_packets_created++; | 525 | cm_packets_created++; |
526 | } | 526 | } |
527 | 527 | ||
528 | /* | ||
529 | * nes_create_sockaddr - Record ip addr and tcp port in a sockaddr struct | ||
530 | */ | ||
531 | static void nes_create_sockaddr(__be32 ip_addr, __be16 port, | ||
532 | struct sockaddr_storage *addr) | ||
533 | { | ||
534 | struct sockaddr_in *nes_sockaddr = (struct sockaddr_in *)addr; | ||
535 | nes_sockaddr->sin_family = AF_INET; | ||
536 | memcpy(&nes_sockaddr->sin_addr.s_addr, &ip_addr, sizeof(__be32)); | ||
537 | nes_sockaddr->sin_port = port; | ||
538 | } | ||
539 | |||
540 | /* | ||
541 | * nes_create_mapinfo - Create a mapinfo object in the port mapper data base | ||
542 | */ | ||
543 | static int nes_create_mapinfo(struct nes_cm_info *cm_info) | ||
544 | { | ||
545 | struct sockaddr_storage local_sockaddr; | ||
546 | struct sockaddr_storage mapped_sockaddr; | ||
547 | |||
548 | nes_create_sockaddr(htonl(cm_info->loc_addr), htons(cm_info->loc_port), | ||
549 | &local_sockaddr); | ||
550 | nes_create_sockaddr(htonl(cm_info->mapped_loc_addr), | ||
551 | htons(cm_info->mapped_loc_port), &mapped_sockaddr); | ||
552 | |||
553 | return iwpm_create_mapinfo(&local_sockaddr, | ||
554 | &mapped_sockaddr, RDMA_NL_NES); | ||
555 | } | ||
556 | |||
557 | /* | ||
558 | * nes_remove_mapinfo - Remove a mapinfo object from the port mapper data base | ||
559 | * and send a remove mapping op message to | ||
560 | * the userspace port mapper | ||
561 | */ | ||
562 | static int nes_remove_mapinfo(u32 loc_addr, u16 loc_port, | ||
563 | u32 mapped_loc_addr, u16 mapped_loc_port) | ||
564 | { | ||
565 | struct sockaddr_storage local_sockaddr; | ||
566 | struct sockaddr_storage mapped_sockaddr; | ||
567 | |||
568 | nes_create_sockaddr(htonl(loc_addr), htons(loc_port), &local_sockaddr); | ||
569 | nes_create_sockaddr(htonl(mapped_loc_addr), htons(mapped_loc_port), | ||
570 | &mapped_sockaddr); | ||
571 | |||
572 | iwpm_remove_mapinfo(&local_sockaddr, &mapped_sockaddr); | ||
573 | return iwpm_remove_mapping(&local_sockaddr, RDMA_NL_NES); | ||
574 | } | ||
575 | |||
576 | /* | ||
577 | * nes_form_pm_msg - Form a port mapper message with mapping info | ||
578 | */ | ||
579 | static void nes_form_pm_msg(struct nes_cm_info *cm_info, | ||
580 | struct iwpm_sa_data *pm_msg) | ||
581 | { | ||
582 | nes_create_sockaddr(htonl(cm_info->loc_addr), htons(cm_info->loc_port), | ||
583 | &pm_msg->loc_addr); | ||
584 | nes_create_sockaddr(htonl(cm_info->rem_addr), htons(cm_info->rem_port), | ||
585 | &pm_msg->rem_addr); | ||
586 | } | ||
587 | |||
588 | /* | ||
589 | * nes_form_reg_msg - Form a port mapper message with dev info | ||
590 | */ | ||
591 | static void nes_form_reg_msg(struct nes_vnic *nesvnic, | ||
592 | struct iwpm_dev_data *pm_msg) | ||
593 | { | ||
594 | memcpy(pm_msg->dev_name, nesvnic->nesibdev->ibdev.name, | ||
595 | IWPM_DEVNAME_SIZE); | ||
596 | memcpy(pm_msg->if_name, nesvnic->netdev->name, IWPM_IFNAME_SIZE); | ||
597 | } | ||
598 | |||
599 | static void record_sockaddr_info(struct sockaddr_storage *addr_info, | ||
600 | nes_addr_t *ip_addr, u16 *port_num) | ||
601 | { | ||
602 | struct sockaddr_in *in_addr = (struct sockaddr_in *)addr_info; | ||
603 | |||
604 | if (in_addr->sin_family == AF_INET) { | ||
605 | *ip_addr = ntohl(in_addr->sin_addr.s_addr); | ||
606 | *port_num = ntohs(in_addr->sin_port); | ||
607 | } | ||
608 | } | ||
609 | |||
610 | /* | ||
611 | * nes_record_pm_msg - Save the received mapping info | ||
612 | */ | ||
613 | static void nes_record_pm_msg(struct nes_cm_info *cm_info, | ||
614 | struct iwpm_sa_data *pm_msg) | ||
615 | { | ||
616 | record_sockaddr_info(&pm_msg->mapped_loc_addr, | ||
617 | &cm_info->mapped_loc_addr, &cm_info->mapped_loc_port); | ||
618 | |||
619 | record_sockaddr_info(&pm_msg->mapped_rem_addr, | ||
620 | &cm_info->mapped_rem_addr, &cm_info->mapped_rem_port); | ||
621 | } | ||
622 | |||
623 | /* | ||
624 | * nes_get_reminfo - Get the address info of the remote connecting peer | ||
625 | */ | ||
626 | static int nes_get_remote_addr(struct nes_cm_node *cm_node) | ||
627 | { | ||
628 | struct sockaddr_storage mapped_loc_addr, mapped_rem_addr; | ||
629 | struct sockaddr_storage remote_addr; | ||
630 | int ret; | ||
631 | |||
632 | nes_create_sockaddr(htonl(cm_node->mapped_loc_addr), | ||
633 | htons(cm_node->mapped_loc_port), &mapped_loc_addr); | ||
634 | nes_create_sockaddr(htonl(cm_node->mapped_rem_addr), | ||
635 | htons(cm_node->mapped_rem_port), &mapped_rem_addr); | ||
636 | |||
637 | ret = iwpm_get_remote_info(&mapped_loc_addr, &mapped_rem_addr, | ||
638 | &remote_addr, RDMA_NL_NES); | ||
639 | if (ret) | ||
640 | nes_debug(NES_DBG_CM, "Unable to find remote peer address info\n"); | ||
641 | else | ||
642 | record_sockaddr_info(&remote_addr, &cm_node->rem_addr, | ||
643 | &cm_node->rem_port); | ||
644 | return ret; | ||
645 | } | ||
646 | |||
647 | /** | 528 | /** |
648 | * print_core - dump a cm core | 529 | * print_core - dump a cm core |
649 | */ | 530 | */ |
@@ -1266,11 +1147,10 @@ static struct nes_cm_node *find_node(struct nes_cm_core *cm_core, | |||
1266 | loc_addr, loc_port, | 1147 | loc_addr, loc_port, |
1267 | cm_node->rem_addr, cm_node->rem_port, | 1148 | cm_node->rem_addr, cm_node->rem_port, |
1268 | rem_addr, rem_port); | 1149 | rem_addr, rem_port); |
1269 | if ((cm_node->mapped_loc_addr == loc_addr) && | 1150 | if ((cm_node->loc_addr == loc_addr) && |
1270 | (cm_node->mapped_loc_port == loc_port) && | 1151 | (cm_node->loc_port == loc_port) && |
1271 | (cm_node->mapped_rem_addr == rem_addr) && | 1152 | (cm_node->rem_addr == rem_addr) && |
1272 | (cm_node->mapped_rem_port == rem_port)) { | 1153 | (cm_node->rem_port == rem_port)) { |
1273 | |||
1274 | add_ref_cm_node(cm_node); | 1154 | add_ref_cm_node(cm_node); |
1275 | spin_unlock_irqrestore(&cm_core->ht_lock, flags); | 1155 | spin_unlock_irqrestore(&cm_core->ht_lock, flags); |
1276 | return cm_node; | 1156 | return cm_node; |
@@ -1287,8 +1167,8 @@ static struct nes_cm_node *find_node(struct nes_cm_core *cm_core, | |||
1287 | * find_listener - find a cm node listening on this addr-port pair | 1167 | * find_listener - find a cm node listening on this addr-port pair |
1288 | */ | 1168 | */ |
1289 | static struct nes_cm_listener *find_listener(struct nes_cm_core *cm_core, | 1169 | static struct nes_cm_listener *find_listener(struct nes_cm_core *cm_core, |
1290 | nes_addr_t dst_addr, u16 dst_port, | 1170 | nes_addr_t dst_addr, u16 dst_port, |
1291 | enum nes_cm_listener_state listener_state, int local) | 1171 | enum nes_cm_listener_state listener_state) |
1292 | { | 1172 | { |
1293 | unsigned long flags; | 1173 | unsigned long flags; |
1294 | struct nes_cm_listener *listen_node; | 1174 | struct nes_cm_listener *listen_node; |
@@ -1298,13 +1178,9 @@ static struct nes_cm_listener *find_listener(struct nes_cm_core *cm_core, | |||
1298 | /* walk list and find cm_node associated with this session ID */ | 1178 | /* walk list and find cm_node associated with this session ID */ |
1299 | spin_lock_irqsave(&cm_core->listen_list_lock, flags); | 1179 | spin_lock_irqsave(&cm_core->listen_list_lock, flags); |
1300 | list_for_each_entry(listen_node, &cm_core->listen_list.list, list) { | 1180 | list_for_each_entry(listen_node, &cm_core->listen_list.list, list) { |
1301 | if (local) { | 1181 | listen_addr = listen_node->loc_addr; |
1302 | listen_addr = listen_node->loc_addr; | 1182 | listen_port = listen_node->loc_port; |
1303 | listen_port = listen_node->loc_port; | 1183 | |
1304 | } else { | ||
1305 | listen_addr = listen_node->mapped_loc_addr; | ||
1306 | listen_port = listen_node->mapped_loc_port; | ||
1307 | } | ||
1308 | /* compare node pair, return node handle if a match */ | 1184 | /* compare node pair, return node handle if a match */ |
1309 | if (((listen_addr == dst_addr) || | 1185 | if (((listen_addr == dst_addr) || |
1310 | listen_addr == 0x00000000) && | 1186 | listen_addr == 0x00000000) && |
@@ -1443,17 +1319,13 @@ static int mini_cm_dec_refcnt_listen(struct nes_cm_core *cm_core, | |||
1443 | 1319 | ||
1444 | if (listener->nesvnic) { | 1320 | if (listener->nesvnic) { |
1445 | nes_manage_apbvt(listener->nesvnic, | 1321 | nes_manage_apbvt(listener->nesvnic, |
1446 | listener->mapped_loc_port, | 1322 | listener->loc_port, |
1447 | PCI_FUNC(listener->nesvnic->nesdev->pcidev->devfn), | 1323 | PCI_FUNC(listener->nesvnic->nesdev->pcidev->devfn), |
1448 | NES_MANAGE_APBVT_DEL); | 1324 | NES_MANAGE_APBVT_DEL); |
1449 | 1325 | ||
1450 | nes_remove_mapinfo(listener->loc_addr, | ||
1451 | listener->loc_port, | ||
1452 | listener->mapped_loc_addr, | ||
1453 | listener->mapped_loc_port); | ||
1454 | nes_debug(NES_DBG_NLMSG, | 1326 | nes_debug(NES_DBG_NLMSG, |
1455 | "Delete APBVT mapped_loc_port = %04X\n", | 1327 | "Delete APBVT loc_port = %04X\n", |
1456 | listener->mapped_loc_port); | 1328 | listener->loc_port); |
1457 | } | 1329 | } |
1458 | 1330 | ||
1459 | nes_debug(NES_DBG_CM, "destroying listener (%p)\n", listener); | 1331 | nes_debug(NES_DBG_CM, "destroying listener (%p)\n", listener); |
@@ -1602,11 +1474,6 @@ static struct nes_cm_node *make_cm_node(struct nes_cm_core *cm_core, | |||
1602 | cm_node->rem_addr = cm_info->rem_addr; | 1474 | cm_node->rem_addr = cm_info->rem_addr; |
1603 | cm_node->rem_port = cm_info->rem_port; | 1475 | cm_node->rem_port = cm_info->rem_port; |
1604 | 1476 | ||
1605 | cm_node->mapped_loc_addr = cm_info->mapped_loc_addr; | ||
1606 | cm_node->mapped_rem_addr = cm_info->mapped_rem_addr; | ||
1607 | cm_node->mapped_loc_port = cm_info->mapped_loc_port; | ||
1608 | cm_node->mapped_rem_port = cm_info->mapped_rem_port; | ||
1609 | |||
1610 | cm_node->mpa_frame_rev = mpa_version; | 1477 | cm_node->mpa_frame_rev = mpa_version; |
1611 | cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO; | 1478 | cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO; |
1612 | cm_node->mpav2_ird_ord = 0; | 1479 | cm_node->mpav2_ird_ord = 0; |
@@ -1655,10 +1522,10 @@ static struct nes_cm_node *make_cm_node(struct nes_cm_core *cm_core, | |||
1655 | cm_node->loopbackpartner = NULL; | 1522 | cm_node->loopbackpartner = NULL; |
1656 | 1523 | ||
1657 | /* get the mac addr for the remote node */ | 1524 | /* get the mac addr for the remote node */ |
1658 | oldarpindex = nes_arp_table(nesdev, cm_node->mapped_rem_addr, | 1525 | oldarpindex = nes_arp_table(nesdev, cm_node->rem_addr, |
1659 | NULL, NES_ARP_RESOLVE); | 1526 | NULL, NES_ARP_RESOLVE); |
1660 | arpindex = nes_addr_resolve_neigh(nesvnic, | 1527 | arpindex = nes_addr_resolve_neigh(nesvnic, cm_node->rem_addr, |
1661 | cm_node->mapped_rem_addr, oldarpindex); | 1528 | oldarpindex); |
1662 | if (arpindex < 0) { | 1529 | if (arpindex < 0) { |
1663 | kfree(cm_node); | 1530 | kfree(cm_node); |
1664 | return NULL; | 1531 | return NULL; |
@@ -1720,14 +1587,12 @@ static int rem_ref_cm_node(struct nes_cm_core *cm_core, | |||
1720 | mini_cm_dec_refcnt_listen(cm_core, cm_node->listener, 0); | 1587 | mini_cm_dec_refcnt_listen(cm_core, cm_node->listener, 0); |
1721 | } else { | 1588 | } else { |
1722 | if (cm_node->apbvt_set && cm_node->nesvnic) { | 1589 | if (cm_node->apbvt_set && cm_node->nesvnic) { |
1723 | nes_manage_apbvt(cm_node->nesvnic, cm_node->mapped_loc_port, | 1590 | nes_manage_apbvt(cm_node->nesvnic, cm_node->loc_port, |
1724 | PCI_FUNC(cm_node->nesvnic->nesdev->pcidev->devfn), | 1591 | PCI_FUNC(cm_node->nesvnic->nesdev->pcidev->devfn), |
1725 | NES_MANAGE_APBVT_DEL); | 1592 | NES_MANAGE_APBVT_DEL); |
1726 | } | 1593 | } |
1727 | nes_debug(NES_DBG_NLMSG, "Delete APBVT mapped_loc_port = %04X\n", | 1594 | nes_debug(NES_DBG_NLMSG, "Delete APBVT loc_port = %04X\n", |
1728 | cm_node->mapped_loc_port); | 1595 | cm_node->loc_port); |
1729 | nes_remove_mapinfo(cm_node->loc_addr, cm_node->loc_port, | ||
1730 | cm_node->mapped_loc_addr, cm_node->mapped_loc_port); | ||
1731 | } | 1596 | } |
1732 | 1597 | ||
1733 | atomic_dec(&cm_core->node_cnt); | 1598 | atomic_dec(&cm_core->node_cnt); |
@@ -2184,7 +2049,6 @@ static int handle_ack_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb, | |||
2184 | cm_node->state = NES_CM_STATE_ESTABLISHED; | 2049 | cm_node->state = NES_CM_STATE_ESTABLISHED; |
2185 | if (datasize) { | 2050 | if (datasize) { |
2186 | cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; | 2051 | cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize; |
2187 | nes_get_remote_addr(cm_node); | ||
2188 | handle_rcv_mpa(cm_node, skb); | 2052 | handle_rcv_mpa(cm_node, skb); |
2189 | } else { /* rcvd ACK only */ | 2053 | } else { /* rcvd ACK only */ |
2190 | dev_kfree_skb_any(skb); | 2054 | dev_kfree_skb_any(skb); |
@@ -2399,17 +2263,14 @@ static struct nes_cm_listener *mini_cm_listen(struct nes_cm_core *cm_core, | |||
2399 | struct nes_vnic *nesvnic, struct nes_cm_info *cm_info) | 2263 | struct nes_vnic *nesvnic, struct nes_cm_info *cm_info) |
2400 | { | 2264 | { |
2401 | struct nes_cm_listener *listener; | 2265 | struct nes_cm_listener *listener; |
2402 | struct iwpm_dev_data pm_reg_msg; | ||
2403 | struct iwpm_sa_data pm_msg; | ||
2404 | unsigned long flags; | 2266 | unsigned long flags; |
2405 | int iwpm_err = 0; | ||
2406 | 2267 | ||
2407 | nes_debug(NES_DBG_CM, "Search for 0x%08x : 0x%04x\n", | 2268 | nes_debug(NES_DBG_CM, "Search for 0x%08x : 0x%04x\n", |
2408 | cm_info->loc_addr, cm_info->loc_port); | 2269 | cm_info->loc_addr, cm_info->loc_port); |
2409 | 2270 | ||
2410 | /* cannot have multiple matching listeners */ | 2271 | /* cannot have multiple matching listeners */ |
2411 | listener = find_listener(cm_core, cm_info->loc_addr, cm_info->loc_port, | 2272 | listener = find_listener(cm_core, cm_info->loc_addr, cm_info->loc_port, |
2412 | NES_CM_LISTENER_EITHER_STATE, 1); | 2273 | NES_CM_LISTENER_EITHER_STATE); |
2413 | 2274 | ||
2414 | if (listener && listener->listener_state == NES_CM_LISTENER_ACTIVE_STATE) { | 2275 | if (listener && listener->listener_state == NES_CM_LISTENER_ACTIVE_STATE) { |
2415 | /* find automatically incs ref count ??? */ | 2276 | /* find automatically incs ref count ??? */ |
@@ -2419,22 +2280,6 @@ static struct nes_cm_listener *mini_cm_listen(struct nes_cm_core *cm_core, | |||
2419 | } | 2280 | } |
2420 | 2281 | ||
2421 | if (!listener) { | 2282 | if (!listener) { |
2422 | nes_form_reg_msg(nesvnic, &pm_reg_msg); | ||
2423 | iwpm_err = iwpm_register_pid(&pm_reg_msg, RDMA_NL_NES); | ||
2424 | if (iwpm_err) { | ||
2425 | nes_debug(NES_DBG_NLMSG, | ||
2426 | "Port Mapper reg pid fail (err = %d).\n", iwpm_err); | ||
2427 | } | ||
2428 | if (iwpm_valid_pid() && !iwpm_err) { | ||
2429 | nes_form_pm_msg(cm_info, &pm_msg); | ||
2430 | iwpm_err = iwpm_add_mapping(&pm_msg, RDMA_NL_NES); | ||
2431 | if (iwpm_err) | ||
2432 | nes_debug(NES_DBG_NLMSG, | ||
2433 | "Port Mapper query fail (err = %d).\n", iwpm_err); | ||
2434 | else | ||
2435 | nes_record_pm_msg(cm_info, &pm_msg); | ||
2436 | } | ||
2437 | |||
2438 | /* create a CM listen node (1/2 node to compare incoming traffic to) */ | 2283 | /* create a CM listen node (1/2 node to compare incoming traffic to) */ |
2439 | listener = kzalloc(sizeof(*listener), GFP_ATOMIC); | 2284 | listener = kzalloc(sizeof(*listener), GFP_ATOMIC); |
2440 | if (!listener) { | 2285 | if (!listener) { |
@@ -2444,8 +2289,6 @@ static struct nes_cm_listener *mini_cm_listen(struct nes_cm_core *cm_core, | |||
2444 | 2289 | ||
2445 | listener->loc_addr = cm_info->loc_addr; | 2290 | listener->loc_addr = cm_info->loc_addr; |
2446 | listener->loc_port = cm_info->loc_port; | 2291 | listener->loc_port = cm_info->loc_port; |
2447 | listener->mapped_loc_addr = cm_info->mapped_loc_addr; | ||
2448 | listener->mapped_loc_port = cm_info->mapped_loc_port; | ||
2449 | listener->reused_node = 0; | 2292 | listener->reused_node = 0; |
2450 | 2293 | ||
2451 | atomic_set(&listener->ref_count, 1); | 2294 | atomic_set(&listener->ref_count, 1); |
@@ -2507,18 +2350,18 @@ static struct nes_cm_node *mini_cm_connect(struct nes_cm_core *cm_core, | |||
2507 | 2350 | ||
2508 | if (cm_info->loc_addr == cm_info->rem_addr) { | 2351 | if (cm_info->loc_addr == cm_info->rem_addr) { |
2509 | loopbackremotelistener = find_listener(cm_core, | 2352 | loopbackremotelistener = find_listener(cm_core, |
2510 | cm_node->mapped_loc_addr, cm_node->mapped_rem_port, | 2353 | cm_node->loc_addr, cm_node->rem_port, |
2511 | NES_CM_LISTENER_ACTIVE_STATE, 0); | 2354 | NES_CM_LISTENER_ACTIVE_STATE); |
2512 | if (loopbackremotelistener == NULL) { | 2355 | if (loopbackremotelistener == NULL) { |
2513 | create_event(cm_node, NES_CM_EVENT_ABORTED); | 2356 | create_event(cm_node, NES_CM_EVENT_ABORTED); |
2514 | } else { | 2357 | } else { |
2515 | loopback_cm_info = *cm_info; | 2358 | loopback_cm_info = *cm_info; |
2516 | loopback_cm_info.loc_port = cm_info->rem_port; | 2359 | loopback_cm_info.loc_port = cm_info->rem_port; |
2517 | loopback_cm_info.rem_port = cm_info->loc_port; | 2360 | loopback_cm_info.rem_port = cm_info->loc_port; |
2518 | loopback_cm_info.mapped_loc_port = | 2361 | loopback_cm_info.loc_port = |
2519 | cm_info->mapped_rem_port; | 2362 | cm_info->rem_port; |
2520 | loopback_cm_info.mapped_rem_port = | 2363 | loopback_cm_info.rem_port = |
2521 | cm_info->mapped_loc_port; | 2364 | cm_info->loc_port; |
2522 | loopback_cm_info.cm_id = loopbackremotelistener->cm_id; | 2365 | loopback_cm_info.cm_id = loopbackremotelistener->cm_id; |
2523 | loopbackremotenode = make_cm_node(cm_core, nesvnic, | 2366 | loopbackremotenode = make_cm_node(cm_core, nesvnic, |
2524 | &loopback_cm_info, loopbackremotelistener); | 2367 | &loopback_cm_info, loopbackremotelistener); |
@@ -2747,12 +2590,6 @@ static int mini_cm_recv_pkt(struct nes_cm_core *cm_core, | |||
2747 | nfo.rem_addr = ntohl(iph->saddr); | 2590 | nfo.rem_addr = ntohl(iph->saddr); |
2748 | nfo.rem_port = ntohs(tcph->source); | 2591 | nfo.rem_port = ntohs(tcph->source); |
2749 | 2592 | ||
2750 | /* If port mapper is available these should be mapped address info */ | ||
2751 | nfo.mapped_loc_addr = ntohl(iph->daddr); | ||
2752 | nfo.mapped_loc_port = ntohs(tcph->dest); | ||
2753 | nfo.mapped_rem_addr = ntohl(iph->saddr); | ||
2754 | nfo.mapped_rem_port = ntohs(tcph->source); | ||
2755 | |||
2756 | tmp_daddr = cpu_to_be32(iph->daddr); | 2593 | tmp_daddr = cpu_to_be32(iph->daddr); |
2757 | tmp_saddr = cpu_to_be32(iph->saddr); | 2594 | tmp_saddr = cpu_to_be32(iph->saddr); |
2758 | 2595 | ||
@@ -2761,8 +2598,8 @@ static int mini_cm_recv_pkt(struct nes_cm_core *cm_core, | |||
2761 | 2598 | ||
2762 | do { | 2599 | do { |
2763 | cm_node = find_node(cm_core, | 2600 | cm_node = find_node(cm_core, |
2764 | nfo.mapped_rem_port, nfo.mapped_rem_addr, | 2601 | nfo.rem_port, nfo.rem_addr, |
2765 | nfo.mapped_loc_port, nfo.mapped_loc_addr); | 2602 | nfo.loc_port, nfo.loc_addr); |
2766 | 2603 | ||
2767 | if (!cm_node) { | 2604 | if (!cm_node) { |
2768 | /* Only type of packet accepted are for */ | 2605 | /* Only type of packet accepted are for */ |
@@ -2771,9 +2608,9 @@ static int mini_cm_recv_pkt(struct nes_cm_core *cm_core, | |||
2771 | skb_handled = 0; | 2608 | skb_handled = 0; |
2772 | break; | 2609 | break; |
2773 | } | 2610 | } |
2774 | listener = find_listener(cm_core, nfo.mapped_loc_addr, | 2611 | listener = find_listener(cm_core, nfo.loc_addr, |
2775 | nfo.mapped_loc_port, | 2612 | nfo.loc_port, |
2776 | NES_CM_LISTENER_ACTIVE_STATE, 0); | 2613 | NES_CM_LISTENER_ACTIVE_STATE); |
2777 | if (!listener) { | 2614 | if (!listener) { |
2778 | nfo.cm_id = NULL; | 2615 | nfo.cm_id = NULL; |
2779 | nfo.conn_type = 0; | 2616 | nfo.conn_type = 0; |
@@ -2856,12 +2693,22 @@ static struct nes_cm_core *nes_cm_alloc_core(void) | |||
2856 | 2693 | ||
2857 | nes_debug(NES_DBG_CM, "Enable QUEUE EVENTS\n"); | 2694 | nes_debug(NES_DBG_CM, "Enable QUEUE EVENTS\n"); |
2858 | cm_core->event_wq = create_singlethread_workqueue("nesewq"); | 2695 | cm_core->event_wq = create_singlethread_workqueue("nesewq"); |
2696 | if (!cm_core->event_wq) | ||
2697 | goto out_free_cmcore; | ||
2859 | cm_core->post_event = nes_cm_post_event; | 2698 | cm_core->post_event = nes_cm_post_event; |
2860 | nes_debug(NES_DBG_CM, "Enable QUEUE DISCONNECTS\n"); | 2699 | nes_debug(NES_DBG_CM, "Enable QUEUE DISCONNECTS\n"); |
2861 | cm_core->disconn_wq = create_singlethread_workqueue("nesdwq"); | 2700 | cm_core->disconn_wq = create_singlethread_workqueue("nesdwq"); |
2701 | if (!cm_core->disconn_wq) | ||
2702 | goto out_free_wq; | ||
2862 | 2703 | ||
2863 | print_core(cm_core); | 2704 | print_core(cm_core); |
2864 | return cm_core; | 2705 | return cm_core; |
2706 | |||
2707 | out_free_wq: | ||
2708 | destroy_workqueue(cm_core->event_wq); | ||
2709 | out_free_cmcore: | ||
2710 | kfree(cm_core); | ||
2711 | return NULL; | ||
2865 | } | 2712 | } |
2866 | 2713 | ||
2867 | 2714 | ||
@@ -3121,8 +2968,8 @@ static int nes_cm_disconn_true(struct nes_qp *nesqp) | |||
3121 | atomic_inc(&cm_disconnects); | 2968 | atomic_inc(&cm_disconnects); |
3122 | cm_event.event = IW_CM_EVENT_DISCONNECT; | 2969 | cm_event.event = IW_CM_EVENT_DISCONNECT; |
3123 | cm_event.status = disconn_status; | 2970 | cm_event.status = disconn_status; |
3124 | cm_event.local_addr = cm_id->local_addr; | 2971 | cm_event.local_addr = cm_id->m_local_addr; |
3125 | cm_event.remote_addr = cm_id->remote_addr; | 2972 | cm_event.remote_addr = cm_id->m_remote_addr; |
3126 | cm_event.private_data = NULL; | 2973 | cm_event.private_data = NULL; |
3127 | cm_event.private_data_len = 0; | 2974 | cm_event.private_data_len = 0; |
3128 | 2975 | ||
@@ -3148,8 +2995,8 @@ static int nes_cm_disconn_true(struct nes_qp *nesqp) | |||
3148 | cm_event.event = IW_CM_EVENT_CLOSE; | 2995 | cm_event.event = IW_CM_EVENT_CLOSE; |
3149 | cm_event.status = 0; | 2996 | cm_event.status = 0; |
3150 | cm_event.provider_data = cm_id->provider_data; | 2997 | cm_event.provider_data = cm_id->provider_data; |
3151 | cm_event.local_addr = cm_id->local_addr; | 2998 | cm_event.local_addr = cm_id->m_local_addr; |
3152 | cm_event.remote_addr = cm_id->remote_addr; | 2999 | cm_event.remote_addr = cm_id->m_remote_addr; |
3153 | cm_event.private_data = NULL; | 3000 | cm_event.private_data = NULL; |
3154 | cm_event.private_data_len = 0; | 3001 | cm_event.private_data_len = 0; |
3155 | 3002 | ||
@@ -3240,8 +3087,8 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
3240 | u8 *start_ptr = &start_addr; | 3087 | u8 *start_ptr = &start_addr; |
3241 | u8 **start_buff = &start_ptr; | 3088 | u8 **start_buff = &start_ptr; |
3242 | u16 buff_len = 0; | 3089 | u16 buff_len = 0; |
3243 | struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr; | 3090 | struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->m_local_addr; |
3244 | struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr; | 3091 | struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->m_remote_addr; |
3245 | 3092 | ||
3246 | ibqp = nes_get_qp(cm_id->device, conn_param->qpn); | 3093 | ibqp = nes_get_qp(cm_id->device, conn_param->qpn); |
3247 | if (!ibqp) | 3094 | if (!ibqp) |
@@ -3378,11 +3225,11 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
3378 | nes_cm_init_tsa_conn(nesqp, cm_node); | 3225 | nes_cm_init_tsa_conn(nesqp, cm_node); |
3379 | 3226 | ||
3380 | nesqp->nesqp_context->tcpPorts[0] = | 3227 | nesqp->nesqp_context->tcpPorts[0] = |
3381 | cpu_to_le16(cm_node->mapped_loc_port); | 3228 | cpu_to_le16(cm_node->loc_port); |
3382 | nesqp->nesqp_context->tcpPorts[1] = | 3229 | nesqp->nesqp_context->tcpPorts[1] = |
3383 | cpu_to_le16(cm_node->mapped_rem_port); | 3230 | cpu_to_le16(cm_node->rem_port); |
3384 | 3231 | ||
3385 | nesqp->nesqp_context->ip0 = cpu_to_le32(cm_node->mapped_rem_addr); | 3232 | nesqp->nesqp_context->ip0 = cpu_to_le32(cm_node->rem_addr); |
3386 | 3233 | ||
3387 | nesqp->nesqp_context->misc2 |= cpu_to_le32( | 3234 | nesqp->nesqp_context->misc2 |= cpu_to_le32( |
3388 | (u32)PCI_FUNC(nesdev->pcidev->devfn) << | 3235 | (u32)PCI_FUNC(nesdev->pcidev->devfn) << |
@@ -3406,9 +3253,9 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
3406 | memset(&nes_quad, 0, sizeof(nes_quad)); | 3253 | memset(&nes_quad, 0, sizeof(nes_quad)); |
3407 | nes_quad.DstIpAdrIndex = | 3254 | nes_quad.DstIpAdrIndex = |
3408 | cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24); | 3255 | cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24); |
3409 | nes_quad.SrcIpadr = htonl(cm_node->mapped_rem_addr); | 3256 | nes_quad.SrcIpadr = htonl(cm_node->rem_addr); |
3410 | nes_quad.TcpPorts[0] = htons(cm_node->mapped_rem_port); | 3257 | nes_quad.TcpPorts[0] = htons(cm_node->rem_port); |
3411 | nes_quad.TcpPorts[1] = htons(cm_node->mapped_loc_port); | 3258 | nes_quad.TcpPorts[1] = htons(cm_node->loc_port); |
3412 | 3259 | ||
3413 | /* Produce hash key */ | 3260 | /* Produce hash key */ |
3414 | crc_value = get_crc_value(&nes_quad); | 3261 | crc_value = get_crc_value(&nes_quad); |
@@ -3437,8 +3284,8 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
3437 | cm_event.event = IW_CM_EVENT_ESTABLISHED; | 3284 | cm_event.event = IW_CM_EVENT_ESTABLISHED; |
3438 | cm_event.status = 0; | 3285 | cm_event.status = 0; |
3439 | cm_event.provider_data = (void *)nesqp; | 3286 | cm_event.provider_data = (void *)nesqp; |
3440 | cm_event.local_addr = cm_id->local_addr; | 3287 | cm_event.local_addr = cm_id->m_local_addr; |
3441 | cm_event.remote_addr = cm_id->remote_addr; | 3288 | cm_event.remote_addr = cm_id->m_remote_addr; |
3442 | cm_event.private_data = NULL; | 3289 | cm_event.private_data = NULL; |
3443 | cm_event.private_data_len = 0; | 3290 | cm_event.private_data_len = 0; |
3444 | cm_event.ird = cm_node->ird_size; | 3291 | cm_event.ird = cm_node->ird_size; |
@@ -3508,11 +3355,8 @@ int nes_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
3508 | struct nes_cm_node *cm_node; | 3355 | struct nes_cm_node *cm_node; |
3509 | struct nes_cm_info cm_info; | 3356 | struct nes_cm_info cm_info; |
3510 | int apbvt_set = 0; | 3357 | int apbvt_set = 0; |
3511 | struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr; | 3358 | struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->m_local_addr; |
3512 | struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr; | 3359 | struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->m_remote_addr; |
3513 | struct iwpm_dev_data pm_reg_msg; | ||
3514 | struct iwpm_sa_data pm_msg; | ||
3515 | int iwpm_err = 0; | ||
3516 | 3360 | ||
3517 | if (cm_id->remote_addr.ss_family != AF_INET) | 3361 | if (cm_id->remote_addr.ss_family != AF_INET) |
3518 | return -ENOSYS; | 3362 | return -ENOSYS; |
@@ -3558,37 +3402,13 @@ int nes_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
3558 | cm_info.cm_id = cm_id; | 3402 | cm_info.cm_id = cm_id; |
3559 | cm_info.conn_type = NES_CM_IWARP_CONN_TYPE; | 3403 | cm_info.conn_type = NES_CM_IWARP_CONN_TYPE; |
3560 | 3404 | ||
3561 | /* No port mapper available, go with the specified peer information */ | ||
3562 | cm_info.mapped_loc_addr = cm_info.loc_addr; | ||
3563 | cm_info.mapped_loc_port = cm_info.loc_port; | ||
3564 | cm_info.mapped_rem_addr = cm_info.rem_addr; | ||
3565 | cm_info.mapped_rem_port = cm_info.rem_port; | ||
3566 | |||
3567 | nes_form_reg_msg(nesvnic, &pm_reg_msg); | ||
3568 | iwpm_err = iwpm_register_pid(&pm_reg_msg, RDMA_NL_NES); | ||
3569 | if (iwpm_err) { | ||
3570 | nes_debug(NES_DBG_NLMSG, | ||
3571 | "Port Mapper reg pid fail (err = %d).\n", iwpm_err); | ||
3572 | } | ||
3573 | if (iwpm_valid_pid() && !iwpm_err) { | ||
3574 | nes_form_pm_msg(&cm_info, &pm_msg); | ||
3575 | iwpm_err = iwpm_add_and_query_mapping(&pm_msg, RDMA_NL_NES); | ||
3576 | if (iwpm_err) | ||
3577 | nes_debug(NES_DBG_NLMSG, | ||
3578 | "Port Mapper query fail (err = %d).\n", iwpm_err); | ||
3579 | else | ||
3580 | nes_record_pm_msg(&cm_info, &pm_msg); | ||
3581 | } | ||
3582 | |||
3583 | if (laddr->sin_addr.s_addr != raddr->sin_addr.s_addr) { | 3405 | if (laddr->sin_addr.s_addr != raddr->sin_addr.s_addr) { |
3584 | nes_manage_apbvt(nesvnic, cm_info.mapped_loc_port, | 3406 | nes_manage_apbvt(nesvnic, cm_info.loc_port, |
3585 | PCI_FUNC(nesdev->pcidev->devfn), NES_MANAGE_APBVT_ADD); | 3407 | PCI_FUNC(nesdev->pcidev->devfn), |
3408 | NES_MANAGE_APBVT_ADD); | ||
3586 | apbvt_set = 1; | 3409 | apbvt_set = 1; |
3587 | } | 3410 | } |
3588 | 3411 | ||
3589 | if (nes_create_mapinfo(&cm_info)) | ||
3590 | return -ENOMEM; | ||
3591 | |||
3592 | cm_id->add_ref(cm_id); | 3412 | cm_id->add_ref(cm_id); |
3593 | 3413 | ||
3594 | /* create a connect CM node connection */ | 3414 | /* create a connect CM node connection */ |
@@ -3597,14 +3417,12 @@ int nes_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
3597 | &cm_info); | 3417 | &cm_info); |
3598 | if (!cm_node) { | 3418 | if (!cm_node) { |
3599 | if (apbvt_set) | 3419 | if (apbvt_set) |
3600 | nes_manage_apbvt(nesvnic, cm_info.mapped_loc_port, | 3420 | nes_manage_apbvt(nesvnic, cm_info.loc_port, |
3601 | PCI_FUNC(nesdev->pcidev->devfn), | 3421 | PCI_FUNC(nesdev->pcidev->devfn), |
3602 | NES_MANAGE_APBVT_DEL); | 3422 | NES_MANAGE_APBVT_DEL); |
3603 | 3423 | ||
3604 | nes_debug(NES_DBG_NLMSG, "Delete mapped_loc_port = %04X\n", | 3424 | nes_debug(NES_DBG_NLMSG, "Delete loc_port = %04X\n", |
3605 | cm_info.mapped_loc_port); | 3425 | cm_info.loc_port); |
3606 | nes_remove_mapinfo(cm_info.loc_addr, cm_info.loc_port, | ||
3607 | cm_info.mapped_loc_addr, cm_info.mapped_loc_port); | ||
3608 | cm_id->rem_ref(cm_id); | 3426 | cm_id->rem_ref(cm_id); |
3609 | return -ENOMEM; | 3427 | return -ENOMEM; |
3610 | } | 3428 | } |
@@ -3633,12 +3451,12 @@ int nes_create_listen(struct iw_cm_id *cm_id, int backlog) | |||
3633 | struct nes_cm_listener *cm_node; | 3451 | struct nes_cm_listener *cm_node; |
3634 | struct nes_cm_info cm_info; | 3452 | struct nes_cm_info cm_info; |
3635 | int err; | 3453 | int err; |
3636 | struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr; | 3454 | struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->m_local_addr; |
3637 | 3455 | ||
3638 | nes_debug(NES_DBG_CM, "cm_id = %p, local port = 0x%04X.\n", | 3456 | nes_debug(NES_DBG_CM, "cm_id = %p, local port = 0x%04X.\n", |
3639 | cm_id, ntohs(laddr->sin_port)); | 3457 | cm_id, ntohs(laddr->sin_port)); |
3640 | 3458 | ||
3641 | if (cm_id->local_addr.ss_family != AF_INET) | 3459 | if (cm_id->m_local_addr.ss_family != AF_INET) |
3642 | return -ENOSYS; | 3460 | return -ENOSYS; |
3643 | nesvnic = to_nesvnic(cm_id->device); | 3461 | nesvnic = to_nesvnic(cm_id->device); |
3644 | if (!nesvnic) | 3462 | if (!nesvnic) |
@@ -3658,10 +3476,6 @@ int nes_create_listen(struct iw_cm_id *cm_id, int backlog) | |||
3658 | 3476 | ||
3659 | cm_info.conn_type = NES_CM_IWARP_CONN_TYPE; | 3477 | cm_info.conn_type = NES_CM_IWARP_CONN_TYPE; |
3660 | 3478 | ||
3661 | /* No port mapper available, go with the specified info */ | ||
3662 | cm_info.mapped_loc_addr = cm_info.loc_addr; | ||
3663 | cm_info.mapped_loc_port = cm_info.loc_port; | ||
3664 | |||
3665 | cm_node = g_cm_core->api->listen(g_cm_core, nesvnic, &cm_info); | 3479 | cm_node = g_cm_core->api->listen(g_cm_core, nesvnic, &cm_info); |
3666 | if (!cm_node) { | 3480 | if (!cm_node) { |
3667 | printk(KERN_ERR "%s[%u] Error returned from listen API call\n", | 3481 | printk(KERN_ERR "%s[%u] Error returned from listen API call\n", |
@@ -3673,10 +3487,7 @@ int nes_create_listen(struct iw_cm_id *cm_id, int backlog) | |||
3673 | cm_node->tos = cm_id->tos; | 3487 | cm_node->tos = cm_id->tos; |
3674 | 3488 | ||
3675 | if (!cm_node->reused_node) { | 3489 | if (!cm_node->reused_node) { |
3676 | if (nes_create_mapinfo(&cm_info)) | 3490 | err = nes_manage_apbvt(nesvnic, cm_node->loc_port, |
3677 | return -ENOMEM; | ||
3678 | |||
3679 | err = nes_manage_apbvt(nesvnic, cm_node->mapped_loc_port, | ||
3680 | PCI_FUNC(nesvnic->nesdev->pcidev->devfn), | 3491 | PCI_FUNC(nesvnic->nesdev->pcidev->devfn), |
3681 | NES_MANAGE_APBVT_ADD); | 3492 | NES_MANAGE_APBVT_ADD); |
3682 | if (err) { | 3493 | if (err) { |
@@ -3786,8 +3597,8 @@ static void cm_event_connected(struct nes_cm_event *event) | |||
3786 | nesvnic = to_nesvnic(nesqp->ibqp.device); | 3597 | nesvnic = to_nesvnic(nesqp->ibqp.device); |
3787 | nesdev = nesvnic->nesdev; | 3598 | nesdev = nesvnic->nesdev; |
3788 | nesadapter = nesdev->nesadapter; | 3599 | nesadapter = nesdev->nesadapter; |
3789 | laddr = (struct sockaddr_in *)&cm_id->local_addr; | 3600 | laddr = (struct sockaddr_in *)&cm_id->m_local_addr; |
3790 | raddr = (struct sockaddr_in *)&cm_id->remote_addr; | 3601 | raddr = (struct sockaddr_in *)&cm_id->m_remote_addr; |
3791 | cm_event_laddr = (struct sockaddr_in *)&cm_event.local_addr; | 3602 | cm_event_laddr = (struct sockaddr_in *)&cm_event.local_addr; |
3792 | 3603 | ||
3793 | if (nesqp->destroyed) | 3604 | if (nesqp->destroyed) |
@@ -3802,10 +3613,10 @@ static void cm_event_connected(struct nes_cm_event *event) | |||
3802 | 3613 | ||
3803 | /* set the QP tsa context */ | 3614 | /* set the QP tsa context */ |
3804 | nesqp->nesqp_context->tcpPorts[0] = | 3615 | nesqp->nesqp_context->tcpPorts[0] = |
3805 | cpu_to_le16(cm_node->mapped_loc_port); | 3616 | cpu_to_le16(cm_node->loc_port); |
3806 | nesqp->nesqp_context->tcpPorts[1] = | 3617 | nesqp->nesqp_context->tcpPorts[1] = |
3807 | cpu_to_le16(cm_node->mapped_rem_port); | 3618 | cpu_to_le16(cm_node->rem_port); |
3808 | nesqp->nesqp_context->ip0 = cpu_to_le32(cm_node->mapped_rem_addr); | 3619 | nesqp->nesqp_context->ip0 = cpu_to_le32(cm_node->rem_addr); |
3809 | 3620 | ||
3810 | nesqp->nesqp_context->misc2 |= cpu_to_le32( | 3621 | nesqp->nesqp_context->misc2 |= cpu_to_le32( |
3811 | (u32)PCI_FUNC(nesdev->pcidev->devfn) << | 3622 | (u32)PCI_FUNC(nesdev->pcidev->devfn) << |
@@ -3835,9 +3646,9 @@ static void cm_event_connected(struct nes_cm_event *event) | |||
3835 | 3646 | ||
3836 | nes_quad.DstIpAdrIndex = | 3647 | nes_quad.DstIpAdrIndex = |
3837 | cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24); | 3648 | cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24); |
3838 | nes_quad.SrcIpadr = htonl(cm_node->mapped_rem_addr); | 3649 | nes_quad.SrcIpadr = htonl(cm_node->rem_addr); |
3839 | nes_quad.TcpPorts[0] = htons(cm_node->mapped_rem_port); | 3650 | nes_quad.TcpPorts[0] = htons(cm_node->rem_port); |
3840 | nes_quad.TcpPorts[1] = htons(cm_node->mapped_loc_port); | 3651 | nes_quad.TcpPorts[1] = htons(cm_node->loc_port); |
3841 | 3652 | ||
3842 | /* Produce hash key */ | 3653 | /* Produce hash key */ |
3843 | crc_value = get_crc_value(&nes_quad); | 3654 | crc_value = get_crc_value(&nes_quad); |
@@ -3858,14 +3669,14 @@ static void cm_event_connected(struct nes_cm_event *event) | |||
3858 | cm_event.provider_data = cm_id->provider_data; | 3669 | cm_event.provider_data = cm_id->provider_data; |
3859 | cm_event_laddr->sin_family = AF_INET; | 3670 | cm_event_laddr->sin_family = AF_INET; |
3860 | cm_event_laddr->sin_port = laddr->sin_port; | 3671 | cm_event_laddr->sin_port = laddr->sin_port; |
3861 | cm_event.remote_addr = cm_id->remote_addr; | 3672 | cm_event.remote_addr = cm_id->m_remote_addr; |
3862 | 3673 | ||
3863 | cm_event.private_data = (void *)event->cm_node->mpa_frame_buf; | 3674 | cm_event.private_data = (void *)event->cm_node->mpa_frame_buf; |
3864 | cm_event.private_data_len = (u8)event->cm_node->mpa_frame_size; | 3675 | cm_event.private_data_len = (u8)event->cm_node->mpa_frame_size; |
3865 | cm_event.ird = cm_node->ird_size; | 3676 | cm_event.ird = cm_node->ird_size; |
3866 | cm_event.ord = cm_node->ord_size; | 3677 | cm_event.ord = cm_node->ord_size; |
3867 | 3678 | ||
3868 | cm_event_laddr->sin_addr.s_addr = htonl(event->cm_info.rem_addr); | 3679 | cm_event_laddr->sin_addr.s_addr = htonl(event->cm_info.loc_addr); |
3869 | ret = cm_id->event_handler(cm_id, &cm_event); | 3680 | ret = cm_id->event_handler(cm_id, &cm_event); |
3870 | nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret); | 3681 | nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret); |
3871 | 3682 | ||
@@ -3913,8 +3724,8 @@ static void cm_event_connect_error(struct nes_cm_event *event) | |||
3913 | cm_event.event = IW_CM_EVENT_CONNECT_REPLY; | 3724 | cm_event.event = IW_CM_EVENT_CONNECT_REPLY; |
3914 | cm_event.status = -ECONNRESET; | 3725 | cm_event.status = -ECONNRESET; |
3915 | cm_event.provider_data = cm_id->provider_data; | 3726 | cm_event.provider_data = cm_id->provider_data; |
3916 | cm_event.local_addr = cm_id->local_addr; | 3727 | cm_event.local_addr = cm_id->m_local_addr; |
3917 | cm_event.remote_addr = cm_id->remote_addr; | 3728 | cm_event.remote_addr = cm_id->m_remote_addr; |
3918 | cm_event.private_data = NULL; | 3729 | cm_event.private_data = NULL; |
3919 | cm_event.private_data_len = 0; | 3730 | cm_event.private_data_len = 0; |
3920 | 3731 | ||
@@ -3970,8 +3781,8 @@ static void cm_event_reset(struct nes_cm_event *event) | |||
3970 | cm_event.event = IW_CM_EVENT_DISCONNECT; | 3781 | cm_event.event = IW_CM_EVENT_DISCONNECT; |
3971 | cm_event.status = -ECONNRESET; | 3782 | cm_event.status = -ECONNRESET; |
3972 | cm_event.provider_data = cm_id->provider_data; | 3783 | cm_event.provider_data = cm_id->provider_data; |
3973 | cm_event.local_addr = cm_id->local_addr; | 3784 | cm_event.local_addr = cm_id->m_local_addr; |
3974 | cm_event.remote_addr = cm_id->remote_addr; | 3785 | cm_event.remote_addr = cm_id->m_remote_addr; |
3975 | cm_event.private_data = NULL; | 3786 | cm_event.private_data = NULL; |
3976 | cm_event.private_data_len = 0; | 3787 | cm_event.private_data_len = 0; |
3977 | 3788 | ||
@@ -3981,8 +3792,8 @@ static void cm_event_reset(struct nes_cm_event *event) | |||
3981 | cm_event.event = IW_CM_EVENT_CLOSE; | 3792 | cm_event.event = IW_CM_EVENT_CLOSE; |
3982 | cm_event.status = 0; | 3793 | cm_event.status = 0; |
3983 | cm_event.provider_data = cm_id->provider_data; | 3794 | cm_event.provider_data = cm_id->provider_data; |
3984 | cm_event.local_addr = cm_id->local_addr; | 3795 | cm_event.local_addr = cm_id->m_local_addr; |
3985 | cm_event.remote_addr = cm_id->remote_addr; | 3796 | cm_event.remote_addr = cm_id->m_remote_addr; |
3986 | cm_event.private_data = NULL; | 3797 | cm_event.private_data = NULL; |
3987 | cm_event.private_data_len = 0; | 3798 | cm_event.private_data_len = 0; |
3988 | nes_debug(NES_DBG_CM, "NODE %p Generating CLOSE\n", event->cm_node); | 3799 | nes_debug(NES_DBG_CM, "NODE %p Generating CLOSE\n", event->cm_node); |
diff --git a/drivers/infiniband/hw/nes/nes_cm.h b/drivers/infiniband/hw/nes/nes_cm.h index 147c2c884227..d827d03e3941 100644 --- a/drivers/infiniband/hw/nes/nes_cm.h +++ b/drivers/infiniband/hw/nes/nes_cm.h | |||
@@ -293,8 +293,8 @@ struct nes_cm_listener { | |||
293 | struct list_head list; | 293 | struct list_head list; |
294 | struct nes_cm_core *cm_core; | 294 | struct nes_cm_core *cm_core; |
295 | u8 loc_mac[ETH_ALEN]; | 295 | u8 loc_mac[ETH_ALEN]; |
296 | nes_addr_t loc_addr, mapped_loc_addr; | 296 | nes_addr_t loc_addr; |
297 | u16 loc_port, mapped_loc_port; | 297 | u16 loc_port; |
298 | struct iw_cm_id *cm_id; | 298 | struct iw_cm_id *cm_id; |
299 | enum nes_cm_conn_type conn_type; | 299 | enum nes_cm_conn_type conn_type; |
300 | atomic_t ref_count; | 300 | atomic_t ref_count; |
@@ -309,9 +309,7 @@ struct nes_cm_listener { | |||
309 | /* per connection node and node state information */ | 309 | /* per connection node and node state information */ |
310 | struct nes_cm_node { | 310 | struct nes_cm_node { |
311 | nes_addr_t loc_addr, rem_addr; | 311 | nes_addr_t loc_addr, rem_addr; |
312 | nes_addr_t mapped_loc_addr, mapped_rem_addr; | ||
313 | u16 loc_port, rem_port; | 312 | u16 loc_port, rem_port; |
314 | u16 mapped_loc_port, mapped_rem_port; | ||
315 | 313 | ||
316 | u8 loc_mac[ETH_ALEN]; | 314 | u8 loc_mac[ETH_ALEN]; |
317 | u8 rem_mac[ETH_ALEN]; | 315 | u8 rem_mac[ETH_ALEN]; |
@@ -368,11 +366,6 @@ struct nes_cm_info { | |||
368 | u16 rem_port; | 366 | u16 rem_port; |
369 | nes_addr_t loc_addr; | 367 | nes_addr_t loc_addr; |
370 | nes_addr_t rem_addr; | 368 | nes_addr_t rem_addr; |
371 | u16 mapped_loc_port; | ||
372 | u16 mapped_rem_port; | ||
373 | nes_addr_t mapped_loc_addr; | ||
374 | nes_addr_t mapped_rem_addr; | ||
375 | |||
376 | enum nes_cm_conn_type conn_type; | 369 | enum nes_cm_conn_type conn_type; |
377 | int backlog; | 370 | int backlog; |
378 | }; | 371 | }; |
diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c index 4713dd7ed764..a1c6481d8038 100644 --- a/drivers/infiniband/hw/nes/nes_hw.c +++ b/drivers/infiniband/hw/nes/nes_hw.c | |||
@@ -35,18 +35,11 @@ | |||
35 | #include <linux/moduleparam.h> | 35 | #include <linux/moduleparam.h> |
36 | #include <linux/netdevice.h> | 36 | #include <linux/netdevice.h> |
37 | #include <linux/etherdevice.h> | 37 | #include <linux/etherdevice.h> |
38 | #include <linux/ip.h> | ||
39 | #include <linux/tcp.h> | ||
40 | #include <linux/if_vlan.h> | 38 | #include <linux/if_vlan.h> |
41 | #include <linux/inet_lro.h> | ||
42 | #include <linux/slab.h> | 39 | #include <linux/slab.h> |
43 | 40 | ||
44 | #include "nes.h" | 41 | #include "nes.h" |
45 | 42 | ||
46 | static unsigned int nes_lro_max_aggr = NES_LRO_MAX_AGGR; | ||
47 | module_param(nes_lro_max_aggr, uint, 0444); | ||
48 | MODULE_PARM_DESC(nes_lro_max_aggr, "NIC LRO max packet aggregation"); | ||
49 | |||
50 | static int wide_ppm_offset; | 43 | static int wide_ppm_offset; |
51 | module_param(wide_ppm_offset, int, 0644); | 44 | module_param(wide_ppm_offset, int, 0644); |
52 | MODULE_PARM_DESC(wide_ppm_offset, "Increase CX4 interface clock ppm offset, 0=100ppm (default), 1=300ppm"); | 45 | MODULE_PARM_DESC(wide_ppm_offset, "Increase CX4 interface clock ppm offset, 0=100ppm (default), 1=300ppm"); |
@@ -1642,25 +1635,6 @@ static void nes_rq_wqes_timeout(unsigned long parm) | |||
1642 | } | 1635 | } |
1643 | 1636 | ||
1644 | 1637 | ||
1645 | static int nes_lro_get_skb_hdr(struct sk_buff *skb, void **iphdr, | ||
1646 | void **tcph, u64 *hdr_flags, void *priv) | ||
1647 | { | ||
1648 | unsigned int ip_len; | ||
1649 | struct iphdr *iph; | ||
1650 | skb_reset_network_header(skb); | ||
1651 | iph = ip_hdr(skb); | ||
1652 | if (iph->protocol != IPPROTO_TCP) | ||
1653 | return -1; | ||
1654 | ip_len = ip_hdrlen(skb); | ||
1655 | skb_set_transport_header(skb, ip_len); | ||
1656 | *tcph = tcp_hdr(skb); | ||
1657 | |||
1658 | *hdr_flags = LRO_IPV4 | LRO_TCP; | ||
1659 | *iphdr = iph; | ||
1660 | return 0; | ||
1661 | } | ||
1662 | |||
1663 | |||
1664 | /** | 1638 | /** |
1665 | * nes_init_nic_qp | 1639 | * nes_init_nic_qp |
1666 | */ | 1640 | */ |
@@ -1895,14 +1869,6 @@ int nes_init_nic_qp(struct nes_device *nesdev, struct net_device *netdev) | |||
1895 | return -ENOMEM; | 1869 | return -ENOMEM; |
1896 | } | 1870 | } |
1897 | 1871 | ||
1898 | nesvnic->lro_mgr.max_aggr = nes_lro_max_aggr; | ||
1899 | nesvnic->lro_mgr.max_desc = NES_MAX_LRO_DESCRIPTORS; | ||
1900 | nesvnic->lro_mgr.lro_arr = nesvnic->lro_desc; | ||
1901 | nesvnic->lro_mgr.get_skb_header = nes_lro_get_skb_hdr; | ||
1902 | nesvnic->lro_mgr.features = LRO_F_NAPI | LRO_F_EXTRACT_VLAN_ID; | ||
1903 | nesvnic->lro_mgr.dev = netdev; | ||
1904 | nesvnic->lro_mgr.ip_summed = CHECKSUM_UNNECESSARY; | ||
1905 | nesvnic->lro_mgr.ip_summed_aggr = CHECKSUM_UNNECESSARY; | ||
1906 | return 0; | 1872 | return 0; |
1907 | } | 1873 | } |
1908 | 1874 | ||
@@ -2809,13 +2775,10 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq) | |||
2809 | u16 pkt_type; | 2775 | u16 pkt_type; |
2810 | u16 rqes_processed = 0; | 2776 | u16 rqes_processed = 0; |
2811 | u8 sq_cqes = 0; | 2777 | u8 sq_cqes = 0; |
2812 | u8 nes_use_lro = 0; | ||
2813 | 2778 | ||
2814 | head = cq->cq_head; | 2779 | head = cq->cq_head; |
2815 | cq_size = cq->cq_size; | 2780 | cq_size = cq->cq_size; |
2816 | cq->cqes_pending = 1; | 2781 | cq->cqes_pending = 1; |
2817 | if (nesvnic->netdev->features & NETIF_F_LRO) | ||
2818 | nes_use_lro = 1; | ||
2819 | do { | 2782 | do { |
2820 | if (le32_to_cpu(cq->cq_vbase[head].cqe_words[NES_NIC_CQE_MISC_IDX]) & | 2783 | if (le32_to_cpu(cq->cq_vbase[head].cqe_words[NES_NIC_CQE_MISC_IDX]) & |
2821 | NES_NIC_CQE_VALID) { | 2784 | NES_NIC_CQE_VALID) { |
@@ -2950,10 +2913,7 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq) | |||
2950 | 2913 | ||
2951 | __vlan_hwaccel_put_tag(rx_skb, htons(ETH_P_8021Q), vlan_tag); | 2914 | __vlan_hwaccel_put_tag(rx_skb, htons(ETH_P_8021Q), vlan_tag); |
2952 | } | 2915 | } |
2953 | if (nes_use_lro) | 2916 | napi_gro_receive(&nesvnic->napi, rx_skb); |
2954 | lro_receive_skb(&nesvnic->lro_mgr, rx_skb, NULL); | ||
2955 | else | ||
2956 | netif_receive_skb(rx_skb); | ||
2957 | 2917 | ||
2958 | skip_rx_indicate0: | 2918 | skip_rx_indicate0: |
2959 | ; | 2919 | ; |
@@ -2984,8 +2944,6 @@ skip_rx_indicate0: | |||
2984 | 2944 | ||
2985 | } while (1); | 2945 | } while (1); |
2986 | 2946 | ||
2987 | if (nes_use_lro) | ||
2988 | lro_flush_all(&nesvnic->lro_mgr); | ||
2989 | if (sq_cqes) { | 2947 | if (sq_cqes) { |
2990 | barrier(); | 2948 | barrier(); |
2991 | /* restart the queue if it had been stopped */ | 2949 | /* restart the queue if it had been stopped */ |
diff --git a/drivers/infiniband/hw/nes/nes_hw.h b/drivers/infiniband/hw/nes/nes_hw.h index c9080208aad2..1b66ef1e9937 100644 --- a/drivers/infiniband/hw/nes/nes_hw.h +++ b/drivers/infiniband/hw/nes/nes_hw.h | |||
@@ -33,8 +33,6 @@ | |||
33 | #ifndef __NES_HW_H | 33 | #ifndef __NES_HW_H |
34 | #define __NES_HW_H | 34 | #define __NES_HW_H |
35 | 35 | ||
36 | #include <linux/inet_lro.h> | ||
37 | |||
38 | #define NES_PHY_TYPE_CX4 1 | 36 | #define NES_PHY_TYPE_CX4 1 |
39 | #define NES_PHY_TYPE_1G 2 | 37 | #define NES_PHY_TYPE_1G 2 |
40 | #define NES_PHY_TYPE_ARGUS 4 | 38 | #define NES_PHY_TYPE_ARGUS 4 |
@@ -1049,8 +1047,6 @@ struct nes_hw_tune_timer { | |||
1049 | #define NES_TIMER_ENABLE_LIMIT 4 | 1047 | #define NES_TIMER_ENABLE_LIMIT 4 |
1050 | #define NES_MAX_LINK_INTERRUPTS 128 | 1048 | #define NES_MAX_LINK_INTERRUPTS 128 |
1051 | #define NES_MAX_LINK_CHECK 200 | 1049 | #define NES_MAX_LINK_CHECK 200 |
1052 | #define NES_MAX_LRO_DESCRIPTORS 32 | ||
1053 | #define NES_LRO_MAX_AGGR 64 | ||
1054 | 1050 | ||
1055 | struct nes_adapter { | 1051 | struct nes_adapter { |
1056 | u64 fw_ver; | 1052 | u64 fw_ver; |
@@ -1263,9 +1259,6 @@ struct nes_vnic { | |||
1263 | u8 next_qp_nic_index; | 1259 | u8 next_qp_nic_index; |
1264 | u8 of_device_registered; | 1260 | u8 of_device_registered; |
1265 | u8 rdma_enabled; | 1261 | u8 rdma_enabled; |
1266 | u32 lro_max_aggr; | ||
1267 | struct net_lro_mgr lro_mgr; | ||
1268 | struct net_lro_desc lro_desc[NES_MAX_LRO_DESCRIPTORS]; | ||
1269 | struct timer_list event_timer; | 1262 | struct timer_list event_timer; |
1270 | enum ib_event_type delayed_event; | 1263 | enum ib_event_type delayed_event; |
1271 | enum ib_event_type last_dispatched_event; | 1264 | enum ib_event_type last_dispatched_event; |
diff --git a/drivers/infiniband/hw/nes/nes_nic.c b/drivers/infiniband/hw/nes/nes_nic.c index 6a0bdfa0ce2e..3ea9e055fdd3 100644 --- a/drivers/infiniband/hw/nes/nes_nic.c +++ b/drivers/infiniband/hw/nes/nes_nic.c | |||
@@ -1085,9 +1085,6 @@ static const char nes_ethtool_stringset[][ETH_GSTRING_LEN] = { | |||
1085 | "Free 4Kpbls", | 1085 | "Free 4Kpbls", |
1086 | "Free 256pbls", | 1086 | "Free 256pbls", |
1087 | "Timer Inits", | 1087 | "Timer Inits", |
1088 | "LRO aggregated", | ||
1089 | "LRO flushed", | ||
1090 | "LRO no_desc", | ||
1091 | "PAU CreateQPs", | 1088 | "PAU CreateQPs", |
1092 | "PAU DestroyQPs", | 1089 | "PAU DestroyQPs", |
1093 | }; | 1090 | }; |
@@ -1302,9 +1299,6 @@ static void nes_netdev_get_ethtool_stats(struct net_device *netdev, | |||
1302 | target_stat_values[++index] = nesadapter->free_4kpbl; | 1299 | target_stat_values[++index] = nesadapter->free_4kpbl; |
1303 | target_stat_values[++index] = nesadapter->free_256pbl; | 1300 | target_stat_values[++index] = nesadapter->free_256pbl; |
1304 | target_stat_values[++index] = int_mod_timer_init; | 1301 | target_stat_values[++index] = int_mod_timer_init; |
1305 | target_stat_values[++index] = nesvnic->lro_mgr.stats.aggregated; | ||
1306 | target_stat_values[++index] = nesvnic->lro_mgr.stats.flushed; | ||
1307 | target_stat_values[++index] = nesvnic->lro_mgr.stats.no_desc; | ||
1308 | target_stat_values[++index] = atomic_read(&pau_qps_created); | 1302 | target_stat_values[++index] = atomic_read(&pau_qps_created); |
1309 | target_stat_values[++index] = atomic_read(&pau_qps_destroyed); | 1303 | target_stat_values[++index] = atomic_read(&pau_qps_destroyed); |
1310 | } | 1304 | } |
@@ -1709,7 +1703,6 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev, | |||
1709 | netdev->hw_features |= NETIF_F_TSO; | 1703 | netdev->hw_features |= NETIF_F_TSO; |
1710 | 1704 | ||
1711 | netdev->features = netdev->hw_features | NETIF_F_HIGHDMA | NETIF_F_HW_VLAN_CTAG_TX; | 1705 | netdev->features = netdev->hw_features | NETIF_F_HIGHDMA | NETIF_F_HW_VLAN_CTAG_TX; |
1712 | netdev->hw_features |= NETIF_F_LRO; | ||
1713 | 1706 | ||
1714 | nes_debug(NES_DBG_INIT, "nesvnic = %p, reported features = 0x%lX, QPid = %d," | 1707 | nes_debug(NES_DBG_INIT, "nesvnic = %p, reported features = 0x%lX, QPid = %d," |
1715 | " nic_index = %d, logical_port = %d, mac_index = %d.\n", | 1708 | " nic_index = %d, logical_port = %d, mac_index = %d.\n", |
diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c index 5af19b4cde51..fba69a39a7eb 100644 --- a/drivers/infiniband/hw/nes/nes_verbs.c +++ b/drivers/infiniband/hw/nes/nes_verbs.c | |||
@@ -3769,6 +3769,8 @@ struct nes_ib_device *nes_init_ofa_device(struct net_device *netdev) | |||
3769 | nesibdev->ibdev.iwcm->create_listen = nes_create_listen; | 3769 | nesibdev->ibdev.iwcm->create_listen = nes_create_listen; |
3770 | nesibdev->ibdev.iwcm->destroy_listen = nes_destroy_listen; | 3770 | nesibdev->ibdev.iwcm->destroy_listen = nes_destroy_listen; |
3771 | nesibdev->ibdev.get_port_immutable = nes_port_immutable; | 3771 | nesibdev->ibdev.get_port_immutable = nes_port_immutable; |
3772 | memcpy(nesibdev->ibdev.iwcm->ifname, netdev->name, | ||
3773 | sizeof(nesibdev->ibdev.iwcm->ifname)); | ||
3772 | 3774 | ||
3773 | return nesibdev; | 3775 | return nesibdev; |
3774 | } | 3776 | } |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_msg.h b/drivers/net/ethernet/chelsio/cxgb4/t4_msg.h index a072d341e205..1d2d1da40c80 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/t4_msg.h +++ b/drivers/net/ethernet/chelsio/cxgb4/t4_msg.h | |||
@@ -1021,6 +1021,8 @@ struct cpl_l2t_write_req { | |||
1021 | #define L2T_W_NOREPLY_V(x) ((x) << L2T_W_NOREPLY_S) | 1021 | #define L2T_W_NOREPLY_V(x) ((x) << L2T_W_NOREPLY_S) |
1022 | #define L2T_W_NOREPLY_F L2T_W_NOREPLY_V(1U) | 1022 | #define L2T_W_NOREPLY_F L2T_W_NOREPLY_V(1U) |
1023 | 1023 | ||
1024 | #define CPL_L2T_VLAN_NONE 0xfff | ||
1025 | |||
1024 | struct cpl_l2t_write_rpl { | 1026 | struct cpl_l2t_write_rpl { |
1025 | union opcode_tid ot; | 1027 | union opcode_tid ot; |
1026 | u8 status; | 1028 | u8 status; |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h b/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h index a32de30ea663..c8661c77b4e3 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h +++ b/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h | |||
@@ -561,6 +561,7 @@ enum fw_flowc_mnem { | |||
561 | FW_FLOWC_MNEM_SNDBUF, | 561 | FW_FLOWC_MNEM_SNDBUF, |
562 | FW_FLOWC_MNEM_MSS, | 562 | FW_FLOWC_MNEM_MSS, |
563 | FW_FLOWC_MNEM_TXDATAPLEN_MAX, | 563 | FW_FLOWC_MNEM_TXDATAPLEN_MAX, |
564 | FW_FLOWC_MNEM_SCHEDCLASS = 11, | ||
564 | }; | 565 | }; |
565 | 566 | ||
566 | struct fw_flowc_mnemval { | 567 | struct fw_flowc_mnemval { |
diff --git a/include/rdma/iw_cm.h b/include/rdma/iw_cm.h index 036bd2772662..6d0065c322b7 100644 --- a/include/rdma/iw_cm.h +++ b/include/rdma/iw_cm.h | |||
@@ -83,8 +83,10 @@ struct iw_cm_id { | |||
83 | iw_cm_handler cm_handler; /* client callback function */ | 83 | iw_cm_handler cm_handler; /* client callback function */ |
84 | void *context; /* client cb context */ | 84 | void *context; /* client cb context */ |
85 | struct ib_device *device; | 85 | struct ib_device *device; |
86 | struct sockaddr_storage local_addr; | 86 | struct sockaddr_storage local_addr; /* local addr */ |
87 | struct sockaddr_storage remote_addr; | 87 | struct sockaddr_storage remote_addr; |
88 | struct sockaddr_storage m_local_addr; /* nmapped local addr */ | ||
89 | struct sockaddr_storage m_remote_addr; /* nmapped rem addr */ | ||
88 | void *provider_data; /* provider private data */ | 90 | void *provider_data; /* provider private data */ |
89 | iw_event_handler event_handler; /* cb for provider | 91 | iw_event_handler event_handler; /* cb for provider |
90 | events */ | 92 | events */ |
@@ -92,6 +94,7 @@ struct iw_cm_id { | |||
92 | void (*add_ref)(struct iw_cm_id *); | 94 | void (*add_ref)(struct iw_cm_id *); |
93 | void (*rem_ref)(struct iw_cm_id *); | 95 | void (*rem_ref)(struct iw_cm_id *); |
94 | u8 tos; | 96 | u8 tos; |
97 | bool mapped; | ||
95 | }; | 98 | }; |
96 | 99 | ||
97 | struct iw_cm_conn_param { | 100 | struct iw_cm_conn_param { |
@@ -123,6 +126,7 @@ struct iw_cm_verbs { | |||
123 | int backlog); | 126 | int backlog); |
124 | 127 | ||
125 | int (*destroy_listen)(struct iw_cm_id *cm_id); | 128 | int (*destroy_listen)(struct iw_cm_id *cm_id); |
129 | char ifname[IFNAMSIZ]; | ||
126 | }; | 130 | }; |
127 | 131 | ||
128 | /** | 132 | /** |
diff --git a/include/uapi/rdma/rdma_netlink.h b/include/uapi/rdma/rdma_netlink.h index c19a5dc1531a..f7d7b6fec935 100644 --- a/include/uapi/rdma/rdma_netlink.h +++ b/include/uapi/rdma/rdma_netlink.h | |||
@@ -5,8 +5,8 @@ | |||
5 | 5 | ||
6 | enum { | 6 | enum { |
7 | RDMA_NL_RDMA_CM = 1, | 7 | RDMA_NL_RDMA_CM = 1, |
8 | RDMA_NL_NES, | 8 | RDMA_NL_IWCM, |
9 | RDMA_NL_C4IW, | 9 | RDMA_NL_RSVD, |
10 | RDMA_NL_LS, /* RDMA Local Services */ | 10 | RDMA_NL_LS, /* RDMA Local Services */ |
11 | RDMA_NL_NUM_CLIENTS | 11 | RDMA_NL_NUM_CLIENTS |
12 | }; | 12 | }; |