in clients/ssi_protocol.c [658:697]
static void ssip_rx_bootinforeq(struct hsi_client *cl, u32 cmd)
{
struct ssi_protocol *ssi = hsi_client_drvdata(cl);
struct hsi_msg *msg;
/* Workaroud: Ignore CMT Loader message leftover */
if (cmd == SSIP_CMT_LOADER_SYNC)
return;
switch (ssi->main_state) {
case ACTIVE:
dev_err(&cl->device, "Boot info req on active state\n");
ssip_error(cl);
fallthrough;
case INIT:
case HANDSHAKE:
spin_lock_bh(&ssi->lock);
ssi->main_state = HANDSHAKE;
spin_unlock_bh(&ssi->lock);
if (!test_and_set_bit(SSIP_WAKETEST_FLAG, &ssi->flags))
ssi_waketest(cl, 1); /* FIXME: To be removed */
spin_lock_bh(&ssi->lock);
/* Start boot handshake watchdog */
mod_timer(&ssi->tx_wd, jiffies + msecs_to_jiffies(SSIP_WDTOUT));
spin_unlock_bh(&ssi->lock);
dev_dbg(&cl->device, "Send BOOTINFO_RESP\n");
if (SSIP_DATA_VERSION(cmd) != SSIP_LOCAL_VERID)
dev_warn(&cl->device, "boot info req verid mismatch\n");
msg = ssip_claim_cmd(ssi);
ssip_set_cmd(msg, SSIP_BOOTINFO_RESP_CMD(SSIP_LOCAL_VERID));
msg->complete = ssip_release_cmd;
hsi_async_write(cl, msg);
break;
default:
dev_dbg(&cl->device, "Wrong state M(%d)\n", ssi->main_state);
break;
}
}