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 | |
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>
-rw-r--r-- | drivers/net/caif/caif_hsi.c | 28 | ||||
-rw-r--r-- | include/net/caif/caif_hsi.h | 1 |
2 files changed, 24 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 | ||
diff --git a/include/net/caif/caif_hsi.h b/include/net/caif/caif_hsi.h index 17dff451efe3..9b69d153c94a 100644 --- a/include/net/caif/caif_hsi.h +++ b/include/net/caif/caif_hsi.h | |||
@@ -131,6 +131,7 @@ struct cfhsi { | |||
131 | struct cfhsi_dev *dev; | 131 | struct cfhsi_dev *dev; |
132 | int tx_state; | 132 | int tx_state; |
133 | struct cfhsi_rx_state rx_state; | 133 | struct cfhsi_rx_state rx_state; |
134 | unsigned long inactivity_timeout; | ||
134 | int rx_len; | 135 | int rx_len; |
135 | u8 *rx_ptr; | 136 | u8 *rx_ptr; |
136 | u8 *tx_buf; | 137 | u8 *tx_buf; |