diff options
author | Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> | 2011-10-13 11:29:27 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-10-19 03:25:42 -0400 |
commit | 28bd2049428202cb3bc982536ed3de3c69ae120a (patch) | |
tree | 6e1ce1e4e35c8e7fa448c7e8cb3549393a3d6239 /drivers/net/caif/caif_hsi.c | |
parent | ca63f8c7512acbd1171bbabefc7a7765ce117939 (diff) |
caif-hsi: Make inactivity timeout configurable.
CAIF HSI uses a timer for inactivity. Upon timeout HSI-wake signaling
is initiated to allow power-down of the HSI block.
Signed-off-by: Sjur Brændeland <sjur.brandeland@stericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/caif/caif_hsi.c')
-rw-r--r-- | drivers/net/caif/caif_hsi.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/drivers/net/caif/caif_hsi.c b/drivers/net/caif/caif_hsi.c index f46ab4dfd7a0..1e1f0a372ffa 100644 --- a/drivers/net/caif/caif_hsi.c +++ b/drivers/net/caif/caif_hsi.c @@ -29,6 +29,10 @@ MODULE_DESCRIPTION("CAIF HSI driver"); #define PAD_POW2(x, pow) ((((x)&((pow)-1)) == 0) ? 0 :\ (((pow)-((x)&((pow)-1))))) +static int inactivity_timeout = 1000; +module_param(inactivity_timeout, int, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(inactivity_timeout, "Inactivity timeout on HSI, ms."); + /* * HSI padding options. * Warning: must be a base of 2 (& operation used) and can not be zero ! @@ -98,7 +102,8 @@ static void cfhsi_abort_tx(struct cfhsi *cfhsi) } cfhsi->tx_state = CFHSI_TX_STATE_IDLE; if (!test_bit(CFHSI_SHUTDOWN, &cfhsi->bits)) - mod_timer(&cfhsi->timer, jiffies + CFHSI_INACTIVITY_TOUT); + mod_timer(&cfhsi->timer, + jiffies + cfhsi->inactivity_timeout); spin_unlock_bh(&cfhsi->lock); } @@ -312,7 +317,7 @@ static void cfhsi_tx_done(struct cfhsi *cfhsi) cfhsi->tx_state = CFHSI_TX_STATE_IDLE; /* Start inactivity timer. */ mod_timer(&cfhsi->timer, - jiffies + CFHSI_INACTIVITY_TOUT); + jiffies + cfhsi->inactivity_timeout); spin_unlock_bh(&cfhsi->lock); goto done; } @@ -534,7 +539,8 @@ static void cfhsi_rx_done(struct cfhsi *cfhsi) /* Update inactivity timer if pending. */ spin_lock_bh(&cfhsi->lock); - mod_timer_pending(&cfhsi->timer, jiffies + CFHSI_INACTIVITY_TOUT); + mod_timer_pending(&cfhsi->timer, + jiffies + cfhsi->inactivity_timeout); spin_unlock_bh(&cfhsi->lock); if (cfhsi->rx_state.state == CFHSI_RX_STATE_DESC) { @@ -715,7 +721,7 @@ static void cfhsi_wake_up(struct work_struct *work) __func__); /* Start inactivity timer. */ mod_timer(&cfhsi->timer, - jiffies + CFHSI_INACTIVITY_TOUT); + jiffies + cfhsi->inactivity_timeout); spin_unlock_bh(&cfhsi->lock); return; } @@ -989,7 +995,19 @@ int cfhsi_probe(struct platform_device *pdev) goto err_alloc_rx; } - /* Initialize receive variables. */ + /* Pre-calculate inactivity timeout. */ + if (inactivity_timeout != -1) { + cfhsi->inactivity_timeout = + inactivity_timeout * HZ / 1000; + if (!cfhsi->inactivity_timeout) + cfhsi->inactivity_timeout = 1; + else if (cfhsi->inactivity_timeout > NEXT_TIMER_MAX_DELTA) + cfhsi->inactivity_timeout = NEXT_TIMER_MAX_DELTA; + } else { + cfhsi->inactivity_timeout = NEXT_TIMER_MAX_DELTA; + } + + /* Initialize recieve vaiables. */ cfhsi->rx_ptr = cfhsi->rx_buf; cfhsi->rx_len = CFHSI_DESC_SZ; |