summaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
diff options
context:
space:
mode:
authorIra Weiny <ira.weiny@intel.com>2014-08-08 19:00:55 -0400
committerRoland Dreier <roland@purestorage.com>2014-08-10 23:36:00 -0400
commit0f29b46d49b0ca50536632c6a33986c3171f5ea1 (patch)
tree8ce3551b9fd88c7706f68e0e26b915892e204154 /drivers/infiniband
parent9ad13a423484725324fb2c5c5ab527d6bf9d84cc (diff)
IB/mad: add new ioctl to ABI to support new registration options
Registrations options are specified through flags. Definitions of flags will be in subsequent patches. Signed-off-by: Ira Weiny <ira.weiny@intel.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/core/agent.c4
-rw-r--r--drivers/infiniband/core/cm.c5
-rw-r--r--drivers/infiniband/core/mad.c4
-rw-r--r--drivers/infiniband/core/sa_query.c2
-rw-r--r--drivers/infiniband/core/user_mad.c120
-rw-r--r--drivers/infiniband/hw/mlx4/mad.c2
-rw-r--r--drivers/infiniband/hw/mthca/mthca_mad.c2
-rw-r--r--drivers/infiniband/hw/qib/qib_mad.c2
-rw-r--r--drivers/infiniband/ulp/srpt/ib_srpt.c2
9 files changed, 132 insertions, 11 deletions
diff --git a/drivers/infiniband/core/agent.c b/drivers/infiniband/core/agent.c
index 8e32c5abd09d..f6d29614cb01 100644
--- a/drivers/infiniband/core/agent.c
+++ b/drivers/infiniband/core/agent.c
@@ -161,7 +161,7 @@ int ib_agent_port_open(struct ib_device *device, int port_num)
161 port_priv->agent[0] = ib_register_mad_agent(device, port_num, 161 port_priv->agent[0] = ib_register_mad_agent(device, port_num,
162 IB_QPT_SMI, NULL, 0, 162 IB_QPT_SMI, NULL, 0,
163 &agent_send_handler, 163 &agent_send_handler,
164 NULL, NULL); 164 NULL, NULL, 0);
165 if (IS_ERR(port_priv->agent[0])) { 165 if (IS_ERR(port_priv->agent[0])) {
166 ret = PTR_ERR(port_priv->agent[0]); 166 ret = PTR_ERR(port_priv->agent[0]);
167 goto error2; 167 goto error2;
@@ -172,7 +172,7 @@ int ib_agent_port_open(struct ib_device *device, int port_num)
172 port_priv->agent[1] = ib_register_mad_agent(device, port_num, 172 port_priv->agent[1] = ib_register_mad_agent(device, port_num,
173 IB_QPT_GSI, NULL, 0, 173 IB_QPT_GSI, NULL, 0,
174 &agent_send_handler, 174 &agent_send_handler,
175 NULL, NULL); 175 NULL, NULL, 0);
176 if (IS_ERR(port_priv->agent[1])) { 176 if (IS_ERR(port_priv->agent[1])) {
177 ret = PTR_ERR(port_priv->agent[1]); 177 ret = PTR_ERR(port_priv->agent[1]);
178 goto error3; 178 goto error3;
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index c3239170d8b7..e28a494e2a3a 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -3753,7 +3753,7 @@ static void cm_add_one(struct ib_device *ib_device)
3753 struct cm_port *port; 3753 struct cm_port *port;
3754 struct ib_mad_reg_req reg_req = { 3754 struct ib_mad_reg_req reg_req = {
3755 .mgmt_class = IB_MGMT_CLASS_CM, 3755 .mgmt_class = IB_MGMT_CLASS_CM,
3756 .mgmt_class_version = IB_CM_CLASS_VERSION 3756 .mgmt_class_version = IB_CM_CLASS_VERSION,
3757 }; 3757 };
3758 struct ib_port_modify port_modify = { 3758 struct ib_port_modify port_modify = {
3759 .set_port_cap_mask = IB_PORT_CM_SUP 3759 .set_port_cap_mask = IB_PORT_CM_SUP
@@ -3801,7 +3801,8 @@ static void cm_add_one(struct ib_device *ib_device)
3801 0, 3801 0,
3802 cm_send_handler, 3802 cm_send_handler,
3803 cm_recv_handler, 3803 cm_recv_handler,
3804 port); 3804 port,
3805 0);
3805 if (IS_ERR(port->mad_agent)) 3806 if (IS_ERR(port->mad_agent))
3806 goto error2; 3807 goto error2;
3807 3808
diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
index f46995d4f54b..988bbda67952 100644
--- a/drivers/infiniband/core/mad.c
+++ b/drivers/infiniband/core/mad.c
@@ -198,7 +198,8 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
198 u8 rmpp_version, 198 u8 rmpp_version,
199 ib_mad_send_handler send_handler, 199 ib_mad_send_handler send_handler,
200 ib_mad_recv_handler recv_handler, 200 ib_mad_recv_handler recv_handler,
201 void *context) 201 void *context,
202 u32 registration_flags)
202{ 203{
203 struct ib_mad_port_private *port_priv; 204 struct ib_mad_port_private *port_priv;
204 struct ib_mad_agent *ret = ERR_PTR(-EINVAL); 205 struct ib_mad_agent *ret = ERR_PTR(-EINVAL);
@@ -359,6 +360,7 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
359 mad_agent_priv->agent.context = context; 360 mad_agent_priv->agent.context = context;
360 mad_agent_priv->agent.qp = port_priv->qp_info[qpn].qp; 361 mad_agent_priv->agent.qp = port_priv->qp_info[qpn].qp;
361 mad_agent_priv->agent.port_num = port_num; 362 mad_agent_priv->agent.port_num = port_num;
363 mad_agent_priv->agent.flags = registration_flags;
362 spin_lock_init(&mad_agent_priv->lock); 364 spin_lock_init(&mad_agent_priv->lock);
363 INIT_LIST_HEAD(&mad_agent_priv->send_list); 365 INIT_LIST_HEAD(&mad_agent_priv->send_list);
364 INIT_LIST_HEAD(&mad_agent_priv->wait_list); 366 INIT_LIST_HEAD(&mad_agent_priv->wait_list);
diff --git a/drivers/infiniband/core/sa_query.c b/drivers/infiniband/core/sa_query.c
index 233eaf541f55..c38f030f0dc9 100644
--- a/drivers/infiniband/core/sa_query.c
+++ b/drivers/infiniband/core/sa_query.c
@@ -1184,7 +1184,7 @@ static void ib_sa_add_one(struct ib_device *device)
1184 sa_dev->port[i].agent = 1184 sa_dev->port[i].agent =
1185 ib_register_mad_agent(device, i + s, IB_QPT_GSI, 1185 ib_register_mad_agent(device, i + s, IB_QPT_GSI,
1186 NULL, 0, send_handler, 1186 NULL, 0, send_handler,
1187 recv_handler, sa_dev); 1187 recv_handler, sa_dev, 0);
1188 if (IS_ERR(sa_dev->port[i].agent)) 1188 if (IS_ERR(sa_dev->port[i].agent))
1189 goto err; 1189 goto err;
1190 1190
diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c
index ea90a3ebb9c2..11af1c61c135 100644
--- a/drivers/infiniband/core/user_mad.c
+++ b/drivers/infiniband/core/user_mad.c
@@ -647,6 +647,7 @@ static int ib_umad_reg_agent(struct ib_umad_file *file, void __user *arg,
647 647
648found: 648found:
649 if (ureq.mgmt_class) { 649 if (ureq.mgmt_class) {
650 memset(&req, 0, sizeof(req));
650 req.mgmt_class = ureq.mgmt_class; 651 req.mgmt_class = ureq.mgmt_class;
651 req.mgmt_class_version = ureq.mgmt_class_version; 652 req.mgmt_class_version = ureq.mgmt_class_version;
652 memcpy(req.oui, ureq.oui, sizeof req.oui); 653 memcpy(req.oui, ureq.oui, sizeof req.oui);
@@ -667,7 +668,7 @@ found:
667 ureq.qpn ? IB_QPT_GSI : IB_QPT_SMI, 668 ureq.qpn ? IB_QPT_GSI : IB_QPT_SMI,
668 ureq.mgmt_class ? &req : NULL, 669 ureq.mgmt_class ? &req : NULL,
669 ureq.rmpp_version, 670 ureq.rmpp_version,
670 send_handler, recv_handler, file); 671 send_handler, recv_handler, file, 0);
671 if (IS_ERR(agent)) { 672 if (IS_ERR(agent)) {
672 ret = PTR_ERR(agent); 673 ret = PTR_ERR(agent);
673 agent = NULL; 674 agent = NULL;
@@ -705,6 +706,119 @@ out:
705 return ret; 706 return ret;
706} 707}
707 708
709static int ib_umad_reg_agent2(struct ib_umad_file *file, void __user *arg)
710{
711 struct ib_user_mad_reg_req2 ureq;
712 struct ib_mad_reg_req req;
713 struct ib_mad_agent *agent = NULL;
714 int agent_id;
715 int ret;
716
717 mutex_lock(&file->port->file_mutex);
718 mutex_lock(&file->mutex);
719
720 if (!file->port->ib_dev) {
721 dev_notice(file->port->dev,
722 "ib_umad_reg_agent2: invalid device\n");
723 ret = -EPIPE;
724 goto out;
725 }
726
727 if (copy_from_user(&ureq, arg, sizeof(ureq))) {
728 ret = -EFAULT;
729 goto out;
730 }
731
732 if (ureq.qpn != 0 && ureq.qpn != 1) {
733 dev_notice(file->port->dev,
734 "ib_umad_reg_agent2: invalid QPN %d specified\n",
735 ureq.qpn);
736 ret = -EINVAL;
737 goto out;
738 }
739
740 if (ureq.flags & ~IB_USER_MAD_REG_FLAGS_CAP) {
741 dev_notice(file->port->dev,
742 "ib_umad_reg_agent2 failed: invalid registration flags specified 0x%x; supported 0x%x\n",
743 ureq.flags, IB_USER_MAD_REG_FLAGS_CAP);
744 ret = -EINVAL;
745
746 if (put_user((u32)IB_USER_MAD_REG_FLAGS_CAP,
747 (u32 __user *) (arg + offsetof(struct
748 ib_user_mad_reg_req2, flags))))
749 ret = -EFAULT;
750
751 goto out;
752 }
753
754 for (agent_id = 0; agent_id < IB_UMAD_MAX_AGENTS; ++agent_id)
755 if (!__get_agent(file, agent_id))
756 goto found;
757
758 dev_notice(file->port->dev,
759 "ib_umad_reg_agent2: Max Agents (%u) reached\n",
760 IB_UMAD_MAX_AGENTS);
761 ret = -ENOMEM;
762 goto out;
763
764found:
765 if (ureq.mgmt_class) {
766 memset(&req, 0, sizeof(req));
767 req.mgmt_class = ureq.mgmt_class;
768 req.mgmt_class_version = ureq.mgmt_class_version;
769 if (ureq.oui & 0xff000000) {
770 dev_notice(file->port->dev,
771 "ib_umad_reg_agent2 failed: oui invalid 0x%08x\n",
772 ureq.oui);
773 ret = -EINVAL;
774 goto out;
775 }
776 req.oui[2] = ureq.oui & 0x0000ff;
777 req.oui[1] = (ureq.oui & 0x00ff00) >> 8;
778 req.oui[0] = (ureq.oui & 0xff0000) >> 16;
779 memcpy(req.method_mask, ureq.method_mask,
780 sizeof(req.method_mask));
781 }
782
783 agent = ib_register_mad_agent(file->port->ib_dev, file->port->port_num,
784 ureq.qpn ? IB_QPT_GSI : IB_QPT_SMI,
785 ureq.mgmt_class ? &req : NULL,
786 ureq.rmpp_version,
787 send_handler, recv_handler, file,
788 ureq.flags);
789 if (IS_ERR(agent)) {
790 ret = PTR_ERR(agent);
791 agent = NULL;
792 goto out;
793 }
794
795 if (put_user(agent_id,
796 (u32 __user *)(arg +
797 offsetof(struct ib_user_mad_reg_req2, id)))) {
798 ret = -EFAULT;
799 goto out;
800 }
801
802 if (!file->already_used) {
803 file->already_used = 1;
804 file->use_pkey_index = 1;
805 }
806
807 file->agent[agent_id] = agent;
808 ret = 0;
809
810out:
811 mutex_unlock(&file->mutex);
812
813 if (ret && agent)
814 ib_unregister_mad_agent(agent);
815
816 mutex_unlock(&file->port->file_mutex);
817
818 return ret;
819}
820
821
708static int ib_umad_unreg_agent(struct ib_umad_file *file, u32 __user *arg) 822static int ib_umad_unreg_agent(struct ib_umad_file *file, u32 __user *arg)
709{ 823{
710 struct ib_mad_agent *agent = NULL; 824 struct ib_mad_agent *agent = NULL;
@@ -760,6 +874,8 @@ static long ib_umad_ioctl(struct file *filp, unsigned int cmd,
760 return ib_umad_unreg_agent(filp->private_data, (__u32 __user *) arg); 874 return ib_umad_unreg_agent(filp->private_data, (__u32 __user *) arg);
761 case IB_USER_MAD_ENABLE_PKEY: 875 case IB_USER_MAD_ENABLE_PKEY:
762 return ib_umad_enable_pkey(filp->private_data); 876 return ib_umad_enable_pkey(filp->private_data);
877 case IB_USER_MAD_REGISTER_AGENT2:
878 return ib_umad_reg_agent2(filp->private_data, (void __user *) arg);
763 default: 879 default:
764 return -ENOIOCTLCMD; 880 return -ENOIOCTLCMD;
765 } 881 }
@@ -776,6 +892,8 @@ static long ib_umad_compat_ioctl(struct file *filp, unsigned int cmd,
776 return ib_umad_unreg_agent(filp->private_data, compat_ptr(arg)); 892 return ib_umad_unreg_agent(filp->private_data, compat_ptr(arg));
777 case IB_USER_MAD_ENABLE_PKEY: 893 case IB_USER_MAD_ENABLE_PKEY:
778 return ib_umad_enable_pkey(filp->private_data); 894 return ib_umad_enable_pkey(filp->private_data);
895 case IB_USER_MAD_REGISTER_AGENT2:
896 return ib_umad_reg_agent2(filp->private_data, compat_ptr(arg));
779 default: 897 default:
780 return -ENOIOCTLCMD; 898 return -ENOIOCTLCMD;
781 } 899 }
diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c
index 287ad0564acd..82a7dd87089b 100644
--- a/drivers/infiniband/hw/mlx4/mad.c
+++ b/drivers/infiniband/hw/mlx4/mad.c
@@ -891,7 +891,7 @@ int mlx4_ib_mad_init(struct mlx4_ib_dev *dev)
891 agent = ib_register_mad_agent(&dev->ib_dev, p + 1, 891 agent = ib_register_mad_agent(&dev->ib_dev, p + 1,
892 q ? IB_QPT_GSI : IB_QPT_SMI, 892 q ? IB_QPT_GSI : IB_QPT_SMI,
893 NULL, 0, send_handler, 893 NULL, 0, send_handler,
894 NULL, NULL); 894 NULL, NULL, 0);
895 if (IS_ERR(agent)) { 895 if (IS_ERR(agent)) {
896 ret = PTR_ERR(agent); 896 ret = PTR_ERR(agent);
897 goto err; 897 goto err;
diff --git a/drivers/infiniband/hw/mthca/mthca_mad.c b/drivers/infiniband/hw/mthca/mthca_mad.c
index b6f7f457fc55..8881fa376e06 100644
--- a/drivers/infiniband/hw/mthca/mthca_mad.c
+++ b/drivers/infiniband/hw/mthca/mthca_mad.c
@@ -294,7 +294,7 @@ int mthca_create_agents(struct mthca_dev *dev)
294 agent = ib_register_mad_agent(&dev->ib_dev, p + 1, 294 agent = ib_register_mad_agent(&dev->ib_dev, p + 1,
295 q ? IB_QPT_GSI : IB_QPT_SMI, 295 q ? IB_QPT_GSI : IB_QPT_SMI,
296 NULL, 0, send_handler, 296 NULL, 0, send_handler,
297 NULL, NULL); 297 NULL, NULL, 0);
298 if (IS_ERR(agent)) { 298 if (IS_ERR(agent)) {
299 ret = PTR_ERR(agent); 299 ret = PTR_ERR(agent);
300 goto err; 300 goto err;
diff --git a/drivers/infiniband/hw/qib/qib_mad.c b/drivers/infiniband/hw/qib/qib_mad.c
index 22c720e5740d..636be117b578 100644
--- a/drivers/infiniband/hw/qib/qib_mad.c
+++ b/drivers/infiniband/hw/qib/qib_mad.c
@@ -2476,7 +2476,7 @@ int qib_create_agents(struct qib_ibdev *dev)
2476 ibp = &dd->pport[p].ibport_data; 2476 ibp = &dd->pport[p].ibport_data;
2477 agent = ib_register_mad_agent(&dev->ibdev, p + 1, IB_QPT_SMI, 2477 agent = ib_register_mad_agent(&dev->ibdev, p + 1, IB_QPT_SMI,
2478 NULL, 0, send_handler, 2478 NULL, 0, send_handler,
2479 NULL, NULL); 2479 NULL, NULL, 0);
2480 if (IS_ERR(agent)) { 2480 if (IS_ERR(agent)) {
2481 ret = PTR_ERR(agent); 2481 ret = PTR_ERR(agent);
2482 goto err; 2482 goto err;
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c
index fe09f2788b15..8a8311e35cbd 100644
--- a/drivers/infiniband/ulp/srpt/ib_srpt.c
+++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
@@ -563,7 +563,7 @@ static int srpt_refresh_port(struct srpt_port *sport)
563 &reg_req, 0, 563 &reg_req, 0,
564 srpt_mad_send_handler, 564 srpt_mad_send_handler,
565 srpt_mad_recv_handler, 565 srpt_mad_recv_handler,
566 sport); 566 sport, 0);
567 if (IS_ERR(sport->mad_agent)) { 567 if (IS_ERR(sport->mad_agent)) {
568 ret = PTR_ERR(sport->mad_agent); 568 ret = PTR_ERR(sport->mad_agent);
569 sport->mad_agent = NULL; 569 sport->mad_agent = NULL;