Lines Matching full:engine
44 extern int mlnx_ext_port_info_err(smp_engine_t * engine, ibnd_smp_t * smp,
47 static void queue_smp(smp_engine_t * engine, ibnd_smp_t * smp) in queue_smp() argument
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()
59 static ibnd_smp_t *get_smp(smp_engine_t * engine) in get_smp() argument
61 ibnd_smp_t *head = engine->smp_queue_head; in get_smp()
62 ibnd_smp_t *tail = engine->smp_queue_tail; in get_smp()
66 engine->smp_queue_tail = NULL; in get_smp()
67 engine->smp_queue_head = head->qnext; in get_smp()
72 static int send_smp(ibnd_smp_t * smp, smp_engine_t * engine) in send_smp() argument
82 agent = engine->smi_agent; in send_smp()
84 agent = engine->smi_dir_agent; 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()
105 static int process_smp_queue(smp_engine_t * engine) in process_smp_queue() argument
109 while (cl_qmap_count(&engine->smps_on_wire) in process_smp_queue()
110 < engine->cfg->max_smps) { in process_smp_queue()
111 smp = get_smp(engine); 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()
126 int issue_smp(smp_engine_t * engine, ib_portid_t * portid, in issue_smp() argument
141 smp->rpc.timeout = engine->cfg->timeout_ms; in issue_smp()
145 smp->rpc.mkey = engine->cfg->mkey; in issue_smp()
156 queue_smp(engine, smp); in issue_smp()
157 return process_smp_queue(engine); in issue_smp()
160 static int process_one_recv(smp_engine_t * engine) in process_one_recv() argument
173 if ((rc = umad_recv(engine->umad_fd, umad, &length, 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()
188 rc = process_smp_queue(engine); in process_one_recv()
197 rc = mlnx_ext_port_info_err(engine, smp, mad, in process_one_recv()
204 rc = mlnx_ext_port_info_err(engine, smp, mad, in process_one_recv()
207 rc = smp->cb(engine, smp, mad, smp->cb_data); in process_one_recv()
214 int smp_engine_init(smp_engine_t * engine, char * ca_name, int ca_port, in smp_engine_init() argument
217 memset(engine, 0, sizeof(*engine)); 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()
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()
254 void smp_engine_destroy(smp_engine_t * engine) in smp_engine_destroy() argument
260 smp = get_smp(engine); in smp_engine_destroy()
263 for ( /* */ ; smp; smp = get_smp(engine)) 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()
279 int process_mads(smp_engine_t * engine) in process_mads() argument
282 while (!cl_is_qmap_empty(&engine->smps_on_wire)) in process_mads()
283 if ((rc = process_one_recv(engine)) != 0) in process_mads()