ib_resolve_smlid_via, in the MAD library, issues a SubnGet(PortInfo) on the
local port to resolve the SM LID and SL.  saqueries do not require the use of
SMP's.

Signed-off-by: Ira Weiny <[email protected]>
---
 src/ibdiag_common.c |   44 ++++++++++++++++++++++++++++++--------------
 1 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/src/ibdiag_common.c b/src/ibdiag_common.c
index 58d3d95..b22ed60 100644
--- a/src/ibdiag_common.c
+++ b/src/ibdiag_common.c
@@ -483,29 +483,46 @@ int is_mlnx_ext_port_info_supported(uint32_t devid)
        return 0;
 }
 
+/** =========================================================================
+ * Resolve the SM portid using the umad layer rather than using
+ * ib_resolve_smlid_via which requires a PortInfo query on the local port.
+ */
+int resolve_sm_portid(char *ca_name, uint8_t portnum, ib_portid_t *sm_id)
+{
+       umad_port_t port;
+       int rc;
+
+       if (!sm_id)
+               return (-1);
+
+       if ((rc = umad_get_port(ca_name, portnum, &port)) < 0)
+               return rc;
+
+       memset(sm_id, 0, sizeof(*sm_id));
+       sm_id->lid = port.sm_lid;
+       sm_id->sl = port.sm_sl;
+
+       umad_release_port(&port);
+
+       return 0;
+}
+
 /* define a common SA query structure
  * This is by no means optimal but it moves the saquery functionality out of
  * the saquery tool and provides it to other utilities.
  */
 bind_handle_t sa_get_bind_handle(void)
 {
-       struct ibmad_port * srcport;
        bind_handle_t handle;
-       int mgmt_classes[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS };
-
-       srcport = mad_rpc_open_port(ibd_ca, ibd_ca_port, mgmt_classes, 2);
-       if (!srcport) {
-               IBWARN("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port);
-               return (NULL);
-       }
-
        handle = calloc(1, sizeof(*handle));
        if (!handle)
                IBPANIC("calloc failed");
 
-       ib_resolve_smlid_via(&handle->dport, ibd_timeout, srcport);
+       resolve_sm_portid(ibd_ca, ibd_ca_port, &handle->dport);
        if (!handle->dport.lid) {
-               IBWARN("No SM found.");
+               IBWARN("No SM/SA found on port %s:%d",
+                       ibd_ca ? "" : ibd_ca,
+                       ibd_ca_port);
                free(handle);
                return (NULL);
        }
@@ -514,8 +531,7 @@ bind_handle_t sa_get_bind_handle(void)
        if (!handle->dport.qkey)
                handle->dport.qkey = IB_DEFAULT_QP1_QKEY;
 
-       handle->srcport = srcport;
-       handle->fd = mad_rpc_portid(srcport);
+       handle->fd = umad_open_port(ibd_ca, ibd_ca_port);
        handle->agent = umad_register(handle->fd, IB_SA_CLASS, 2, 1, NULL);
 
        return handle;
@@ -524,7 +540,7 @@ bind_handle_t sa_get_bind_handle(void)
 void sa_free_bind_handle(bind_handle_t h)
 {
        umad_unregister(h->fd, h->agent);
-       mad_rpc_close_port(h->srcport);
+       umad_close_port(h->fd);
        free(h);
 }
 
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to