summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberto Garcia <agarcia@igalia.com>2012-12-10 14:49:57 +0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-01-16 06:24:37 +0400
commitcc83f833c77c1d233e3843af18c1abf8d561d1fa (patch)
treec0de5dbd0e39e02fb4eaacb5c3e20317bdae2152
parent8e9a4a9a5c8e8765417d54ed6917c7e1e4d09f4d (diff)
downloadlinux-cc83f833c77c1d233e3843af18c1abf8d561d1fa.tar.xz
ipack/devices/ipoctal: Fix race condition during Tx
In order to transmit data, the driver enables Tx and sleeps until *board_write is set to 1 by the interrupt handler. It can happen, though, that the data is sent even before the process is asleep. In this case *board_write must be set to 1 anyway, otherwise we will be waiting for a condition that will never be true. Signed-off-by: Alberto Garcia <agarcia@igalia.com> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/ipack/devices/ipoctal.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/drivers/ipack/devices/ipoctal.c b/drivers/ipack/devices/ipoctal.c
index 576d53d92677..e66135da63ce 100644
--- a/drivers/ipack/devices/ipoctal.c
+++ b/drivers/ipack/devices/ipoctal.c
@@ -195,13 +195,10 @@ static void ipoctal_irq_tx(struct ipoctal_channel *channel)
*pointer_write = *pointer_write % PAGE_SIZE;
channel->nb_bytes--;
- if ((channel->nb_bytes == 0) &&
- (waitqueue_active(&channel->queue))) {
-
- if (channel->board_id != IPACK1_DEVICE_ID_SBS_OCTAL_485) {
- *channel->board_write = 1;
- wake_up_interruptible(&channel->queue);
- }
+ if (channel->nb_bytes == 0 &&
+ channel->board_id != IPACK1_DEVICE_ID_SBS_OCTAL_485) {
+ *channel->board_write = 1;
+ wake_up_interruptible(&channel->queue);
}
}