summaryrefslogtreecommitdiff
path: root/drivers/char
diff options
context:
space:
mode:
authorKumar Sanghvi <kumar.sanghvi@stericsson.com>2011-04-19 21:07:56 +0530
committerPhilippe Langlais <philippe.langlais@stericsson.com>2012-05-22 11:07:09 +0200
commitecd3d1c2e397188b5ea04a4ebb1cc8c6f69bf3b3 (patch)
tree5ff5f2a333e6a9462ebd4026179fc1ac9b8061c8 /drivers/char
parent3f2bd84ea8f3d966f2abf93ccb5d5427805d3f95 (diff)
u8500: shrm: Update AC_Wake logic and one fix for MSR
Updates the AC_Wake logic related to MSR. Also, corrects one NULL pointer dereference. ST-Ericsson ID: ER335373 Change-Id: Ie3f46c2a7bcdde9936a0f9eed52f8dcd0ab5a06b Signed-off-by: Kumar Sanghvi <kumar.sanghvi@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/21162 Reviewed-by: QATEST Reviewed-by: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>
Diffstat (limited to 'drivers/char')
-rw-r--r--drivers/char/shrm_char.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/char/shrm_char.c b/drivers/char/shrm_char.c
index e2aaf60674f..6a6b3d7245a 100644
--- a/drivers/char/shrm_char.c
+++ b/drivers/char/shrm_char.c
@@ -236,25 +236,26 @@ int remove_msg_from_queue(struct message_queue *q)
{
struct queue_element *old_msg = NULL;
struct shrm_dev *shrm = q->shrm;
- struct list_head *msg;
+ struct list_head *msg_ptr = NULL;
+ struct list_head *old_msg_ptr = NULL;
dev_dbg(shrm->dev, "%s IN q->readptr %d\n", __func__, q->readptr);
- list_for_each(msg, &q->msg_list) {
- old_msg = list_entry(msg, struct queue_element, entry);
+ list_for_each_safe(old_msg_ptr, msg_ptr, &q->msg_list) {
+ old_msg = list_entry(old_msg_ptr, struct queue_element, entry);
if (old_msg == NULL) {
dev_err(shrm->dev, "no message found\n");
return -EFAULT;
}
+ list_del(old_msg_ptr);
+ q->readptr = (q->readptr + old_msg->size)%q->size;
+ kfree(old_msg);
break;
}
- list_del(msg);
- q->readptr = (q->readptr + old_msg->size)%q->size;
if (list_empty(&q->msg_list)) {
dev_dbg(shrm->dev, "List is empty setting RP= 0\n");
atomic_set(&q->q_rp, 0);
}
- kfree(old_msg);
dev_dbg(shrm->dev, "%s OUT\n", __func__);
return 0;