提交 7df3bb8f 编写于 作者: A Andreas Eversberg 提交者: David S. Miller

mISDN: Add watchdog functionality to hfcmulti driver

This patch was made by Titus Moldovan and provides IOCTL functions for enabling
and disabling the controller's built in watchdog. The use is optional.
Signed-off-by: NAndreas Eversberg <andreas@eversberg.eu>
Signed-off-by: NKarsten Keil <keil@b1-systems.de>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 9bcb97ca
...@@ -62,6 +62,7 @@ struct hfcm_hw { ...@@ -62,6 +62,7 @@ struct hfcm_hw {
u_char r_sci_msk; u_char r_sci_msk;
u_char r_tx0, r_tx1; u_char r_tx0, r_tx1;
u_char a_st_ctrl0[8]; u_char a_st_ctrl0[8];
u_char r_bert_wd_md;
timer_t timer; timer_t timer;
}; };
......
...@@ -4013,11 +4013,41 @@ open_bchannel(struct hfc_multi *hc, struct dchannel *dch, ...@@ -4013,11 +4013,41 @@ open_bchannel(struct hfc_multi *hc, struct dchannel *dch,
static int static int
channel_dctrl(struct dchannel *dch, struct mISDN_ctrl_req *cq) channel_dctrl(struct dchannel *dch, struct mISDN_ctrl_req *cq)
{ {
struct hfc_multi *hc = dch->hw;
int ret = 0; int ret = 0;
int wd_mode, wd_cnt;
switch (cq->op) { switch (cq->op) {
case MISDN_CTRL_GETOP: case MISDN_CTRL_GETOP:
cq->op = 0; cq->op = MISDN_CTRL_HFC_OP;
break;
case MISDN_CTRL_HFC_WD_INIT: /* init the watchdog */
wd_cnt = cq->p1 & 0xf;
wd_mode = !!(cq->p1 >> 4);
if (debug & DEBUG_HFCMULTI_MSG)
printk(KERN_DEBUG
"%s: MISDN_CTRL_HFC_WD_INIT mode %s counter 0x%x\n",
__func__, wd_mode ? "AUTO" : "MANUAL", wd_cnt);
/* set the watchdog timer */
HFC_outb(hc, R_TI_WD, poll_timer | (wd_cnt << 4));
hc->hw.r_bert_wd_md = (wd_mode ? V_AUTO_WD_RES : 0);
if (hc->ctype == HFC_TYPE_XHFC)
hc->hw.r_bert_wd_md |= 0x40 /* V_WD_EN */;
/* init the watchdog register and reset the counter */
HFC_outb(hc, R_BERT_WD_MD, hc->hw.r_bert_wd_md | V_WD_RES);
if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) {
/* enable the watchdog output for Speech-Design */
HFC_outb(hc, R_GPIO_SEL, V_GPIO_SEL7);
HFC_outb(hc, R_GPIO_EN1, V_GPIO_EN15);
HFC_outb(hc, R_GPIO_OUT1, 0);
HFC_outb(hc, R_GPIO_OUT1, V_GPIO_OUT15);
}
break;
case MISDN_CTRL_HFC_WD_RESET: /* reset the watchdog counter */
if (debug & DEBUG_HFCMULTI_MSG)
printk(KERN_DEBUG "%s: MISDN_CTRL_HFC_WD_RESET\n",
__func__);
HFC_outb(hc, R_BERT_WD_MD, hc->hw.r_bert_wd_md | V_WD_RES);
break; break;
default: default:
printk(KERN_WARNING "%s: unknown Op %x\n", printk(KERN_WARNING "%s: unknown Op %x\n",
......
...@@ -362,7 +362,8 @@ clear_channelmap(u_int nr, u_char *map) ...@@ -362,7 +362,8 @@ clear_channelmap(u_int nr, u_char *map)
#define MISDN_CTRL_HFC_RECEIVE_ON 0x4006 #define MISDN_CTRL_HFC_RECEIVE_ON 0x4006
#define MISDN_CTRL_HFC_ECHOCAN_ON 0x4007 #define MISDN_CTRL_HFC_ECHOCAN_ON 0x4007
#define MISDN_CTRL_HFC_ECHOCAN_OFF 0x4008 #define MISDN_CTRL_HFC_ECHOCAN_OFF 0x4008
#define MISDN_CTRL_HFC_WD_INIT 0x4009
#define MISDN_CTRL_HFC_WD_RESET 0x400A
/* socket options */ /* socket options */
#define MISDN_TIME_STAMP 0x0001 #define MISDN_TIME_STAMP 0x0001
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册