diff options
| author | Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> | 2011-10-13 07:29:27 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-10-19 03:25:42 -0400 |
| commit | 28bd2049428202cb3bc982536ed3de3c69ae120a (patch) | |
| tree | 6e1ce1e4e35c8e7fa448c7e8cb3549393a3d6239 /drivers/net/caif | |
| 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')
| -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"); | |||
| 29 | #define PAD_POW2(x, pow) ((((x)&((pow)-1)) == 0) ? 0 :\ | 29 | #define PAD_POW2(x, pow) ((((x)&((pow)-1)) == 0) ? 0 :\ |
| 30 | (((pow)-((x)&((pow)-1))))) | 30 | (((pow)-((x)&((pow)-1))))) |
| 31 | 31 | ||
| 32 | static int inactivity_timeout = 1000; | ||
| 33 | module_param(inactivity_timeout, int, S_IRUGO | S_IWUSR); | ||
| 34 | MODULE_PARM_DESC(inactivity_timeout, "Inactivity timeout on HSI, ms."); | ||
| 35 | |||
| 32 | /* | 36 | /* |
| 33 | * HSI padding options. | 37 | * HSI padding options. |
| 34 | * Warning: must be a base of 2 (& operation used) and can not be zero ! | 38 | * 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) | |||
| 98 | } | 102 | } |
| 99 | cfhsi->tx_state = CFHSI_TX_STATE_IDLE; | 103 | cfhsi->tx_state = CFHSI_TX_STATE_IDLE; |
| 100 | if (!test_bit(CFHSI_SHUTDOWN, &cfhsi->bits)) | 104 | if (!test_bit(CFHSI_SHUTDOWN, &cfhsi->bits)) |
| 101 | mod_timer(&cfhsi->timer, jiffies + CFHSI_INACTIVITY_TOUT); | 105 | mod_timer(&cfhsi->timer, |
| 106 | jiffies + cfhsi->inactivity_timeout); | ||
| 102 | spin_unlock_bh(&cfhsi->lock); | 107 | spin_unlock_bh(&cfhsi->lock); |
| 103 | } | 108 | } |
| 104 | 109 | ||
| @@ -312,7 +317,7 @@ static void cfhsi_tx_done(struct cfhsi *cfhsi) | |||
| 312 | cfhsi->tx_state = CFHSI_TX_STATE_IDLE; | 317 | cfhsi->tx_state = CFHSI_TX_STATE_IDLE; |
| 313 | /* Start inactivity timer. */ | 318 | /* Start inactivity timer. */ |
| 314 | mod_timer(&cfhsi->timer, | 319 | mod_timer(&cfhsi->timer, |
| 315 | jiffies + CFHSI_INACTIVITY_TOUT); | 320 | jiffies + cfhsi->inactivity_timeout); |
| 316 | spin_unlock_bh(&cfhsi->lock); | 321 | spin_unlock_bh(&cfhsi->lock); |
| 317 | goto done; | 322 | goto done; |
| 318 | } | 323 | } |
| @@ -534,7 +539,8 @@ static void cfhsi_rx_done(struct cfhsi *cfhsi) | |||
| 534 | 539 | ||
| 535 | /* Update inactivity timer if pending. */ | 540 | /* Update inactivity timer if pending. */ |
| 536 | spin_lock_bh(&cfhsi->lock); | 541 | spin_lock_bh(&cfhsi->lock); |
| 537 | mod_timer_pending(&cfhsi->timer, jiffies + CFHSI_INACTIVITY_TOUT); | 542 | mod_timer_pending(&cfhsi->timer, |
| 543 | jiffies + cfhsi->inactivity_timeout); | ||
| 538 | spin_unlock_bh(&cfhsi->lock); | 544 | spin_unlock_bh(&cfhsi->lock); |
| 539 | 545 | ||
| 540 | if (cfhsi->rx_state.state == CFHSI_RX_STATE_DESC) { | 546 | if (cfhsi->rx_state.state == CFHSI_RX_STATE_DESC) { |
| @@ -715,7 +721,7 @@ static void cfhsi_wake_up(struct work_struct *work) | |||
| 715 | __func__); | 721 | __func__); |
| 716 | /* Start inactivity timer. */ | 722 | /* Start inactivity timer. */ |
| 717 | mod_timer(&cfhsi->timer, | 723 | mod_timer(&cfhsi->timer, |
| 718 | jiffies + CFHSI_INACTIVITY_TOUT); | 724 | jiffies + cfhsi->inactivity_timeout); |
| 719 | spin_unlock_bh(&cfhsi->lock); | 725 | spin_unlock_bh(&cfhsi->lock); |
| 720 | return; | 726 | return; |
| 721 | } | 727 | } |
| @@ -989,7 +995,19 @@ int cfhsi_probe(struct platform_device *pdev) | |||
| 989 | goto err_alloc_rx; | 995 | goto err_alloc_rx; |
| 990 | } | 996 | } |
| 991 | 997 | ||
| 992 | /* Initialize receive variables. */ | 998 | /* Pre-calculate inactivity timeout. */ |
| 999 | if (inactivity_timeout != -1) { | ||
| 1000 | cfhsi->inactivity_timeout = | ||
| 1001 | inactivity_timeout * HZ / 1000; | ||
| 1002 | if (!cfhsi->inactivity_timeout) | ||
| 1003 | cfhsi->inactivity_timeout = 1; | ||
| 1004 | else if (cfhsi->inactivity_timeout > NEXT_TIMER_MAX_DELTA) | ||
| 1005 | cfhsi->inactivity_timeout = NEXT_TIMER_MAX_DELTA; | ||
| 1006 | } else { | ||
| 1007 | cfhsi->inactivity_timeout = NEXT_TIMER_MAX_DELTA; | ||
| 1008 | } | ||
| 1009 | |||
| 1010 | /* Initialize recieve vaiables. */ | ||
| 993 | cfhsi->rx_ptr = cfhsi->rx_buf; | 1011 | cfhsi->rx_ptr = cfhsi->rx_buf; |
| 994 | cfhsi->rx_len = CFHSI_DESC_SZ; | 1012 | cfhsi->rx_len = CFHSI_DESC_SZ; |
| 995 | 1013 | ||
