q2spi-msm-geni: Add 2msec delay for slave to complete sleep state
Add 2msec delay for slave to complete sleep state after it received a sleep packet from host. If slave is going to sleep, any data packet from host to slave while slave's sleep process is ongoing will result in unwanted failures. Slave expects minimum 1msec to complete its sleep process. Hence added delay of 2msecs to let slave complete its sleep process. Change-Id: I9d444ce420580f3b7c8eb582fdaa28e3b0a10bda Signed-off-by: Visweswara Tanuku <quic_vtanuku@quicinc.com>
This commit is contained in:
parent
e4b373f66a
commit
33bf11a9b4
@ -2207,7 +2207,6 @@ static int q2spi_transfer_check(struct q2spi_geni *q2spi, struct q2spi_request *
|
||||
*/
|
||||
static ssize_t q2spi_transfer(struct file *filp, const char __user *buf, size_t len, loff_t *f_pos)
|
||||
{
|
||||
int retries = Q2SPI_SLAVE_SLEEP_WAIT_TIME;
|
||||
struct q2spi_geni *q2spi;
|
||||
struct q2spi_request q2spi_req;
|
||||
struct q2spi_packet *cur_q2spi_pkt;
|
||||
@ -2226,14 +2225,6 @@ static ssize_t q2spi_transfer(struct file *filp, const char __user *buf, size_t
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
while (retries--) {
|
||||
/* add 2msec delay for slave to process the sleep packet */
|
||||
if (mutex_is_locked(&q2spi->slave_sleep_lock))
|
||||
usleep_range(100, 150);
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if (q2spi_req.cmd == HRF_WRITE) {
|
||||
q2spi_req.addr = Q2SPI_HRF_PUSH_ADDRESS;
|
||||
q2spi_req.sync = 1;
|
||||
@ -3124,6 +3115,9 @@ int __q2spi_send_messages(struct q2spi_geni *q2spi, void *ptr)
|
||||
atomic_set(&q2spi->sma_rd_pending, 0);
|
||||
}
|
||||
|
||||
/* add 2msec delay for slave to complete sleep process after it received a sleep packet */
|
||||
if (q2spi_pkt->is_client_sleep_pkt)
|
||||
usleep_range(2000, 3000);
|
||||
send_msg_exit:
|
||||
mutex_unlock(&q2spi->send_msgs_lock);
|
||||
if (atomic_read(&q2spi->sma_rd_pending))
|
||||
@ -4402,7 +4396,6 @@ static int q2spi_geni_probe(struct platform_device *pdev)
|
||||
INIT_LIST_HEAD(&q2spi->tx_queue_list);
|
||||
mutex_init(&q2spi->gsi_lock);
|
||||
mutex_init(&q2spi->port_lock);
|
||||
mutex_init(&q2spi->slave_sleep_lock);
|
||||
spin_lock_init(&q2spi->txn_lock);
|
||||
mutex_init(&q2spi->queue_lock);
|
||||
mutex_init(&q2spi->send_msgs_lock);
|
||||
@ -4661,14 +4654,12 @@ int q2spi_put_slave_to_sleep(struct q2spi_geni *q2spi)
|
||||
}
|
||||
Q2SPI_DEBUG(q2spi, "%s q2spi_pkt:%p tid:%d\n", __func__, q2spi_pkt, q2spi_pkt->xfer->tid);
|
||||
q2spi_pkt->is_client_sleep_pkt = true;
|
||||
mutex_lock(&q2spi->slave_sleep_lock);
|
||||
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);
|
||||
if (q2spi->port_release) {
|
||||
Q2SPI_DEBUG(q2spi, "%s Err Port in closed state, return\n", __func__);
|
||||
mutex_unlock(&q2spi->slave_sleep_lock);
|
||||
return -ENOENT;
|
||||
}
|
||||
}
|
||||
@ -4677,9 +4668,6 @@ int q2spi_put_slave_to_sleep(struct q2spi_geni *q2spi)
|
||||
q2spi_del_pkt_from_tx_queue(q2spi, q2spi_pkt);
|
||||
q2spi_free_q2spi_pkt(q2spi_pkt, __LINE__);
|
||||
atomic_set(&q2spi->slave_in_sleep, 1);
|
||||
/* add 2msec delay for slave to process the sleep packet */
|
||||
usleep_range(2000, 3000);
|
||||
mutex_unlock(&q2spi->slave_sleep_lock);
|
||||
Q2SPI_DEBUG(q2spi, "%s: PID=%d End slave_in_sleep:%d\n", __func__, current->pid,
|
||||
atomic_read(&q2spi->slave_in_sleep));
|
||||
err:
|
||||
|
@ -196,7 +196,6 @@
|
||||
#define Q2SPI_MAX_DEV 2
|
||||
#define Q2SPI_DEV_NAME_MAX_LEN 64
|
||||
|
||||
#define Q2SPI_SLAVE_SLEEP_WAIT_TIME (20)
|
||||
#define Q2SPI_RESP_BUF_RETRIES (100)
|
||||
|
||||
#define Q2SPI_INFO(q2spi_ptr, x...) do { \
|
||||
@ -529,7 +528,6 @@ struct q2spi_dma_transfer {
|
||||
* @q2spi_cr_txn_err: reflects Q2SPI_CR_TRANSACTION_ERROR in CR body
|
||||
* @q2spi_sleep_cmd_enable: reflects start sending the sleep command to slave
|
||||
* @q2spi_cr_hdr_err: reflects CR Header incorrect in CR Header
|
||||
* @slave_sleep_lock: lock to wait for 3msec after sleep packet before initiating next transfer.
|
||||
* @is_start_seq_fail: start sequence fail due to slave not responding
|
||||
*/
|
||||
struct q2spi_geni {
|
||||
@ -637,8 +635,6 @@ struct q2spi_geni {
|
||||
bool q2spi_cr_txn_err;
|
||||
bool q2spi_sleep_cmd_enable;
|
||||
bool q2spi_cr_hdr_err;
|
||||
/* lock to protect sleep cmd to slave and next transfer */
|
||||
struct mutex slave_sleep_lock;
|
||||
bool is_start_seq_fail;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user