25 Jun
2018
25 Jun
'18
6:43 a.m.
On 21-06-18, 14:40, Srinivas Kandagatla wrote:
- if (txn->mt == SLIM_MSG_MT_CORE &&
(txn->mc == SLIM_MSG_MC_CONNECT_SOURCE ||txn->mc == SLIM_MSG_MC_CONNECT_SINK ||txn->mc == SLIM_MSG_MC_DISCONNECT_PORT)) {txn->mt = SLIM_MSG_MT_DEST_REFERRED_USER;if (txn->mc == SLIM_MSG_MC_CONNECT_SOURCE)txn->mc = SLIM_USR_MC_CONNECT_SRC;else if (txn->mc == SLIM_MSG_MC_CONNECT_SINK)txn->mc = SLIM_USR_MC_CONNECT_SINK;else if (txn->mc == SLIM_MSG_MC_DISCONNECT_PORT)txn->mc = SLIM_USR_MC_DISCONNECT_PORT;
How about a switch case for this
i = 0;wbuf[i++] = txn->la;la = SLIM_LA_MGR;wbuf[i++] = txn->msg->wbuf[0];if (txn->mc != SLIM_USR_MC_DISCONNECT_PORT)wbuf[i++] = txn->msg->wbuf[1];txn->comp = &done;ret = slim_alloc_txn_tid(sctrl, txn);if (ret) {dev_err(ctrl->dev, "Unable to allocate TID\n");return ret;}wbuf[i++] = txn->tid;txn->msg->num_bytes = i;txn->msg->wbuf = wbuf;txn->msg->rbuf = rbuf;txn->rl = txn->msg->num_bytes + 4;- }
- /* HW expects length field to be excluded */ txn->rl--; puc = (u8 *)pbuf;
@@ -830,6 +869,19 @@ static int qcom_slim_ngd_xfer_msg(struct slim_controller *sctrl, return -ETIMEDOUT; }
- if (txn->mt == SLIM_MSG_MT_DEST_REFERRED_USER &&
(txn->mc == SLIM_USR_MC_CONNECT_SRC ||txn->mc == SLIM_USR_MC_CONNECT_SINK ||txn->mc == SLIM_USR_MC_DISCONNECT_PORT)) {
how about precalculate this check and use: bool something = txn->mt == SLIM_MSG_MT_DEST_REFERRED_USER && txn->mc == SLIM_USR_MC_CONNECT_SRC || txn->mc == SLIM_USR_MC_CONNECT_SINK || txn->mc == SLIM_USR_MC_DISCONNECT_PORT;
and then use in this case and previous one, make code better to read
if (something) {
timeout = wait_for_completion_timeout(&done, HZ);if (!timeout) {dev_err(sctrl->dev, "TX timed out:MC:0x%x,mt:0x%x",txn->mc, txn->mt);return -ETIMEDOUT;}- }
[...]
struct slim_port *port = &rt->ports[i];if (txn.msg->num_bytes == 0) {int seg_interval = SLIM_SLOTS_PER_SUPERFRAME/rt->ratem;int exp;wbuf[txn.msg->num_bytes++] = sdev->laddr;wbuf[txn.msg->num_bytes] = rt->bps >> 2 |(port->ch.aux_fmt << 6);/* Data channel segment interval not multiple of 3 */exp = seg_interval % 3;if (exp)wbuf[txn.msg->num_bytes] |= BIT(5);txn.msg->num_bytes++;wbuf[txn.msg->num_bytes++] = exp << 4 | rt->prot;if (rt->prot == SLIM_PROTO_ISO)wbuf[txn.msg->num_bytes++] =port->ch.prrate |SLIM_CHANNEL_CONTENT_FL;elsewbuf[txn.msg->num_bytes++] = port->ch.prrate;ret = slim_alloc_txn_tid(ctrl, &txn);if (ret) {dev_err(&sdev->dev, "Fail to allocate TID\n");return -ENXIO;}wbuf[txn.msg->num_bytes++] = txn.tid;}wbuf[txn.msg->num_bytes++] = port->ch.id;- }
- txn.mc = SLIM_USR_MC_DEF_ACT_CHAN;
- txn.rl = txn.msg->num_bytes + 4;
- ret = qcom_slim_ngd_xfer_msg_sync(ctrl, &txn);
- if (ret) {
slim_free_txn_tid(ctrl, &txn);dev_err(&sdev->dev, "TX timed out:MC:0x%x,mt:0x%x", txn.mc,txn.mt);return ret;- }
- txn.mc = SLIM_USR_MC_RECONFIG_NOW;
- txn.msg->num_bytes = 2;
- wbuf[1] = sdev->laddr;
- txn.rl = txn.msg->num_bytes + 4;
- ret = slim_alloc_txn_tid(ctrl, &txn);
- if (ret) {
what about tid allocated in previous loop.. they are not freed here on error and seems to be overwritten by this allocation.
--
~Vinod