aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>2011-10-13 07:29:27 -0400
committerDavid S. Miller <davem@davemloft.net>2011-10-19 03:25:42 -0400
commit28bd2049428202cb3bc982536ed3de3c69ae120a (patch)
tree6e1ce1e4e35c8e7fa448c7e8cb3549393a3d6239
parentca63f8c7512acbd1171bbabefc7a7765ce117939 (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.c28
-rw-r--r--include/net/caif/caif_hsi.h1
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
32static int inactivity_timeout = 1000;
33module_param(inactivity_timeout, int, S_IRUGO | S_IWUSR);
34MODULE_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;