Revert "soc: qcom: rpm-smd: Account for NOACK messages during system sleep"
This reverts commit e37ff31b0476 ("soc: qcom: rpm-smd: Account for NOACK messages during system sleep")'. Change-Id: If35cd5fe6bc94510125b828af2b260cebd5fbcd7 Signed-off-by: Srinivas Rao L <lsrao@codeaurora.org>
This commit is contained in:
parent
336e5a0aca
commit
127a7e639d
1 changed files with 10 additions and 39 deletions
|
@ -93,7 +93,6 @@ static ATOMIC_NOTIFIER_HEAD(msm_rpm_sleep_notifier);
|
||||||
static bool standalone;
|
static bool standalone;
|
||||||
static int probe_status = -EPROBE_DEFER;
|
static int probe_status = -EPROBE_DEFER;
|
||||||
static int msm_rpm_read_smd_data(char *buf);
|
static int msm_rpm_read_smd_data(char *buf);
|
||||||
static void msm_rpm_process_ack(uint32_t msg_id, int errno);
|
|
||||||
|
|
||||||
int msm_rpm_register_notifier(struct notifier_block *nb)
|
int msm_rpm_register_notifier(struct notifier_block *nb)
|
||||||
{
|
{
|
||||||
|
@ -355,7 +354,6 @@ struct msm_rpm_wait_data {
|
||||||
bool ack_recd;
|
bool ack_recd;
|
||||||
int errno;
|
int errno;
|
||||||
struct completion ack;
|
struct completion ack;
|
||||||
bool delete_on_ack;
|
|
||||||
};
|
};
|
||||||
DEFINE_SPINLOCK(msm_rpm_list_lock);
|
DEFINE_SPINLOCK(msm_rpm_list_lock);
|
||||||
|
|
||||||
|
@ -526,7 +524,6 @@ static int msm_rpm_read_sleep_ack(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
char buf[MAX_ERR_BUFFER_SIZE] = {0};
|
char buf[MAX_ERR_BUFFER_SIZE] = {0};
|
||||||
uint32_t msg_id;
|
|
||||||
|
|
||||||
if (glink_enabled)
|
if (glink_enabled)
|
||||||
ret = msm_rpm_glink_rx_poll(glink_data->glink_handle);
|
ret = msm_rpm_glink_rx_poll(glink_data->glink_handle);
|
||||||
|
@ -534,33 +531,16 @@ static int msm_rpm_read_sleep_ack(void)
|
||||||
ret = msm_rpm_read_smd_data(buf);
|
ret = msm_rpm_read_smd_data(buf);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = smd_is_pkt_avail(msm_rpm_data.ch_info);
|
ret = smd_is_pkt_avail(msm_rpm_data.ch_info);
|
||||||
/* Mimic Glink behavior to ensure that the data is read
|
|
||||||
* and the msg is removed from the wait list. We should
|
|
||||||
* have gotten here only when there are no drivers waiting
|
|
||||||
* on ACKs. msm_rpm_get_entry_from_msg_id() return non-NULL
|
|
||||||
* only then. So BUG_ON to ensure that we didn't accidentally
|
|
||||||
* get here.
|
|
||||||
*/
|
|
||||||
msg_id = msm_rpm_get_msg_id_from_ack(buf);
|
|
||||||
msm_rpm_process_ack(msg_id, 0);
|
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void msm_rpm_flush_noack_messages(void)
|
|
||||||
{
|
|
||||||
while (!list_empty(&msm_rpm_wait_list))
|
|
||||||
msm_rpm_read_sleep_ack();
|
|
||||||
}
|
|
||||||
|
|
||||||
static int msm_rpm_flush_requests(bool print)
|
static int msm_rpm_flush_requests(bool print)
|
||||||
{
|
{
|
||||||
struct rb_node *t;
|
struct rb_node *t;
|
||||||
int ret;
|
int ret;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
msm_rpm_flush_noack_messages();
|
|
||||||
|
|
||||||
for (t = rb_first(&tr_root); t; t = rb_next(t)) {
|
for (t = rb_first(&tr_root); t; t = rb_next(t)) {
|
||||||
|
|
||||||
struct slp_buf *s = rb_entry(t, struct slp_buf, node);
|
struct slp_buf *s = rb_entry(t, struct slp_buf, node);
|
||||||
|
@ -598,7 +578,7 @@ static int msm_rpm_flush_requests(bool print)
|
||||||
if (count >= MAX_WAIT_ON_ACK) {
|
if (count >= MAX_WAIT_ON_ACK) {
|
||||||
int ret = msm_rpm_read_sleep_ack();
|
int ret = msm_rpm_read_sleep_ack();
|
||||||
|
|
||||||
if (ret > 0)
|
if (ret >= 0)
|
||||||
count--;
|
count--;
|
||||||
else
|
else
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -817,18 +797,14 @@ static void msm_rpm_notify(void *data, unsigned event)
|
||||||
|
|
||||||
bool msm_rpm_waiting_for_ack(void)
|
bool msm_rpm_waiting_for_ack(void)
|
||||||
{
|
{
|
||||||
bool ret = false;
|
bool ret;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct msm_rpm_wait_data *elem = NULL;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&msm_rpm_list_lock, flags);
|
spin_lock_irqsave(&msm_rpm_list_lock, flags);
|
||||||
elem = list_first_entry_or_null(&msm_rpm_wait_list,
|
ret = list_empty(&msm_rpm_wait_list);
|
||||||
struct msm_rpm_wait_data, list);
|
|
||||||
if (elem)
|
|
||||||
ret = !elem->delete_on_ack;
|
|
||||||
spin_unlock_irqrestore(&msm_rpm_list_lock, flags);
|
spin_unlock_irqrestore(&msm_rpm_list_lock, flags);
|
||||||
|
|
||||||
return ret;
|
return !ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct msm_rpm_wait_data *msm_rpm_get_entry_from_msg_id(uint32_t msg_id)
|
static struct msm_rpm_wait_data *msm_rpm_get_entry_from_msg_id(uint32_t msg_id)
|
||||||
|
@ -867,7 +843,7 @@ static uint32_t msm_rpm_get_next_msg_id(void)
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int msm_rpm_add_wait_list(uint32_t msg_id, bool delete_on_ack)
|
static int msm_rpm_add_wait_list(uint32_t msg_id)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct msm_rpm_wait_data *data =
|
struct msm_rpm_wait_data *data =
|
||||||
|
@ -880,12 +856,8 @@ static int msm_rpm_add_wait_list(uint32_t msg_id, bool delete_on_ack)
|
||||||
data->ack_recd = false;
|
data->ack_recd = false;
|
||||||
data->msg_id = msg_id;
|
data->msg_id = msg_id;
|
||||||
data->errno = INIT_ERROR;
|
data->errno = INIT_ERROR;
|
||||||
data->delete_on_ack = delete_on_ack;
|
|
||||||
spin_lock_irqsave(&msm_rpm_list_lock, flags);
|
spin_lock_irqsave(&msm_rpm_list_lock, flags);
|
||||||
if (delete_on_ack)
|
list_add(&data->list, &msm_rpm_wait_list);
|
||||||
list_add_tail(&data->list, &msm_rpm_wait_list);
|
|
||||||
else
|
|
||||||
list_add(&data->list, &msm_rpm_wait_list);
|
|
||||||
spin_unlock_irqrestore(&msm_rpm_list_lock, flags);
|
spin_unlock_irqrestore(&msm_rpm_list_lock, flags);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -903,20 +875,18 @@ static void msm_rpm_free_list_entry(struct msm_rpm_wait_data *elem)
|
||||||
|
|
||||||
static void msm_rpm_process_ack(uint32_t msg_id, int errno)
|
static void msm_rpm_process_ack(uint32_t msg_id, int errno)
|
||||||
{
|
{
|
||||||
struct list_head *ptr, *next;
|
struct list_head *ptr;
|
||||||
struct msm_rpm_wait_data *elem = NULL;
|
struct msm_rpm_wait_data *elem = NULL;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&msm_rpm_list_lock, flags);
|
spin_lock_irqsave(&msm_rpm_list_lock, flags);
|
||||||
|
|
||||||
list_for_each_safe(ptr, next, &msm_rpm_wait_list) {
|
list_for_each(ptr, &msm_rpm_wait_list) {
|
||||||
elem = list_entry(ptr, struct msm_rpm_wait_data, list);
|
elem = list_entry(ptr, struct msm_rpm_wait_data, list);
|
||||||
if (elem && (elem->msg_id == msg_id)) {
|
if (elem && (elem->msg_id == msg_id)) {
|
||||||
elem->errno = errno;
|
elem->errno = errno;
|
||||||
elem->ack_recd = true;
|
elem->ack_recd = true;
|
||||||
complete(&elem->ack);
|
complete(&elem->ack);
|
||||||
if (elem->delete_on_ack)
|
|
||||||
list_del(&elem->list);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
elem = NULL;
|
elem = NULL;
|
||||||
|
@ -1277,7 +1247,8 @@ static int msm_rpm_send_data(struct msm_rpm_request *cdata,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
msm_rpm_add_wait_list(cdata->msg_hdr.msg_id, noack);
|
if (!noack)
|
||||||
|
msm_rpm_add_wait_list(cdata->msg_hdr.msg_id);
|
||||||
|
|
||||||
ret = msm_rpm_send_buffer(&cdata->buf[0], msg_size, noirq);
|
ret = msm_rpm_send_buffer(&cdata->buf[0], msg_size, noirq);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue