Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b6951b8a authored by Bin Gao's avatar Bin Gao Committed by Greg Kroah-Hartman
Browse files

serial: mrst_max3110: Fix race condition between spi transfers



There is a race between termios configuration and xmit that can cause the
intel_mid_ssp_spi driver to stall.

Serializing spi transactions fixes the problem.

Signed-off-by: default avatarBin Gao <bin.gao@intel.com>
Signed-off-by: default avatarFeng Tang <feng.tang@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 09238443
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ struct uart_max3110 {
	struct task_struct *main_thread;
	struct task_struct *read_thread;
	struct mutex thread_mutex;
	struct mutex io_mutex;

	u32 baud;
	u16 cur_conf;
@@ -90,6 +91,7 @@ static int max3110_write_then_read(struct uart_max3110 *max,
	struct spi_transfer	x;
	int ret;

	mutex_lock(&max->io_mutex);
	spi_message_init(&message);
	memset(&x, 0, sizeof x);
	x.len = len;
@@ -104,6 +106,7 @@ static int max3110_write_then_read(struct uart_max3110 *max,

	/* Do the i/o */
	ret = spi_sync(spi, &message);
	mutex_unlock(&max->io_mutex);
	return ret;
}

@@ -805,6 +808,7 @@ static int serial_m3110_probe(struct spi_device *spi)
	max->irq = (u16)spi->irq;

	mutex_init(&max->thread_mutex);
	mutex_init(&max->io_mutex);

	max->word_7bits = 0;
	max->parity = 0;