Lines Matching +full:rpc +full:- +full:if
15 * - Redistributions of source code must retain the above
19 * - Redistributions in binary form must reproduce the above
35 #if HAVE_CONFIG_H
49 smp->qnext = NULL; in queue_smp()
50 if (!engine->smp_queue_head) { in queue_smp()
51 engine->smp_queue_head = smp; in queue_smp()
52 engine->smp_queue_tail = smp; in queue_smp()
54 engine->smp_queue_tail->qnext = smp; in queue_smp()
55 engine->smp_queue_tail = smp; in queue_smp()
61 ibnd_smp_t *head = engine->smp_queue_head; in get_smp()
62 ibnd_smp_t *tail = engine->smp_queue_tail; in get_smp()
64 if (head) { in get_smp()
65 if (tail == head) in get_smp()
66 engine->smp_queue_tail = NULL; in get_smp()
67 engine->smp_queue_head = head->qnext; in get_smp()
76 ib_rpc_t *rpc = &smp->rpc; in send_smp() local
81 if (rpc->mgtclass == IB_SMI_CLASS) { in send_smp()
82 agent = engine->smi_agent; in send_smp()
83 } else if (rpc->mgtclass == IB_SMI_DIRECT_CLASS) { in send_smp()
84 agent = engine->smi_dir_agent; in send_smp()
86 IBND_ERROR("Invalid class for RPC\n"); in send_smp()
87 return (-EIO); in send_smp()
90 if ((rc = mad_build_pkt(umad, &smp->rpc, &smp->path, NULL, NULL)) in send_smp()
96 if ((rc = umad_send(engine->umad_fd, agent, umad, IB_MAD_SIZE, in send_smp()
97 engine->cfg->timeout_ms, engine->cfg->retries)) < 0) { in send_smp()
109 while (cl_qmap_count(&engine->smps_on_wire) in process_smp_queue()
110 < engine->cfg->max_smps) { in process_smp_queue()
112 if (!smp) in process_smp_queue()
115 if ((rc = send_smp(smp, engine)) != 0) { in process_smp_queue()
119 cl_qmap_insert(&engine->smps_on_wire, (uint32_t) smp->rpc.trid, in process_smp_queue()
121 engine->total_smps++; in process_smp_queue()
130 if (!smp) { in issue_smp()
132 return -ENOMEM; in issue_smp()
135 smp->cb = cb; in issue_smp()
136 smp->cb_data = cb_data; in issue_smp()
137 smp->path = *portid; in issue_smp()
138 smp->rpc.method = IB_MAD_METHOD_GET; in issue_smp()
139 smp->rpc.attr.id = attrid; in issue_smp()
140 smp->rpc.attr.mod = mod; in issue_smp()
141 smp->rpc.timeout = engine->cfg->timeout_ms; in issue_smp()
142 smp->rpc.datasz = IB_SMP_DATA_SIZE; in issue_smp()
143 smp->rpc.dataoffs = IB_SMP_DATA_OFFS; in issue_smp()
144 smp->rpc.trid = mad_trid(); in issue_smp()
145 smp->rpc.mkey = engine->cfg->mkey; in issue_smp()
147 if (portid->lid <= 0 || portid->drpath.drslid == 0xffff || in issue_smp()
148 portid->drpath.drdlid == 0xffff) in issue_smp()
149 smp->rpc.mgtclass = IB_SMI_DIRECT_CLASS; /* direct SMI */ in issue_smp()
151 smp->rpc.mgtclass = IB_SMI_CLASS; /* Lid routed SMI */ in issue_smp()
153 portid->sl = 0; in issue_smp()
154 portid->qp = 0; in issue_smp()
173 if ((rc = umad_recv(engine->umad_fd, umad, &length, in process_one_recv()
174 -1)) < 0) { in process_one_recv()
176 return -1; in process_one_recv()
182 smp = (ibnd_smp_t *) cl_qmap_remove(&engine->smps_on_wire, trid); in process_one_recv()
183 if ((cl_map_item_t *) smp == cl_qmap_end(&engine->smps_on_wire)) { in process_one_recv()
185 return -1; in process_one_recv()
189 if (rc) in process_one_recv()
192 if ((status = umad_status(umad))) { in process_one_recv()
194 portid2str(&smp->path), smp->rpc.attr.id, in process_one_recv()
195 smp->rpc.attr.mod, status, strerror(status)); in process_one_recv()
196 if (smp->rpc.attr.id == IB_ATTR_MLNX_EXT_PORT_INFO) in process_one_recv()
198 smp->cb_data); in process_one_recv()
199 } else if ((status = mad_get_field(mad, 0, IB_DRSMP_STATUS_F))) { in process_one_recv()
201 portid2str(&smp->path), smp->rpc.attr.id, in process_one_recv()
202 smp->rpc.attr.mod, status); in process_one_recv()
203 if (smp->rpc.attr.id == IB_ATTR_MLNX_EXT_PORT_INFO) in process_one_recv()
205 smp->cb_data); in process_one_recv()
207 rc = smp->cb(engine, smp, mad, smp->cb_data); in process_one_recv()
219 if (umad_init() < 0) { in smp_engine_init()
221 return -EIO; in smp_engine_init()
224 engine->umad_fd = umad_open_port(ca_name, ca_port); in smp_engine_init()
225 if (engine->umad_fd < 0) { in smp_engine_init()
227 return -EIO; in smp_engine_init()
230 if ((engine->smi_agent = umad_register(engine->umad_fd, in smp_engine_init()
237 if ((engine->smi_dir_agent = umad_register(engine->umad_fd, in smp_engine_init()
244 engine->user_data = user_data; in smp_engine_init()
245 cl_qmap_init(&engine->smps_on_wire); in smp_engine_init()
246 engine->cfg = cfg; in smp_engine_init()
250 umad_close_port(engine->umad_fd); in smp_engine_init()
251 return (-EIO); in smp_engine_init()
261 if (smp) in smp_engine_destroy()
267 item = cl_qmap_head(&engine->smps_on_wire); in smp_engine_destroy()
268 if (item != cl_qmap_end(&engine->smps_on_wire)) in smp_engine_destroy()
270 for ( /* */ ; item != cl_qmap_end(&engine->smps_on_wire); in smp_engine_destroy()
271 item = cl_qmap_head(&engine->smps_on_wire)) { in smp_engine_destroy()
272 cl_qmap_remove_item(&engine->smps_on_wire, item); in smp_engine_destroy()
276 umad_close_port(engine->umad_fd); in smp_engine_destroy()
282 while (!cl_is_qmap_empty(&engine->smps_on_wire)) in process_mads()
283 if ((rc = process_one_recv(engine)) != 0) in process_mads()