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>
This commit is contained in:
Родитель
8e9a4a9a5c
Коммит
cc83f833c7
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче