aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial/ifx6x60.c
diff options
context:
space:
mode:
authorJun Chen <jun.d.chen@intel.com>2012-10-22 10:23:07 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-10-25 11:29:58 -0700
commitc73ba2ae43fd4d69589caeecc5260a41be87b759 (patch)
tree1cb25c6cf3d0eb3010e8e24c1e1531ad4569431e /drivers/tty/serial/ifx6x60.c
parentserial: ifx6x60: different SPI word width configure requires different swap process (diff)
downloadlinux-dev-c73ba2ae43fd4d69589caeecc5260a41be87b759.tar.xz
linux-dev-c73ba2ae43fd4d69589caeecc5260a41be87b759.zip
serial: ifx6x60: add_timer is not safe in the mrdy_assert function
This patch make use of mod_timer instead of add_timer in the mrdy_assert function. Because the srdy interrupter can go high when we are running function mrdy_assert and mrdy_assert can be called by multi-entry. In our medfield platform, spi stress test can encounter this error logs triggered by the BUG_ON of add_timer function.This patch had been tested on our medfield platform. the scenario: CPU0 CPU1 mrdy_assert set_bit(IFX_SPI_STATE_TIMER_PENDING) ifx_spi_handle_srdy ... clear_bit(IFX_SPI_STATE_TIMER_PENDING) ... mrdy_assert set_bit(IFX_SPI_STATE_TIMER_PENDING) ... add_timer ... add_timer Cc: liu chuansheng <chuansheng.liu@intel.com> Cc: Bi Chao <chao.bi@intel.com> Signed-off-by: Chen Jun <jun.d.chen@intel.com> Acked-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/serial/ifx6x60.c')
-rw-r--r--drivers/tty/serial/ifx6x60.c4
1 files changed, 1 insertions, 3 deletions
diff --git a/drivers/tty/serial/ifx6x60.c b/drivers/tty/serial/ifx6x60.c
index 2d2bcbd80670..4b001ea4b0b8 100644
--- a/drivers/tty/serial/ifx6x60.c
+++ b/drivers/tty/serial/ifx6x60.c
@@ -231,9 +231,7 @@ static void mrdy_assert(struct ifx_spi_device *ifx_dev)
if (!val) {
if (!test_and_set_bit(IFX_SPI_STATE_TIMER_PENDING,
&ifx_dev->flags)) {
- ifx_dev->spi_timer.expires =
- jiffies + IFX_SPI_TIMEOUT_SEC*HZ;
- add_timer(&ifx_dev->spi_timer);
+ mod_timer(&ifx_dev->spi_timer,jiffies + IFX_SPI_TIMEOUT_SEC*HZ);
}
}