Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Dmitry Tarnyagin and committed by
David S. Miller
28bd2049 ca63f8c7

+24 -5
+23 -5
drivers/net/caif/caif_hsi.c
··· 29 29 #define PAD_POW2(x, pow) ((((x)&((pow)-1)) == 0) ? 0 :\ 30 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 37 * HSI padding options. 34 38 * Warning: must be a base of 2 (& operation used) and can not be zero ! ··· 102 98 } 103 99 cfhsi->tx_state = CFHSI_TX_STATE_IDLE; 104 100 if (!test_bit(CFHSI_SHUTDOWN, &cfhsi->bits)) 105 - mod_timer(&cfhsi->timer, jiffies + CFHSI_INACTIVITY_TOUT); 101 + mod_timer(&cfhsi->timer, 102 + jiffies + cfhsi->inactivity_timeout); 106 103 spin_unlock_bh(&cfhsi->lock); 107 104 } 108 105 ··· 317 312 cfhsi->tx_state = CFHSI_TX_STATE_IDLE; 318 313 /* Start inactivity timer. */ 319 314 mod_timer(&cfhsi->timer, 320 - jiffies + CFHSI_INACTIVITY_TOUT); 315 + jiffies + cfhsi->inactivity_timeout); 321 316 spin_unlock_bh(&cfhsi->lock); 322 317 goto done; 323 318 } ··· 539 534 540 535 /* Update inactivity timer if pending. */ 541 536 spin_lock_bh(&cfhsi->lock); 542 - mod_timer_pending(&cfhsi->timer, jiffies + CFHSI_INACTIVITY_TOUT); 537 + mod_timer_pending(&cfhsi->timer, 538 + jiffies + cfhsi->inactivity_timeout); 543 539 spin_unlock_bh(&cfhsi->lock); 544 540 545 541 if (cfhsi->rx_state.state == CFHSI_RX_STATE_DESC) { ··· 721 715 __func__); 722 716 /* Start inactivity timer. */ 723 717 mod_timer(&cfhsi->timer, 724 - jiffies + CFHSI_INACTIVITY_TOUT); 718 + jiffies + cfhsi->inactivity_timeout); 725 719 spin_unlock_bh(&cfhsi->lock); 726 720 return; 727 721 } ··· 995 989 goto err_alloc_rx; 996 990 } 997 991 998 - /* Initialize receive variables. */ 992 + /* Pre-calculate inactivity timeout. */ 993 + if (inactivity_timeout != -1) { 994 + cfhsi->inactivity_timeout = 995 + inactivity_timeout * HZ / 1000; 996 + if (!cfhsi->inactivity_timeout) 997 + cfhsi->inactivity_timeout = 1; 998 + else if (cfhsi->inactivity_timeout > NEXT_TIMER_MAX_DELTA) 999 + cfhsi->inactivity_timeout = NEXT_TIMER_MAX_DELTA; 1000 + } else { 1001 + cfhsi->inactivity_timeout = NEXT_TIMER_MAX_DELTA; 1002 + } 1003 + 1004 + /* Initialize recieve vaiables. */ 999 1005 cfhsi->rx_ptr = cfhsi->rx_buf; 1000 1006 cfhsi->rx_len = CFHSI_DESC_SZ; 1001 1007
+1
include/net/caif/caif_hsi.h
··· 131 131 struct cfhsi_dev *dev; 132 132 int tx_state; 133 133 struct cfhsi_rx_state rx_state; 134 + unsigned long inactivity_timeout; 134 135 int rx_len; 135 136 u8 *rx_ptr; 136 137 u8 *tx_buf;