q2spi-msm-geni: Perform GSI terminate sequence for sleep packet

Currently GSI terminate sequence not executed when sleep packet
fails with start sequence timeout and leading to GSI failures.

Perform q2spi gsi terminate sequence for sleep packet failures.

Change-Id: Ic9135e5eed9e8dbb616d796bc13ba5dfb0be9e66
Signed-off-by: Chandana Kishori Chiluveru <quic_cchiluve@quicinc.com>
This commit is contained in:
Chandana Kishori Chiluveru 2024-08-20 04:55:13 -07:00
parent 33bf11a9b4
commit 2c81d56368

View File

@ -4630,34 +4630,42 @@ int q2spi_put_slave_to_sleep(struct q2spi_geni *q2spi)
Q2SPI_DEBUG(q2spi, "%s: PID=%d q2spi_sleep_cmd_enable:%d\n",
__func__, current->pid, q2spi->q2spi_sleep_cmd_enable);
if (!q2spi->q2spi_sleep_cmd_enable)
return 0;
if (atomic_read(&q2spi->slave_in_sleep)) {
Q2SPI_DEBUG(q2spi, "%s: Client in sleep\n", __func__);
return 0;
}
if (mutex_is_locked(&q2spi->port_lock) || q2spi->port_release) {
Q2SPI_DEBUG(q2spi, "%s: port_lock acquired or release is in progress\n", __func__);
return 0;
}
mutex_lock(&q2spi->queue_lock);
if (atomic_read(&q2spi->slave_in_sleep)) {
Q2SPI_DEBUG(q2spi, "%s: Client in sleep\n", __func__);
mutex_unlock(&q2spi->queue_lock);
return 0;
}
atomic_set(&q2spi->slave_in_sleep, 1);
q2spi_req.cmd = Q2SPI_HRF_SLEEP_CMD;
q2spi_req.sync = 1;
mutex_lock(&q2spi->queue_lock);
ret = q2spi_add_req_to_tx_queue(q2spi, &q2spi_req, &q2spi_pkt);
mutex_unlock(&q2spi->queue_lock);
if (ret < 0) {
Q2SPI_DEBUG(q2spi, "%s Err failed ret:%d\n", __func__, ret);
goto err;
atomic_set(&q2spi->slave_in_sleep, 0);
return ret;
}
Q2SPI_DEBUG(q2spi, "%s q2spi_pkt:%p tid:%d\n", __func__, q2spi_pkt, q2spi_pkt->xfer->tid);
q2spi_pkt->is_client_sleep_pkt = true;
ret = __q2spi_transfer(q2spi, q2spi_req, q2spi_pkt, 0);
if (ret) {
Q2SPI_DEBUG(q2spi, "%s __q2spi_transfer q2spi_pkt:%p ret%d\n",
__func__, q2spi_pkt, ret);
atomic_set(&q2spi->slave_in_sleep, 0);
Q2SPI_DEBUG(q2spi, "%s q2spi_pkt:%p ret: %d\n", __func__, q2spi_pkt, ret);
if (ret == -ETIMEDOUT)
gpi_q2spi_terminate_all(q2spi->gsi->tx_c);
if (q2spi->port_release) {
Q2SPI_DEBUG(q2spi, "%s Err Port in closed state, return\n", __func__);
return -ENOENT;
@ -4667,10 +4675,8 @@ int q2spi_put_slave_to_sleep(struct q2spi_geni *q2spi)
q2spi_free_xfer_tid(q2spi, q2spi_pkt->xfer->tid);
q2spi_del_pkt_from_tx_queue(q2spi, q2spi_pkt);
q2spi_free_q2spi_pkt(q2spi_pkt, __LINE__);
atomic_set(&q2spi->slave_in_sleep, 1);
Q2SPI_DEBUG(q2spi, "%s: PID=%d End slave_in_sleep:%d\n", __func__, current->pid,
atomic_read(&q2spi->slave_in_sleep));
err:
return ret;
}