Backport two upstream hotfixes for uru4000.

Both patches are on top of 0.5.0:

- uru4000: fix race condition on waiting power up irq
- uru4000: fix cancelling of imaging from error callback

Thanks-To: Timo Teräs <timo.teras@iki.fi>
This commit is contained in:
Didier Raboud
2013-01-15 18:34:21 +01:00
parent 9fa5335ea1
commit 15bea49681
3 changed files with 137 additions and 0 deletions
+5
View File
@@ -1,3 +1,8 @@
# Upstream backports
u7e1646c-uru4000-fix-race-condition-on-waiting-power-up-irq.patch
u8a87ba4-uru4000-fix-cancelling-of-imaging-from-error-callbac.patch
# Debian specifics
kFreeBSD_FTBFS_add_ETIME_definition.patch kFreeBSD_FTBFS_add_ETIME_definition.patch
udev-rules-creation-add-Debian-specifics.patch udev-rules-creation-add-Debian-specifics.patch
Fix-blacklist-handling-in-udev-rules-creation.patch Fix-blacklist-handling-in-udev-rules-creation.patch
@@ -0,0 +1,87 @@
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] 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.7.10.4
@@ -0,0 +1,45 @@
From 8a87ba448c62eb14fa51d70ce870dd10b67ba76b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi>
Date: Mon, 3 Dec 2012 09:51:27 +0200
Subject: [PATCH] uru4000: fix cancelling of imaging from error callback
Call error callback before resetting img_transfer to NULL. This
variable is internally used to detect if we are still in imaging
loop and the call to execute_state_change() needs to be postponed.
Since this is the final thing imaging_complete() we can't reset
img_transfer until just before this call.
https://bugs.freedesktop.org/show_bug.cgi?id=57829
---
libfprint/drivers/uru4000.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/libfprint/drivers/uru4000.c b/libfprint/drivers/uru4000.c
index 07e26a4..ccaa87f 100644
--- a/libfprint/drivers/uru4000.c
+++ b/libfprint/drivers/uru4000.c
@@ -789,15 +789,18 @@ static void imaging_complete(struct fpi_ssm *ssm)
int r = ssm->error;
fpi_ssm_free(ssm);
+ /* Report error before exiting imaging loop - the error handler
+ * can request state change, which needs to be postponed to end of
+ * this function. */
+ if (r)
+ fpi_imgdev_session_error(dev, r);
+
g_free(urudev->img_data);
urudev->img_data = NULL;
libusb_free_transfer(urudev->img_transfer);
urudev->img_transfer = NULL;
- if (r)
- fpi_imgdev_session_error(dev, r);
-
r = execute_state_change(dev);
if (r)
fpi_imgdev_session_error(dev, r);
--
1.7.10.4