aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSudeep Holla <sudeep.holla@arm.com>2017-09-28 06:18:53 -0400
committerJassi Brar <jaswinder.singh@linaro.org>2017-11-14 09:51:32 -0500
commite339c80af95e14de3712d69ddea09a3868fa14cd (patch)
treea281c7bb1f342188981b3e5e590cb0f5880cf47f
parent33cd7123ac0ba5360656ae27db453de5b9aa711f (diff)
mailbox: mailbox-test: don't rely on rx_buffer content to signal data ready
Currently we rely on the first byte of the Rx buffer to check if there's any data available to be read. If the first byte of the received buffer is zero (i.e. null character), then we fail to signal that data is available even when it's available. Instead introduce a boolean variable to track the data availability and update it in the channel receive callback as ready and clear it when the data is read. Signed-off-by: Sudeep Holla <sudeep.holla@arm.com> Signed-off-by: Jassi Brar <jaswinder.singh@linaro.org>
-rw-r--r--drivers/mailbox/mailbox-test.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/mailbox/mailbox-test.c b/drivers/mailbox/mailbox-test.c
index 97fb956bb6e0..93f3d4d61fa7 100644
--- a/drivers/mailbox/mailbox-test.c
+++ b/drivers/mailbox/mailbox-test.c
@@ -30,6 +30,7 @@
30#define MBOX_HEXDUMP_MAX_LEN (MBOX_HEXDUMP_LINE_LEN * \ 30#define MBOX_HEXDUMP_MAX_LEN (MBOX_HEXDUMP_LINE_LEN * \
31 (MBOX_MAX_MSG_LEN / MBOX_BYTES_PER_LINE)) 31 (MBOX_MAX_MSG_LEN / MBOX_BYTES_PER_LINE))
32 32
33static bool mbox_data_ready;
33static struct dentry *root_debugfs_dir; 34static struct dentry *root_debugfs_dir;
34 35
35struct mbox_test_device { 36struct mbox_test_device {
@@ -152,16 +153,14 @@ out:
152 153
153static bool mbox_test_message_data_ready(struct mbox_test_device *tdev) 154static bool mbox_test_message_data_ready(struct mbox_test_device *tdev)
154{ 155{
155 unsigned char data; 156 bool data_ready;
156 unsigned long flags; 157 unsigned long flags;
157 158
158 spin_lock_irqsave(&tdev->lock, flags); 159 spin_lock_irqsave(&tdev->lock, flags);
159 data = tdev->rx_buffer[0]; 160 data_ready = mbox_data_ready;
160 spin_unlock_irqrestore(&tdev->lock, flags); 161 spin_unlock_irqrestore(&tdev->lock, flags);
161 162
162 if (data != '\0') 163 return data_ready;
163 return true;
164 return false;
165} 164}
166 165
167static ssize_t mbox_test_message_read(struct file *filp, char __user *userbuf, 166static ssize_t mbox_test_message_read(struct file *filp, char __user *userbuf,
@@ -223,6 +222,7 @@ static ssize_t mbox_test_message_read(struct file *filp, char __user *userbuf,
223 *(touser + l) = '\0'; 222 *(touser + l) = '\0';
224 223
225 memset(tdev->rx_buffer, 0, MBOX_MAX_MSG_LEN); 224 memset(tdev->rx_buffer, 0, MBOX_MAX_MSG_LEN);
225 mbox_data_ready = false;
226 226
227 spin_unlock_irqrestore(&tdev->lock, flags); 227 spin_unlock_irqrestore(&tdev->lock, flags);
228 228
@@ -292,6 +292,7 @@ static void mbox_test_receive_message(struct mbox_client *client, void *message)
292 message, MBOX_MAX_MSG_LEN); 292 message, MBOX_MAX_MSG_LEN);
293 memcpy(tdev->rx_buffer, message, MBOX_MAX_MSG_LEN); 293 memcpy(tdev->rx_buffer, message, MBOX_MAX_MSG_LEN);
294 } 294 }
295 mbox_data_ready = true;
295 spin_unlock_irqrestore(&tdev->lock, flags); 296 spin_unlock_irqrestore(&tdev->lock, flags);
296 297
297 wake_up_interruptible(&tdev->waitq); 298 wake_up_interruptible(&tdev->waitq);