Following patch sets the CM supported bit on port info records.

signed-off-by: Sean Hefty <[EMAIL PROTECTED]>

Index: core/cm.c
===================================================================
--- core/cm.c   (revision 1570)
+++ core/cm.c   (working copy)
@@ -2295,9 +2295,16 @@
 static void cm_add_one(struct ib_device *device)
 {
        struct cm_port *port_array, *port;
-       struct ib_mad_reg_req reg_req;
+       struct ib_mad_reg_req reg_req = {
+               .mgmt_class = IB_MGMT_CLASS_CM,
+               .mgmt_class_version = 1
+       };
+       struct ib_port_modify port_modify = {
+               .set_port_cap_mask = IB_PORT_CM_SUP
+       };
        u64 ca_guid;
        u8 i;
+       int ret;
 
        ca_guid = cm_get_ca_guid(device);
        if (!ca_guid)
@@ -2307,15 +2314,12 @@
        if (!port_array)
                return;
 
-       /* todo: (high priority) set CM bit in port info */
-       memset(&reg_req, 0, sizeof reg_req);
-       reg_req.mgmt_class = IB_MGMT_CLASS_CM;
-       reg_req.mgmt_class_version = 1;
        set_bit(IB_MGMT_METHOD_SEND, reg_req.method_mask);
        for (i = 1, port = port_array; i <= device->phys_port_cnt; i++, port++){
                spin_lock_init(&port->lock);
                port->ca_guid = ca_guid;
                port->port_num = i;
+
                port->mad_agent = ib_register_mad_agent(device, i,
                                                        IB_QPT_GSI,
                                                        &reg_req,
@@ -2324,21 +2328,30 @@
                                                        cm_recv_handler,
                                                        port);
                if (IS_ERR(port->mad_agent))
-                       goto error;
+                       goto error1;
 
                port->mr = ib_get_dma_mr(port->mad_agent->qp->pd,
                                         IB_ACCESS_LOCAL_WRITE);
-               if (IS_ERR(port->mr)) {
-                       ib_unregister_mad_agent(port->mad_agent);
-                       goto error;
-               }
+               if (IS_ERR(port->mr))
+                       goto error2;
+
+               ret = ib_modify_port(device, i, 0, &port_modify);
+               if (ret)
+                       goto error3;
        }
        ib_set_client_data(device, &cm_client, port_array);
        return;
 
-error:
+error3:
+       ib_dereg_mr(port->mr);
+error2:
+       ib_unregister_mad_agent(port->mad_agent);
+error1:
+       port_modify.set_port_cap_mask = 0;
+       port_modify.clr_port_cap_mask = IB_PORT_CM_SUP;
        while (port != port_array) {
                --port;
+               ib_modify_port(device, port->port_num, 0, &port_modify);
                ib_dereg_mr(port->mr);
                ib_unregister_mad_agent(port->mad_agent);
        }
@@ -2348,6 +2361,9 @@
 static void cm_remove_one(struct ib_device *device)
 {
        struct cm_port *port_array, *port;
+       struct ib_port_modify port_modify = {
+               .clr_port_cap_mask = IB_PORT_CM_SUP
+       };
        int i;
 
        port_array = (struct cm_port *)ib_get_client_data(device, &cm_client);
@@ -2355,6 +2371,7 @@
                return;
 
        for (i = 1, port = port_array; i <= device->phys_port_cnt; i++, port++){
+               ib_modify_port(device, port->port_num, 0, &port_modify);
                ib_dereg_mr(port->mr);
                ib_unregister_mad_agent(port->mad_agent);
        }
_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to