aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/isdn
diff options
context:
space:
mode:
authorAndreas Eversberg <andreas@eversberg.eu>2009-05-22 07:04:44 -0400
committerDavid S. Miller <davem@davemloft.net>2009-05-25 03:51:18 -0400
commit7df3bb8f59ca8e346bb834006c257cc367c6250a (patch)
treea23f31e3a3138e0b4f5b9d13f32d0a097a93960a /drivers/isdn
parent9bcb97cace615a9f57fca0b9d788e7d234d7fc95 (diff)
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: Andreas Eversberg <andreas@eversberg.eu> Signed-off-by: Karsten Keil <keil@b1-systems.de> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/isdn')
-rw-r--r--drivers/isdn/hardware/mISDN/hfc_multi.h1
-rw-r--r--drivers/isdn/hardware/mISDN/hfcmulti.c32
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,
4013static int 4013static int
4014channel_dctrl(struct dchannel *dch, struct mISDN_ctrl_req *cq) 4014channel_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",