aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/core/iwcm.c190
-rw-r--r--drivers/infiniband/core/iwpm_msg.c12
-rw-r--r--drivers/infiniband/core/iwpm_util.c14
-rw-r--r--drivers/infiniband/core/iwpm_util.h2
-rw-r--r--drivers/infiniband/hw/cxgb3/iwch_cm.c16
-rw-r--r--drivers/infiniband/hw/cxgb4/cm.c274
-rw-r--r--drivers/infiniband/hw/cxgb4/device.c72
-rw-r--r--drivers/infiniband/hw/cxgb4/iw_cxgb4.h42
-rw-r--r--drivers/infiniband/hw/cxgb4/mem.c8
-rw-r--r--drivers/infiniband/hw/cxgb4/provider.c3
-rw-r--r--drivers/infiniband/hw/cxgb4/qp.c91
-rw-r--r--drivers/infiniband/hw/nes/Kconfig1
-rw-r--r--drivers/infiniband/hw/nes/nes.c25
-rw-r--r--drivers/infiniband/hw/nes/nes_cm.c361
-rw-r--r--drivers/infiniband/hw/nes/nes_cm.h11
-rw-r--r--drivers/infiniband/hw/nes/nes_hw.c44
-rw-r--r--drivers/infiniband/hw/nes/nes_hw.h7
-rw-r--r--drivers/infiniband/hw/nes/nes_nic.c7
-rw-r--r--drivers/infiniband/hw/nes/nes_verbs.c2
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/t4_msg.h2
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h1
-rw-r--r--include/rdma/iw_cm.h6
-rw-r--r--include/uapi/rdma/rdma_netlink.h4
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");
57MODULE_DESCRIPTION("iWARP CM"); 59MODULE_DESCRIPTION("iWARP CM");
58MODULE_LICENSE("Dual BSD/GPL"); 60MODULE_LICENSE("Dual BSD/GPL");
59 61
62static 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
60static struct workqueue_struct *iwcm_wq; 72static struct workqueue_struct *iwcm_wq;
61struct iwcm_work { 73struct 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}
427EXPORT_SYMBOL(iw_destroy_cm_id); 444EXPORT_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 */
455static 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 */
495static 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;
722err:
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}
620EXPORT_SYMBOL(iw_cm_connect); 728EXPORT_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
1045static int __init iw_cm_init(void) 1170static 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
1068module_init(iw_cm_init); 1206module_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}
400EXPORT_SYMBOL(iwpm_register_pid_cb); 400EXPORT_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}
469EXPORT_SYMBOL(iwpm_add_mapping_cb); 469EXPORT_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}
561EXPORT_SYMBOL(iwpm_add_and_query_mapping_cb); 561EXPORT_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}
755EXPORT_SYMBOL(iwpm_mapping_error_cb); 755EXPORT_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
256int iwpm_get_remote_info(struct sockaddr_storage *mapped_loc_addr, 256int 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)
364int iwpm_wait_complete_req(struct iwpm_nlmsg_request *nlmsg_request) 366int 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:
1877static int is_loopback_dst(struct iw_cm_id *cm_id) 1877static 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 */
574static 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 */
586static 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
594static 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
603static 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
619static void best_mtu(const unsigned short *mtus, unsigned short mtu, 580static 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
1929static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip, 1890static 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,
3072static int pick_local_ip6addrs(struct c4iw_dev *dev, struct iw_cm_id *cm_id) 3022static 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
3424fail3:
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);
3427fail2: 3313fail2:
@@ -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 */
91static 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
101static int count_idrs(int id, void *p, void *data) 90static 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
761enum c4iw_ep_history { 760enum 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
848static 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
887static inline struct c4iw_ep *to_ep(struct iw_cm_id *cm_id) 845static 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
608static int build_memreg(struct t4_sq *sq, union t4_wr *wqe, 608static 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;
1799err8: 1800err8:
1800 kfree(mm5); 1801 kfree(ma_sync_key_mm);
1801err7: 1802err7:
1802 kfree(mm4); 1803 kfree(rq_db_key_mm);
1803err6: 1804err6:
1804 kfree(mm3); 1805 kfree(sq_db_key_mm);
1805err5: 1806err5:
1806 kfree(mm2); 1807 kfree(rq_key_mm);
1807err4: 1808err4:
1808 kfree(mm1); 1809 kfree(sq_key_mm);
1809err3: 1810err3:
1810 remove_handle(rhp, &rhp->qpidr, qhp->wq.sq.qid); 1811 remove_handle(rhp, &rhp->qpidr, qhp->wq.sq.qid);
1811err2: 1812err2:
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
112MODULE_DEVICE_TABLE(pci, nes_pci_table); 112MODULE_DEVICE_TABLE(pci, nes_pci_table);
113 113
114/* registered nes netlink callbacks */
115static 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
125static int nes_inetaddr_event(struct notifier_block *, unsigned long, void *); 114static int nes_inetaddr_event(struct notifier_block *, unsigned long, void *);
126static int nes_net_event(struct notifier_block *, unsigned long, void *); 115static int nes_net_event(struct notifier_block *, unsigned long, void *);
127static int nes_notifiers_registered; 116static 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 */
531static 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 */
543static 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 */
562static 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 */
579static 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 */
591static 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
599static 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 */
613static 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 */
626static 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 */
1289static struct nes_cm_listener *find_listener(struct nes_cm_core *cm_core, 1169static 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
2707out_free_wq:
2708 destroy_workqueue(cm_core->event_wq);
2709out_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 */
310struct nes_cm_node { 310struct 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
46static unsigned int nes_lro_max_aggr = NES_LRO_MAX_AGGR;
47module_param(nes_lro_max_aggr, uint, 0444);
48MODULE_PARM_DESC(nes_lro_max_aggr, "NIC LRO max packet aggregation");
49
50static int wide_ppm_offset; 43static int wide_ppm_offset;
51module_param(wide_ppm_offset, int, 0644); 44module_param(wide_ppm_offset, int, 0644);
52MODULE_PARM_DESC(wide_ppm_offset, "Increase CX4 interface clock ppm offset, 0=100ppm (default), 1=300ppm"); 45MODULE_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
1645static 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
2958skip_rx_indicate0: 2918skip_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
1055struct nes_adapter { 1051struct 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
1024struct cpl_l2t_write_rpl { 1026struct 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
566struct fw_flowc_mnemval { 567struct 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
97struct iw_cm_conn_param { 100struct 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
6enum { 6enum {
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};