Lines Matching refs:ibe

102 static void continue_send(IPMIBmcExtern *ibe)  in continue_send()  argument
105 if (ibe->outlen == 0) { in continue_send()
109 ret = qemu_chr_fe_write(&ibe->chr, ibe->outbuf + ibe->outpos, in continue_send()
110 ibe->outlen - ibe->outpos); in continue_send()
112 ibe->outpos += ret; in continue_send()
114 if (ibe->outpos < ibe->outlen) { in continue_send()
116 timer_mod_ns(ibe->extern_timer, in continue_send()
120 ibe->outlen = 0; in continue_send()
121 ibe->outpos = 0; in continue_send()
122 if (!ibe->sending_cmd) { in continue_send()
123 ibe->waiting_rsp = true; in continue_send()
125 ibe->sending_cmd = false; in continue_send()
128 if (ibe->connected && ibe->send_reset) { in continue_send()
130 ibe->outbuf[0] = VM_CMD_RESET; in continue_send()
131 ibe->outbuf[1] = VM_CMD_CHAR; in continue_send()
132 ibe->outlen = 2; in continue_send()
133 ibe->outpos = 0; in continue_send()
134 ibe->send_reset = false; in continue_send()
135 ibe->sending_cmd = true; in continue_send()
139 if (ibe->waiting_rsp) { in continue_send()
141 timer_mod_ns(ibe->extern_timer, in continue_send()
150 IPMIBmcExtern *ibe = opaque; in extern_timeout() local
151 IPMIInterface *s = ibe->parent.intf; in extern_timeout()
153 if (ibe->connected) { in extern_timeout()
154 if (ibe->waiting_rsp && (ibe->outlen == 0)) { in extern_timeout()
157 ibe->waiting_rsp = false; in extern_timeout()
158 ibe->inbuf[1] = ibe->outbuf[1] | 0x04; in extern_timeout()
159 ibe->inbuf[2] = ibe->outbuf[2]; in extern_timeout()
160 ibe->inbuf[3] = IPMI_CC_TIMEOUT; in extern_timeout()
161 k->handle_rsp(s, ibe->outbuf[0], ibe->inbuf + 1, 3); in extern_timeout()
163 continue_send(ibe); in extern_timeout()
168 static void addchar(IPMIBmcExtern *ibe, unsigned char ch) in addchar() argument
174 ibe->outbuf[ibe->outlen] = VM_ESCAPE_CHAR; in addchar()
175 ibe->outlen++; in addchar()
179 ibe->outbuf[ibe->outlen] = ch; in addchar()
180 ibe->outlen++; in addchar()
189 IPMIBmcExtern *ibe = IPMI_BMC_EXTERN(b); in ipmi_bmc_extern_handle_command() local
190 IPMIInterface *s = ibe->parent.intf; in ipmi_bmc_extern_handle_command()
194 if (ibe->outlen) { in ipmi_bmc_extern_handle_command()
206 } else if (!ibe->connected) { in ipmi_bmc_extern_handle_command()
215 ibe->waiting_rsp = false; in ipmi_bmc_extern_handle_command()
220 addchar(ibe, msg_id); in ipmi_bmc_extern_handle_command()
222 addchar(ibe, cmd[i]); in ipmi_bmc_extern_handle_command()
225 addchar(ibe, -ipmb_checksum(cmd, cmd_len, csum)); in ipmi_bmc_extern_handle_command()
227 ibe->outbuf[ibe->outlen] = VM_MSG_CHAR; in ipmi_bmc_extern_handle_command()
228 ibe->outlen++; in ipmi_bmc_extern_handle_command()
231 continue_send(ibe); in ipmi_bmc_extern_handle_command()
237 static void handle_hw_op(IPMIBmcExtern *ibe, unsigned char hw_op) in handle_hw_op() argument
239 IPMIInterface *s = ibe->parent.intf; in handle_hw_op()
285 static void handle_msg(IPMIBmcExtern *ibe) in handle_msg() argument
287 IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(ibe->parent.intf); in handle_msg()
289 if (ibe->in_escape) { in handle_msg()
293 if (ibe->inpos < 5) { in handle_msg()
297 if (ibe->in_too_many) { in handle_msg()
298 ibe->inbuf[3] = IPMI_CC_REQUEST_DATA_TRUNCATED; in handle_msg()
299 ibe->inpos = 4; in handle_msg()
300 } else if (ipmb_checksum(ibe->inbuf, ibe->inpos, 0) != 0) { in handle_msg()
304 ibe->inpos--; /* Remove checksum */ in handle_msg()
307 timer_del(ibe->extern_timer); in handle_msg()
308 ibe->waiting_rsp = false; in handle_msg()
309 k->handle_rsp(ibe->parent.intf, ibe->inbuf[0], ibe->inbuf + 1, ibe->inpos - 1); in handle_msg()
319 IPMIBmcExtern *ibe = opaque; in receive() local
328 handle_msg(ibe); in receive()
329 ibe->in_too_many = false; in receive()
330 ibe->inpos = 0; in receive()
334 if (ibe->in_too_many) { in receive()
336 ibe->in_too_many = false; in receive()
337 ibe->inpos = 0; in receive()
340 if (ibe->in_escape) { in receive()
342 ibe->in_too_many = false; in receive()
343 ibe->inpos = 0; in receive()
344 ibe->in_escape = false; in receive()
347 ibe->in_too_many = false; in receive()
348 if (ibe->inpos < 1) { in receive()
351 hw_op = ibe->inbuf[0]; in receive()
352 ibe->inpos = 0; in receive()
357 ibe->in_escape = true; in receive()
361 if (ibe->in_escape) { in receive()
363 ibe->in_escape = false; in receive()
365 if (ibe->in_too_many) { in receive()
368 if (ibe->inpos >= sizeof(ibe->inbuf)) { in receive()
369 ibe->in_too_many = true; in receive()
372 ibe->inbuf[ibe->inpos] = ch; in receive()
373 ibe->inpos++; in receive()
380 handle_hw_op(ibe, hw_op); in receive()
385 IPMIBmcExtern *ibe = opaque; in chr_event() local
386 IPMIInterface *s = ibe->parent.intf; in chr_event()
392 ibe->connected = true; in chr_event()
393 ibe->outpos = 0; in chr_event()
394 ibe->outlen = 0; in chr_event()
395 addchar(ibe, VM_CMD_VERSION); in chr_event()
396 addchar(ibe, VM_PROTOCOL_VERSION); in chr_event()
397 ibe->outbuf[ibe->outlen] = VM_CMD_CHAR; in chr_event()
398 ibe->outlen++; in chr_event()
399 addchar(ibe, VM_CMD_CAPABILITIES); in chr_event()
401 if (k->do_hw_op(ibe->parent.intf, IPMI_POWEROFF_CHASSIS, 1) == 0) { in chr_event()
404 if (k->do_hw_op(ibe->parent.intf, IPMI_SHUTDOWN_VIA_ACPI_OVERTEMP, 1) in chr_event()
408 if (k->do_hw_op(ibe->parent.intf, IPMI_RESET_CHASSIS, 1) == 0) { in chr_event()
411 if (k->do_hw_op(ibe->parent.intf, IPMI_SEND_NMI, 1) == 0) { in chr_event()
414 addchar(ibe, v); in chr_event()
415 ibe->outbuf[ibe->outlen] = VM_CMD_CHAR; in chr_event()
416 ibe->outlen++; in chr_event()
417 ibe->sending_cmd = false; in chr_event()
418 continue_send(ibe); in chr_event()
422 if (!ibe->connected) { in chr_event()
425 ibe->connected = false; in chr_event()
431 if (ibe->waiting_rsp) { in chr_event()
432 ibe->waiting_rsp = false; in chr_event()
433 ibe->inbuf[1] = ibe->outbuf[1] | 0x04; in chr_event()
434 ibe->inbuf[2] = ibe->outbuf[2]; in chr_event()
435 ibe->inbuf[3] = IPMI_CC_BMC_INIT_IN_PROGRESS; in chr_event()
436 k->handle_rsp(s, ibe->outbuf[0], ibe->inbuf + 1, 3); in chr_event()
450 IPMIBmcExtern *ibe = IPMI_BMC_EXTERN(b); in ipmi_bmc_extern_handle_reset() local
452 ibe->send_reset = true; in ipmi_bmc_extern_handle_reset()
453 continue_send(ibe); in ipmi_bmc_extern_handle_reset()
458 IPMIBmcExtern *ibe = opaque; in ipmi_bmc_extern_post_migrate() local
464 if (ibe->waiting_rsp) { in ipmi_bmc_extern_post_migrate()
465 IPMIInterface *ii = ibe->parent.intf; in ipmi_bmc_extern_post_migrate()
468 ibe->waiting_rsp = false; in ipmi_bmc_extern_post_migrate()
469 ibe->inbuf[1] = ibe->outbuf[1] | 0x04; in ipmi_bmc_extern_post_migrate()
470 ibe->inbuf[2] = ibe->outbuf[2]; in ipmi_bmc_extern_post_migrate()
471 ibe->inbuf[3] = IPMI_CC_BMC_INIT_IN_PROGRESS; in ipmi_bmc_extern_post_migrate()
472 iic->handle_rsp(ii, ibe->outbuf[0], ibe->inbuf + 1, 3); in ipmi_bmc_extern_post_migrate()
491 IPMIBmcExtern *ibe = IPMI_BMC_EXTERN(dev); in ipmi_bmc_extern_realize() local
493 if (!qemu_chr_fe_backend_connected(&ibe->chr)) { in ipmi_bmc_extern_realize()
498 qemu_chr_fe_set_handlers(&ibe->chr, can_receive, receive, in ipmi_bmc_extern_realize()
499 chr_event, NULL, ibe, NULL, true); in ipmi_bmc_extern_realize()
501 vmstate_register(NULL, 0, &vmstate_ipmi_bmc_extern, ibe); in ipmi_bmc_extern_realize()
506 IPMIBmcExtern *ibe = IPMI_BMC_EXTERN(obj); in ipmi_bmc_extern_init() local
508 ibe->extern_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, extern_timeout, ibe); in ipmi_bmc_extern_init()
513 IPMIBmcExtern *ibe = IPMI_BMC_EXTERN(obj); in ipmi_bmc_extern_finalize() local
515 timer_free(ibe->extern_timer); in ipmi_bmc_extern_finalize()