diff options
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/watchdog/pcwd_pci.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/drivers/char/watchdog/pcwd_pci.c b/drivers/char/watchdog/pcwd_pci.c index 0cb62e39e58f..0b8e493be045 100644 --- a/drivers/char/watchdog/pcwd_pci.c +++ b/drivers/char/watchdog/pcwd_pci.c | |||
@@ -111,6 +111,13 @@ static struct { /* this is private data for each PCI-PC watchdog card */ | |||
111 | } pcipcwd_private; | 111 | } pcipcwd_private; |
112 | 112 | ||
113 | /* module parameters */ | 113 | /* module parameters */ |
114 | #define QUIET 0 /* Default */ | ||
115 | #define VERBOSE 1 /* Verbose */ | ||
116 | #define DEBUG 2 /* print fancy stuff too */ | ||
117 | static int debug = QUIET; | ||
118 | module_param(debug, int, 0); | ||
119 | MODULE_PARM_DESC(debug, "Debug level: 0=Quiet, 1=Verbose, 2=Debug (default=0)"); | ||
120 | |||
114 | #define WATCHDOG_HEARTBEAT 2 /* 2 sec default heartbeat */ | 121 | #define WATCHDOG_HEARTBEAT 2 /* 2 sec default heartbeat */ |
115 | static int heartbeat = WATCHDOG_HEARTBEAT; | 122 | static int heartbeat = WATCHDOG_HEARTBEAT; |
116 | module_param(heartbeat, int, 0); | 123 | module_param(heartbeat, int, 0); |
@@ -128,6 +135,10 @@ static int send_command(int cmd, int *msb, int *lsb) | |||
128 | { | 135 | { |
129 | int got_response, count; | 136 | int got_response, count; |
130 | 137 | ||
138 | if (debug >= DEBUG) | ||
139 | printk(KERN_DEBUG PFX "sending following data cmd=0x%02x msb=0x%02x lsb=0x%02x\n", | ||
140 | cmd, *msb, *lsb); | ||
141 | |||
131 | spin_lock(&pcipcwd_private.io_lock); | 142 | spin_lock(&pcipcwd_private.io_lock); |
132 | /* If a command requires data it should be written first. | 143 | /* If a command requires data it should be written first. |
133 | * Data for commands with 8 bits of data should be written to port 4. | 144 | * Data for commands with 8 bits of data should be written to port 4. |
@@ -148,6 +159,15 @@ static int send_command(int cmd, int *msb, int *lsb) | |||
148 | got_response = inb_p(pcipcwd_private.io_addr + 2) & WD_PCI_WRSP; | 159 | got_response = inb_p(pcipcwd_private.io_addr + 2) & WD_PCI_WRSP; |
149 | } | 160 | } |
150 | 161 | ||
162 | if (debug >= DEBUG) { | ||
163 | if (got_response) { | ||
164 | printk(KERN_DEBUG PFX "time to process command was: %d ms\n", | ||
165 | count); | ||
166 | } else { | ||
167 | printk(KERN_DEBUG PFX "card did not respond on command!\n"); | ||
168 | } | ||
169 | } | ||
170 | |||
151 | if (got_response) { | 171 | if (got_response) { |
152 | /* read back response */ | 172 | /* read back response */ |
153 | *lsb = inb_p(pcipcwd_private.io_addr + 4); | 173 | *lsb = inb_p(pcipcwd_private.io_addr + 4); |
@@ -155,7 +175,12 @@ static int send_command(int cmd, int *msb, int *lsb) | |||
155 | 175 | ||
156 | /* clear WRSP bit */ | 176 | /* clear WRSP bit */ |
157 | inb_p(pcipcwd_private.io_addr + 6); | 177 | inb_p(pcipcwd_private.io_addr + 6); |
178 | |||
179 | if (debug >= DEBUG) | ||
180 | printk(KERN_DEBUG PFX "received following data for cmd=0x%02x: msb=0x%02x lsb=0x%02x\n", | ||
181 | cmd, *msb, *lsb); | ||
158 | } | 182 | } |
183 | |||
159 | spin_unlock(&pcipcwd_private.io_lock); | 184 | spin_unlock(&pcipcwd_private.io_lock); |
160 | 185 | ||
161 | return got_response; | 186 | return got_response; |
@@ -226,6 +251,9 @@ static int pcipcwd_start(void) | |||
226 | return -1; | 251 | return -1; |
227 | } | 252 | } |
228 | 253 | ||
254 | if (debug >= VERBOSE) | ||
255 | printk(KERN_DEBUG PFX "Watchdog started\n"); | ||
256 | |||
229 | return 0; | 257 | return 0; |
230 | } | 258 | } |
231 | 259 | ||
@@ -248,6 +276,9 @@ static int pcipcwd_stop(void) | |||
248 | return -1; | 276 | return -1; |
249 | } | 277 | } |
250 | 278 | ||
279 | if (debug >= VERBOSE) | ||
280 | printk(KERN_DEBUG PFX "Watchdog stopped\n"); | ||
281 | |||
251 | return 0; | 282 | return 0; |
252 | } | 283 | } |
253 | 284 | ||
@@ -255,6 +286,10 @@ static int pcipcwd_keepalive(void) | |||
255 | { | 286 | { |
256 | /* Re-trigger watchdog by writing to port 0 */ | 287 | /* Re-trigger watchdog by writing to port 0 */ |
257 | outb_p(0x42, pcipcwd_private.io_addr); /* send out any data */ | 288 | outb_p(0x42, pcipcwd_private.io_addr); /* send out any data */ |
289 | |||
290 | if (debug >= DEBUG) | ||
291 | printk(KERN_DEBUG PFX "Watchdog keepalive signal send\n"); | ||
292 | |||
258 | return 0; | 293 | return 0; |
259 | } | 294 | } |
260 | 295 | ||
@@ -270,6 +305,10 @@ static int pcipcwd_set_heartbeat(int t) | |||
270 | send_command(CMD_WRITE_WATCHDOG_TIMEOUT, &t_msb, &t_lsb); | 305 | send_command(CMD_WRITE_WATCHDOG_TIMEOUT, &t_msb, &t_lsb); |
271 | 306 | ||
272 | heartbeat = t; | 307 | heartbeat = t; |
308 | if (debug >= VERBOSE) | ||
309 | printk(KERN_DEBUG PFX "New heartbeat: %d\n", | ||
310 | heartbeat); | ||
311 | |||
273 | return 0; | 312 | return 0; |
274 | } | 313 | } |
275 | 314 | ||
@@ -287,6 +326,10 @@ static int pcipcwd_get_status(int *status) | |||
287 | panic(PFX "Temperature overheat trip!\n"); | 326 | panic(PFX "Temperature overheat trip!\n"); |
288 | } | 327 | } |
289 | 328 | ||
329 | if (debug >= DEBUG) | ||
330 | printk(KERN_DEBUG PFX "Control Status #1: 0x%02x\n", | ||
331 | control_status); | ||
332 | |||
290 | return 0; | 333 | return 0; |
291 | } | 334 | } |
292 | 335 | ||
@@ -296,8 +339,17 @@ static int pcipcwd_clear_status(void) | |||
296 | int msb; | 339 | int msb; |
297 | int reset_counter; | 340 | int reset_counter; |
298 | 341 | ||
342 | if (debug >= VERBOSE) | ||
343 | printk(KERN_INFO PFX "clearing watchdog trip status & LED\n"); | ||
344 | |||
299 | control_status = inb_p(pcipcwd_private.io_addr + 1); | 345 | control_status = inb_p(pcipcwd_private.io_addr + 1); |
300 | 346 | ||
347 | if (debug >= DEBUG) { | ||
348 | printk(KERN_DEBUG PFX "status was: 0x%02x\n", control_status); | ||
349 | printk(KERN_DEBUG PFX "sending: 0x%02x\n", | ||
350 | (control_status & WD_PCI_R2DS) | WD_PCI_WTRP); | ||
351 | } | ||
352 | |||
301 | /* clear trip status & LED and keep mode of relay 2 */ | 353 | /* clear trip status & LED and keep mode of relay 2 */ |
302 | outb_p((control_status & WD_PCI_R2DS) | WD_PCI_WTRP, pcipcwd_private.io_addr + 1); | 354 | outb_p((control_status & WD_PCI_R2DS) | WD_PCI_WTRP, pcipcwd_private.io_addr + 1); |
303 | 355 | ||
@@ -306,6 +358,11 @@ static int pcipcwd_clear_status(void) | |||
306 | reset_counter=0xff; | 358 | reset_counter=0xff; |
307 | send_command(CMD_GET_CLEAR_RESET_COUNT, &msb, &reset_counter); | 359 | send_command(CMD_GET_CLEAR_RESET_COUNT, &msb, &reset_counter); |
308 | 360 | ||
361 | if (debug >= DEBUG) { | ||
362 | printk(KERN_DEBUG PFX "reset count was: 0x%02x\n", | ||
363 | reset_counter); | ||
364 | } | ||
365 | |||
309 | return 0; | 366 | return 0; |
310 | } | 367 | } |
311 | 368 | ||
@@ -323,6 +380,11 @@ static int pcipcwd_get_temperature(int *temperature) | |||
323 | */ | 380 | */ |
324 | *temperature = (*temperature * 9 / 5) + 32; | 381 | *temperature = (*temperature * 9 / 5) + 32; |
325 | 382 | ||
383 | if (debug >= DEBUG) { | ||
384 | printk(KERN_DEBUG PFX "temperature is: %d F\n", | ||
385 | *temperature); | ||
386 | } | ||
387 | |||
326 | return 0; | 388 | return 0; |
327 | } | 389 | } |
328 | 390 | ||
@@ -457,6 +519,8 @@ static int pcipcwd_open(struct inode *inode, struct file *file) | |||
457 | { | 519 | { |
458 | /* /dev/watchdog can only be opened once */ | 520 | /* /dev/watchdog can only be opened once */ |
459 | if (test_and_set_bit(0, &is_active)) { | 521 | if (test_and_set_bit(0, &is_active)) { |
522 | if (debug >= VERBOSE) | ||
523 | printk(KERN_ERR PFX "Attempt to open already opened device.\n"); | ||
460 | return -EBUSY; | 524 | return -EBUSY; |
461 | } | 525 | } |
462 | 526 | ||