Lines Matching defs: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)
50 if (!engine->smp_queue_head) {
51 engine->smp_queue_head = smp;
52 engine->smp_queue_tail = smp;
54 engine->smp_queue_tail->qnext = smp;
55 engine->smp_queue_tail = smp;
59 static ibnd_smp_t *get_smp(smp_engine_t * engine)
61 ibnd_smp_t *head = engine->smp_queue_head;
62 ibnd_smp_t *tail = engine->smp_queue_tail;
66 engine->smp_queue_tail = NULL;
67 engine->smp_queue_head = head->qnext;
72 static int send_smp(ibnd_smp_t * smp, smp_engine_t * engine)
82 agent = engine->smi_agent;
84 agent = engine->smi_dir_agent;
96 if ((rc = umad_send(engine->umad_fd, agent, umad, IB_MAD_SIZE,
97 engine->cfg->timeout_ms, engine->cfg->retries)) < 0) {
105 static int process_smp_queue(smp_engine_t * engine)
109 while (cl_qmap_count(&engine->smps_on_wire)
110 < engine->cfg->max_smps) {
111 smp = get_smp(engine);
115 if ((rc = send_smp(smp, engine)) != 0) {
119 cl_qmap_insert(&engine->smps_on_wire, (uint32_t) smp->rpc.trid,
121 engine->total_smps++;
126 int issue_smp(smp_engine_t * engine, ib_portid_t * portid,
141 smp->rpc.timeout = engine->cfg->timeout_ms;
145 smp->rpc.mkey = engine->cfg->mkey;
156 queue_smp(engine, smp);
157 return process_smp_queue(engine);
160 static int process_one_recv(smp_engine_t * engine)
173 if ((rc = umad_recv(engine->umad_fd, umad, &length,
182 smp = (ibnd_smp_t *) cl_qmap_remove(&engine->smps_on_wire, trid);
183 if ((cl_map_item_t *) smp == cl_qmap_end(&engine->smps_on_wire)) {
188 rc = process_smp_queue(engine);
197 rc = mlnx_ext_port_info_err(engine, smp, mad,
204 rc = mlnx_ext_port_info_err(engine, smp, mad,
207 rc = smp->cb(engine, smp, mad, smp->cb_data);
214 int smp_engine_init(smp_engine_t * engine, char * ca_name, int ca_port,
217 memset(engine, 0, sizeof(*engine));
224 engine->umad_fd = umad_open_port(ca_name, ca_port);
225 if (engine->umad_fd < 0) {
230 if ((engine->smi_agent = umad_register(engine->umad_fd,
237 if ((engine->smi_dir_agent = umad_register(engine->umad_fd,
244 engine->user_data = user_data;
245 cl_qmap_init(&engine->smps_on_wire);
246 engine->cfg = cfg;
250 umad_close_port(engine->umad_fd);
254 void smp_engine_destroy(smp_engine_t * engine)
260 smp = get_smp(engine);
263 for ( /* */ ; smp; smp = get_smp(engine))
267 item = cl_qmap_head(&engine->smps_on_wire);
268 if (item != cl_qmap_end(&engine->smps_on_wire))
270 for ( /* */ ; item != cl_qmap_end(&engine->smps_on_wire);
271 item = cl_qmap_head(&engine->smps_on_wire)) {
272 cl_qmap_remove_item(&engine->smps_on_wire, item);
276 umad_close_port(engine->umad_fd);
279 int process_mads(smp_engine_t * engine)
282 while (!cl_is_qmap_empty(&engine->smps_on_wire))
283 if ((rc = process_one_recv(engine)) != 0)