diff options
Diffstat (limited to 'drivers/isdn')
-rw-r--r-- | drivers/isdn/hardware/mISDN/hfc_multi.h | 1 | ||||
-rw-r--r-- | drivers/isdn/hardware/mISDN/hfcmulti.c | 32 |
2 files changed, 32 insertions, 1 deletions
diff --git a/drivers/isdn/hardware/mISDN/hfc_multi.h b/drivers/isdn/hardware/mISDN/hfc_multi.h index 663b77f578be..5765e1962911 100644 --- a/drivers/isdn/hardware/mISDN/hfc_multi.h +++ b/drivers/isdn/hardware/mISDN/hfc_multi.h | |||
@@ -62,6 +62,7 @@ struct hfcm_hw { | |||
62 | u_char r_sci_msk; | 62 | u_char r_sci_msk; |
63 | u_char r_tx0, r_tx1; | 63 | u_char r_tx0, r_tx1; |
64 | u_char a_st_ctrl0[8]; | 64 | u_char a_st_ctrl0[8]; |
65 | u_char r_bert_wd_md; | ||
65 | timer_t timer; | 66 | timer_t timer; |
66 | }; | 67 | }; |
67 | 68 | ||
diff --git a/drivers/isdn/hardware/mISDN/hfcmulti.c b/drivers/isdn/hardware/mISDN/hfcmulti.c index 0b28141e43bf..ca153de6954e 100644 --- a/drivers/isdn/hardware/mISDN/hfcmulti.c +++ b/drivers/isdn/hardware/mISDN/hfcmulti.c | |||
@@ -4013,11 +4013,41 @@ open_bchannel(struct hfc_multi *hc, struct dchannel *dch, | |||
4013 | static int | 4013 | static int |
4014 | channel_dctrl(struct dchannel *dch, struct mISDN_ctrl_req *cq) | 4014 | channel_dctrl(struct dchannel *dch, struct mISDN_ctrl_req *cq) |
4015 | { | 4015 | { |
4016 | struct hfc_multi *hc = dch->hw; | ||
4016 | int ret = 0; | 4017 | int ret = 0; |
4018 | int wd_mode, wd_cnt; | ||
4017 | 4019 | ||
4018 | switch (cq->op) { | 4020 | switch (cq->op) { |
4019 | case MISDN_CTRL_GETOP: | 4021 | case MISDN_CTRL_GETOP: |
4020 | cq->op = 0; | 4022 | cq->op = MISDN_CTRL_HFC_OP; |
4023 | break; | ||
4024 | case MISDN_CTRL_HFC_WD_INIT: /* init the watchdog */ | ||
4025 | wd_cnt = cq->p1 & 0xf; | ||
4026 | wd_mode = !!(cq->p1 >> 4); | ||
4027 | if (debug & DEBUG_HFCMULTI_MSG) | ||
4028 | printk(KERN_DEBUG | ||
4029 | "%s: MISDN_CTRL_HFC_WD_INIT mode %s counter 0x%x\n", | ||
4030 | __func__, wd_mode ? "AUTO" : "MANUAL", wd_cnt); | ||
4031 | /* set the watchdog timer */ | ||
4032 | HFC_outb(hc, R_TI_WD, poll_timer | (wd_cnt << 4)); | ||
4033 | hc->hw.r_bert_wd_md = (wd_mode ? V_AUTO_WD_RES : 0); | ||
4034 | if (hc->ctype == HFC_TYPE_XHFC) | ||
4035 | hc->hw.r_bert_wd_md |= 0x40 /* V_WD_EN */; | ||
4036 | /* init the watchdog register and reset the counter */ | ||
4037 | HFC_outb(hc, R_BERT_WD_MD, hc->hw.r_bert_wd_md | V_WD_RES); | ||
4038 | if (test_bit(HFC_CHIP_PLXSD, &hc->chip)) { | ||
4039 | /* enable the watchdog output for Speech-Design */ | ||
4040 | HFC_outb(hc, R_GPIO_SEL, V_GPIO_SEL7); | ||
4041 | HFC_outb(hc, R_GPIO_EN1, V_GPIO_EN15); | ||
4042 | HFC_outb(hc, R_GPIO_OUT1, 0); | ||
4043 | HFC_outb(hc, R_GPIO_OUT1, V_GPIO_OUT15); | ||
4044 | } | ||
4045 | break; | ||
4046 | case MISDN_CTRL_HFC_WD_RESET: /* reset the watchdog counter */ | ||
4047 | if (debug & DEBUG_HFCMULTI_MSG) | ||
4048 | printk(KERN_DEBUG "%s: MISDN_CTRL_HFC_WD_RESET\n", | ||
4049 | __func__); | ||
4050 | HFC_outb(hc, R_BERT_WD_MD, hc->hw.r_bert_wd_md | V_WD_RES); | ||
4021 | break; | 4051 | break; |
4022 | default: | 4052 | default: |
4023 | printk(KERN_WARNING "%s: unknown Op %x\n", | 4053 | printk(KERN_WARNING "%s: unknown Op %x\n", |