in qcom-ngd-ctrl.c [1170:1218]
static void qcom_slim_ngd_master_worker(struct work_struct *work)
{
struct qcom_slim_ngd_ctrl *ctrl;
struct slim_msg_txn txn;
struct slim_val_inf msg = {0};
int retries = 0;
u8 wbuf[8];
int ret = 0;
ctrl = container_of(work, struct qcom_slim_ngd_ctrl, m_work);
txn.dt = SLIM_MSG_DEST_LOGICALADDR;
txn.ec = 0;
txn.mc = SLIM_USR_MC_REPORT_SATELLITE;
txn.mt = SLIM_MSG_MT_SRC_REFERRED_USER;
txn.la = SLIM_LA_MGR;
wbuf[0] = SAT_MAGIC_LSB;
wbuf[1] = SAT_MAGIC_MSB;
wbuf[2] = SAT_MSG_VER;
wbuf[3] = SAT_MSG_PROT;
txn.msg = &msg;
txn.msg->wbuf = wbuf;
txn.msg->num_bytes = 4;
txn.rl = 8;
dev_info(ctrl->dev, "SLIM SAT: Rcvd master capability\n");
capability_retry:
ret = qcom_slim_ngd_xfer_msg(&ctrl->ctrl, &txn);
if (!ret) {
if (ctrl->state >= QCOM_SLIM_NGD_CTRL_ASLEEP)
complete(&ctrl->reconf);
else
dev_err(ctrl->dev, "unexpected state:%d\n",
ctrl->state);
if (ctrl->state == QCOM_SLIM_NGD_CTRL_DOWN)
qcom_slim_ngd_notify_slaves(ctrl);
} else if (ret == -EIO) {
dev_err(ctrl->dev, "capability message NACKed, retrying\n");
if (retries < INIT_MX_RETRIES) {
msleep(DEF_RETRY_MS);
retries++;
goto capability_retry;
}
} else {
dev_err(ctrl->dev, "SLIM: capability TX failed:%d\n", ret);
}
}