diff options
Diffstat (limited to 'main/libfprint/0001-uru4000-fix-race-condition-on-waiting-power-up-irq.patch')
-rw-r--r-- | main/libfprint/0001-uru4000-fix-race-condition-on-waiting-power-up-irq.patch | 87 |
1 files changed, 0 insertions, 87 deletions
diff --git a/main/libfprint/0001-uru4000-fix-race-condition-on-waiting-power-up-irq.patch b/main/libfprint/0001-uru4000-fix-race-condition-on-waiting-power-up-irq.patch deleted file mode 100644 index 88e20518c2..0000000000 --- a/main/libfprint/0001-uru4000-fix-race-condition-on-waiting-power-up-irq.patch +++ /dev/null @@ -1,87 +0,0 @@ -From 7e1646c382bbd6dc21a167bf7f0e45afa5ea217e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi> -Date: Tue, 4 Dec 2012 10:50:30 +0200 -Subject: [PATCH 1/3] uru4000: fix race condition on waiting power up irq - -It can come before we finish reading the status register on some -cases. Arm the irq handler early, and fix the state machine to -handle early irq properly. - -https://bugs.freedesktop.org/show_bug.cgi?id=57834 ---- - libfprint/drivers/uru4000.c | 31 ++++++++++++++++++++----------- - 1 file changed, 20 insertions(+), 11 deletions(-) - -diff --git a/libfprint/drivers/uru4000.c b/libfprint/drivers/uru4000.c -index 541245a..07e26a4 100644 ---- a/libfprint/drivers/uru4000.c -+++ b/libfprint/drivers/uru4000.c -@@ -994,16 +994,19 @@ static void init_scanpwr_irq_cb(struct fp_img_dev *dev, int status, - uint16_t type, void *user_data) - { - struct fpi_ssm *ssm = user_data; -+ struct uru4k_dev *urudev = dev->priv; - - if (status) - fpi_ssm_mark_aborted(ssm, status); - else if (type != IRQDATA_SCANPWR_ON) - fp_dbg("ignoring interrupt"); -- else if (ssm->cur_state != INIT_AWAIT_SCAN_POWER) -- fp_err("ignoring scanpwr interrupt due to being in wrong state %d", -- ssm->cur_state); -- else -+ else if (ssm->cur_state != INIT_AWAIT_SCAN_POWER) { -+ fp_dbg("early scanpwr interrupt"); -+ urudev->scanpwr_irq_timeouts = -1; -+ } else { -+ fp_dbg("late scanpwr interrupt"); - fpi_ssm_next_state(ssm); -+ } - } - - static void init_scanpwr_timeout(void *user_data) -@@ -1053,14 +1056,21 @@ static void init_run_state(struct fpi_ssm *ssm) - fpi_ssm_next_state(ssm); - break; - case INIT_POWERUP: ; -+ if (!IRQ_HANDLER_IS_RUNNING(urudev)) { -+ fpi_ssm_mark_aborted(ssm, -EIO); -+ break; -+ } -+ urudev->irq_cb_data = ssm; -+ urudev->irq_cb = init_scanpwr_irq_cb; -+ - struct fpi_ssm *powerupsm = fpi_ssm_new(dev->dev, powerup_run_state, - POWERUP_NUM_STATES); - powerupsm->priv = dev; - fpi_ssm_start_subsm(ssm, powerupsm); - break; - case INIT_AWAIT_SCAN_POWER: -- if (!IRQ_HANDLER_IS_RUNNING(urudev)) { -- fpi_ssm_mark_aborted(ssm, -EIO); -+ if (urudev->scanpwr_irq_timeouts < 0) { -+ fpi_ssm_next_state(ssm); - break; - } - -@@ -1073,13 +1083,12 @@ static void init_run_state(struct fpi_ssm *ssm) - fpi_ssm_mark_aborted(ssm, -ETIME); - break; - } -- -- urudev->irq_cb_data = ssm; -- urudev->irq_cb = init_scanpwr_irq_cb; - break; - case INIT_DONE: -- fpi_timeout_cancel(urudev->scanpwr_irq_timeout); -- urudev->scanpwr_irq_timeout = NULL; -+ if (urudev->scanpwr_irq_timeout) { -+ fpi_timeout_cancel(urudev->scanpwr_irq_timeout); -+ urudev->scanpwr_irq_timeout = NULL; -+ } - urudev->irq_cb_data = NULL; - urudev->irq_cb = NULL; - fpi_ssm_next_state(ssm); --- -1.8.0.1 - |