1d6b92ffaSHans Petter Selasky /*
2d6b92ffaSHans Petter Selasky * Copyright (c) 2004-2009 Voltaire Inc. All rights reserved.
3d6b92ffaSHans Petter Selasky * Copyright (c) 2011 Mellanox Technologies LTD. All rights reserved.
4d6b92ffaSHans Petter Selasky *
5d6b92ffaSHans Petter Selasky * This software is available to you under a choice of one of two
6d6b92ffaSHans Petter Selasky * licenses. You may choose to be licensed under the terms of the GNU
7d6b92ffaSHans Petter Selasky * General Public License (GPL) Version 2, available from the file
8d6b92ffaSHans Petter Selasky * COPYING in the main directory of this source tree, or the
9d6b92ffaSHans Petter Selasky * OpenIB.org BSD license below:
10d6b92ffaSHans Petter Selasky *
11d6b92ffaSHans Petter Selasky * Redistribution and use in source and binary forms, with or
12d6b92ffaSHans Petter Selasky * without modification, are permitted provided that the following
13d6b92ffaSHans Petter Selasky * conditions are met:
14d6b92ffaSHans Petter Selasky *
15d6b92ffaSHans Petter Selasky * - Redistributions of source code must retain the above
16d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following
17d6b92ffaSHans Petter Selasky * disclaimer.
18d6b92ffaSHans Petter Selasky *
19d6b92ffaSHans Petter Selasky * - Redistributions in binary form must reproduce the above
20d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following
21d6b92ffaSHans Petter Selasky * disclaimer in the documentation and/or other materials
22d6b92ffaSHans Petter Selasky * provided with the distribution.
23d6b92ffaSHans Petter Selasky *
24d6b92ffaSHans Petter Selasky * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25d6b92ffaSHans Petter Selasky * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26d6b92ffaSHans Petter Selasky * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27d6b92ffaSHans Petter Selasky * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28d6b92ffaSHans Petter Selasky * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29d6b92ffaSHans Petter Selasky * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30d6b92ffaSHans Petter Selasky * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31d6b92ffaSHans Petter Selasky * SOFTWARE.
32d6b92ffaSHans Petter Selasky *
33d6b92ffaSHans Petter Selasky */
34d6b92ffaSHans Petter Selasky
35d6b92ffaSHans Petter Selasky #if HAVE_CONFIG_H
36d6b92ffaSHans Petter Selasky # include <config.h>
37d6b92ffaSHans Petter Selasky #endif /* HAVE_CONFIG_H */
38d6b92ffaSHans Petter Selasky
39d6b92ffaSHans Petter Selasky #include <stdio.h>
40d6b92ffaSHans Petter Selasky #include <stdlib.h>
41d6b92ffaSHans Petter Selasky #include <string.h>
42d6b92ffaSHans Petter Selasky
43d6b92ffaSHans Petter Selasky #include <infiniband/umad.h>
44d6b92ffaSHans Petter Selasky #include <infiniband/mad.h>
45d6b92ffaSHans Petter Selasky #include "mad_internal.h"
46d6b92ffaSHans Petter Selasky
47d6b92ffaSHans Petter Selasky #undef DEBUG
48d6b92ffaSHans Petter Selasky #define DEBUG if (ibdebug) IBWARN
49d6b92ffaSHans Petter Selasky
smp_mkey_set(struct ibmad_port * srcport,uint64_t mkey)50d6b92ffaSHans Petter Selasky void smp_mkey_set(struct ibmad_port *srcport, uint64_t mkey)
51d6b92ffaSHans Petter Selasky {
52d6b92ffaSHans Petter Selasky srcport->smp_mkey = mkey;
53d6b92ffaSHans Petter Selasky }
54d6b92ffaSHans Petter Selasky
smp_mkey_get(const struct ibmad_port * srcport)55d6b92ffaSHans Petter Selasky uint64_t smp_mkey_get(const struct ibmad_port *srcport)
56d6b92ffaSHans Petter Selasky {
57d6b92ffaSHans Petter Selasky return srcport->smp_mkey;
58d6b92ffaSHans Petter Selasky }
59d6b92ffaSHans Petter Selasky
smp_set_status_via(void * data,ib_portid_t * portid,unsigned attrid,unsigned mod,unsigned timeout,int * rstatus,const struct ibmad_port * srcport)60d6b92ffaSHans Petter Selasky uint8_t *smp_set_status_via(void *data, ib_portid_t * portid, unsigned attrid,
61d6b92ffaSHans Petter Selasky unsigned mod, unsigned timeout, int *rstatus,
62d6b92ffaSHans Petter Selasky const struct ibmad_port *srcport)
63d6b92ffaSHans Petter Selasky {
64d6b92ffaSHans Petter Selasky ib_rpc_t rpc = { 0 };
65d6b92ffaSHans Petter Selasky uint8_t *res;
66d6b92ffaSHans Petter Selasky
67d6b92ffaSHans Petter Selasky DEBUG("attr 0x%x mod 0x%x route %s", attrid, mod, portid2str(portid));
68d6b92ffaSHans Petter Selasky if ((portid->lid <= 0) ||
69d6b92ffaSHans Petter Selasky (portid->drpath.drslid == 0xffff) ||
70d6b92ffaSHans Petter Selasky (portid->drpath.drdlid == 0xffff))
71d6b92ffaSHans Petter Selasky rpc.mgtclass = IB_SMI_DIRECT_CLASS; /* direct SMI */
72d6b92ffaSHans Petter Selasky else
73d6b92ffaSHans Petter Selasky rpc.mgtclass = IB_SMI_CLASS; /* Lid routed SMI */
74d6b92ffaSHans Petter Selasky
75d6b92ffaSHans Petter Selasky rpc.method = IB_MAD_METHOD_SET;
76d6b92ffaSHans Petter Selasky rpc.attr.id = attrid;
77d6b92ffaSHans Petter Selasky rpc.attr.mod = mod;
78d6b92ffaSHans Petter Selasky rpc.timeout = timeout;
79d6b92ffaSHans Petter Selasky rpc.datasz = IB_SMP_DATA_SIZE;
80d6b92ffaSHans Petter Selasky rpc.dataoffs = IB_SMP_DATA_OFFS;
81d6b92ffaSHans Petter Selasky rpc.mkey = srcport->smp_mkey;
82d6b92ffaSHans Petter Selasky
83d6b92ffaSHans Petter Selasky portid->sl = 0;
84d6b92ffaSHans Petter Selasky portid->qp = 0;
85d6b92ffaSHans Petter Selasky
86d6b92ffaSHans Petter Selasky res = mad_rpc(srcport, &rpc, portid, data, data);
87d6b92ffaSHans Petter Selasky if (rstatus)
88d6b92ffaSHans Petter Selasky *rstatus = rpc.rstatus;
89d6b92ffaSHans Petter Selasky return res;
90d6b92ffaSHans Petter Selasky }
91d6b92ffaSHans Petter Selasky
smp_set_via(void * data,ib_portid_t * portid,unsigned attrid,unsigned mod,unsigned timeout,const struct ibmad_port * srcport)92d6b92ffaSHans Petter Selasky uint8_t *smp_set_via(void *data, ib_portid_t * portid, unsigned attrid,
93d6b92ffaSHans Petter Selasky unsigned mod, unsigned timeout,
94d6b92ffaSHans Petter Selasky const struct ibmad_port *srcport)
95d6b92ffaSHans Petter Selasky {
96d6b92ffaSHans Petter Selasky return smp_set_status_via(data, portid, attrid, mod, timeout, NULL,
97d6b92ffaSHans Petter Selasky srcport);
98d6b92ffaSHans Petter Selasky }
99d6b92ffaSHans Petter Selasky
smp_set(void * data,ib_portid_t * portid,unsigned attrid,unsigned mod,unsigned timeout)100d6b92ffaSHans Petter Selasky uint8_t *smp_set(void *data, ib_portid_t * portid, unsigned attrid,
101d6b92ffaSHans Petter Selasky unsigned mod, unsigned timeout)
102d6b92ffaSHans Petter Selasky {
103d6b92ffaSHans Petter Selasky return smp_set_via(data, portid, attrid, mod, timeout, ibmp);
104d6b92ffaSHans Petter Selasky }
105d6b92ffaSHans Petter Selasky
smp_query_status_via(void * rcvbuf,ib_portid_t * portid,unsigned attrid,unsigned mod,unsigned timeout,int * rstatus,const struct ibmad_port * srcport)106d6b92ffaSHans Petter Selasky uint8_t *smp_query_status_via(void *rcvbuf, ib_portid_t * portid,
107d6b92ffaSHans Petter Selasky unsigned attrid, unsigned mod, unsigned timeout,
108d6b92ffaSHans Petter Selasky int *rstatus, const struct ibmad_port * srcport)
109d6b92ffaSHans Petter Selasky {
110d6b92ffaSHans Petter Selasky ib_rpc_t rpc = { 0 };
111d6b92ffaSHans Petter Selasky uint8_t *res;
112d6b92ffaSHans Petter Selasky
113d6b92ffaSHans Petter Selasky DEBUG("attr 0x%x mod 0x%x route %s", attrid, mod, portid2str(portid));
114d6b92ffaSHans Petter Selasky rpc.method = IB_MAD_METHOD_GET;
115d6b92ffaSHans Petter Selasky rpc.attr.id = attrid;
116d6b92ffaSHans Petter Selasky rpc.attr.mod = mod;
117d6b92ffaSHans Petter Selasky rpc.timeout = timeout;
118d6b92ffaSHans Petter Selasky rpc.datasz = IB_SMP_DATA_SIZE;
119d6b92ffaSHans Petter Selasky rpc.dataoffs = IB_SMP_DATA_OFFS;
120d6b92ffaSHans Petter Selasky rpc.mkey = srcport->smp_mkey;
121d6b92ffaSHans Petter Selasky
122d6b92ffaSHans Petter Selasky if ((portid->lid <= 0) ||
123d6b92ffaSHans Petter Selasky (portid->drpath.drslid == 0xffff) ||
124d6b92ffaSHans Petter Selasky (portid->drpath.drdlid == 0xffff))
125d6b92ffaSHans Petter Selasky rpc.mgtclass = IB_SMI_DIRECT_CLASS; /* direct SMI */
126d6b92ffaSHans Petter Selasky else
127d6b92ffaSHans Petter Selasky rpc.mgtclass = IB_SMI_CLASS; /* Lid routed SMI */
128d6b92ffaSHans Petter Selasky
129d6b92ffaSHans Petter Selasky portid->sl = 0;
130d6b92ffaSHans Petter Selasky portid->qp = 0;
131d6b92ffaSHans Petter Selasky
132d6b92ffaSHans Petter Selasky res = mad_rpc(srcport, &rpc, portid, rcvbuf, rcvbuf);
133d6b92ffaSHans Petter Selasky if (rstatus)
134d6b92ffaSHans Petter Selasky *rstatus = rpc.rstatus;
135d6b92ffaSHans Petter Selasky return res;
136d6b92ffaSHans Petter Selasky }
137d6b92ffaSHans Petter Selasky
smp_query_via(void * rcvbuf,ib_portid_t * portid,unsigned attrid,unsigned mod,unsigned timeout,const struct ibmad_port * srcport)138d6b92ffaSHans Petter Selasky uint8_t *smp_query_via(void *rcvbuf, ib_portid_t * portid, unsigned attrid,
139d6b92ffaSHans Petter Selasky unsigned mod, unsigned timeout,
140d6b92ffaSHans Petter Selasky const struct ibmad_port * srcport)
141d6b92ffaSHans Petter Selasky {
142d6b92ffaSHans Petter Selasky return smp_query_status_via(rcvbuf, portid, attrid, mod, timeout, NULL,
143d6b92ffaSHans Petter Selasky srcport);
144d6b92ffaSHans Petter Selasky }
145d6b92ffaSHans Petter Selasky
smp_query(void * rcvbuf,ib_portid_t * portid,unsigned attrid,unsigned mod,unsigned timeout)146d6b92ffaSHans Petter Selasky uint8_t *smp_query(void *rcvbuf, ib_portid_t * portid, unsigned attrid,
147d6b92ffaSHans Petter Selasky unsigned mod, unsigned timeout)
148d6b92ffaSHans Petter Selasky {
149d6b92ffaSHans Petter Selasky return smp_query_via(rcvbuf, portid, attrid, mod, timeout, ibmp);
150d6b92ffaSHans Petter Selasky }
151