diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/char/watchdog/pcwd.c | 206 |
1 files changed, 104 insertions, 102 deletions
diff --git a/drivers/char/watchdog/pcwd.c b/drivers/char/watchdog/pcwd.c index 3329cbffdb34..1112ec8e61f3 100644 --- a/drivers/char/watchdog/pcwd.c +++ b/drivers/char/watchdog/pcwd.c | |||
@@ -73,7 +73,7 @@ | |||
73 | #include <asm/io.h> /* For inb/outb/... */ | 73 | #include <asm/io.h> /* For inb/outb/... */ |
74 | 74 | ||
75 | /* Module and version information */ | 75 | /* Module and version information */ |
76 | #define WD_VER "1.16 (06/12/2004)" | 76 | #define WD_VER "1.16 (03/01/2006)" |
77 | #define PFX "pcwd: " | 77 | #define PFX "pcwd: " |
78 | 78 | ||
79 | /* | 79 | /* |
@@ -133,15 +133,17 @@ static int cards_found; | |||
133 | /* internal variables */ | 133 | /* internal variables */ |
134 | static atomic_t open_allowed = ATOMIC_INIT(1); | 134 | static atomic_t open_allowed = ATOMIC_INIT(1); |
135 | static char expect_close; | 135 | static char expect_close; |
136 | static struct timer_list timer; | ||
137 | static unsigned long next_heartbeat; | ||
138 | static int temp_panic; | 136 | static int temp_panic; |
139 | static int revision; /* The card's revision */ | 137 | static struct { /* this is private data for each ISA-PC watchdog card */ |
140 | static int supports_temp; /* Wether or not the card has a temperature device */ | 138 | int revision; /* The card's revision */ |
141 | static int command_mode; /* Wether or not the card is in command mode */ | 139 | int supports_temp; /* Wether or not the card has a temperature device */ |
142 | static int initial_status; /* The card's boot status */ | 140 | int command_mode; /* Wether or not the card is in command mode */ |
143 | static int current_readport; /* The cards I/O address */ | 141 | int boot_status; /* The card's boot status */ |
144 | static spinlock_t io_lock; | 142 | int io_addr; /* The cards I/O address */ |
143 | spinlock_t io_lock; /* the lock for io operations */ | ||
144 | struct timer_list timer; /* The timer that pings the watchdog */ | ||
145 | unsigned long next_heartbeat; /* the next_heartbeat for the timer */ | ||
146 | } pcwd_private; | ||
145 | 147 | ||
146 | /* module parameters */ | 148 | /* module parameters */ |
147 | #define WATCHDOG_HEARTBEAT 60 /* 60 sec default heartbeat */ | 149 | #define WATCHDOG_HEARTBEAT 60 /* 60 sec default heartbeat */ |
@@ -165,13 +167,13 @@ static int send_isa_command(int cmd) | |||
165 | 167 | ||
166 | /* The WCMD bit must be 1 and the command is only 4 bits in size */ | 168 | /* The WCMD bit must be 1 and the command is only 4 bits in size */ |
167 | control_status = (cmd & 0x0F) | 0x80; | 169 | control_status = (cmd & 0x0F) | 0x80; |
168 | outb_p(control_status, current_readport + 2); | 170 | outb_p(control_status, pcwd_private.io_addr + 2); |
169 | udelay(ISA_COMMAND_TIMEOUT); | 171 | udelay(ISA_COMMAND_TIMEOUT); |
170 | 172 | ||
171 | port0 = inb_p(current_readport); | 173 | port0 = inb_p(pcwd_private.io_addr); |
172 | for (i = 0; i < 25; ++i) { | 174 | for (i = 0; i < 25; ++i) { |
173 | last_port0 = port0; | 175 | last_port0 = port0; |
174 | port0 = inb_p(current_readport); | 176 | port0 = inb_p(pcwd_private.io_addr); |
175 | 177 | ||
176 | if (port0 == last_port0) | 178 | if (port0 == last_port0) |
177 | break; /* Data is stable */ | 179 | break; /* Data is stable */ |
@@ -187,7 +189,7 @@ static int set_command_mode(void) | |||
187 | int i, found=0, count=0; | 189 | int i, found=0, count=0; |
188 | 190 | ||
189 | /* Set the card into command mode */ | 191 | /* Set the card into command mode */ |
190 | spin_lock(&io_lock); | 192 | spin_lock(&pcwd_private.io_lock); |
191 | while ((!found) && (count < 3)) { | 193 | while ((!found) && (count < 3)) { |
192 | i = send_isa_command(CMD_ISA_IDLE); | 194 | i = send_isa_command(CMD_ISA_IDLE); |
193 | 195 | ||
@@ -195,15 +197,15 @@ static int set_command_mode(void) | |||
195 | found = 1; | 197 | found = 1; |
196 | else if (i == 0xF3) { | 198 | else if (i == 0xF3) { |
197 | /* Card does not like what we've done to it */ | 199 | /* Card does not like what we've done to it */ |
198 | outb_p(0x00, current_readport + 2); | 200 | outb_p(0x00, pcwd_private.io_addr + 2); |
199 | udelay(1200); /* Spec says wait 1ms */ | 201 | udelay(1200); /* Spec says wait 1ms */ |
200 | outb_p(0x00, current_readport + 2); | 202 | outb_p(0x00, pcwd_private.io_addr + 2); |
201 | udelay(ISA_COMMAND_TIMEOUT); | 203 | udelay(ISA_COMMAND_TIMEOUT); |
202 | } | 204 | } |
203 | count++; | 205 | count++; |
204 | } | 206 | } |
205 | spin_unlock(&io_lock); | 207 | spin_unlock(&pcwd_private.io_lock); |
206 | command_mode = found; | 208 | pcwd_private.command_mode = found; |
207 | 209 | ||
208 | return(found); | 210 | return(found); |
209 | } | 211 | } |
@@ -211,12 +213,12 @@ static int set_command_mode(void) | |||
211 | static void unset_command_mode(void) | 213 | static void unset_command_mode(void) |
212 | { | 214 | { |
213 | /* Set the card into normal mode */ | 215 | /* Set the card into normal mode */ |
214 | spin_lock(&io_lock); | 216 | spin_lock(&pcwd_private.io_lock); |
215 | outb_p(0x00, current_readport + 2); | 217 | outb_p(0x00, pcwd_private.io_addr + 2); |
216 | udelay(ISA_COMMAND_TIMEOUT); | 218 | udelay(ISA_COMMAND_TIMEOUT); |
217 | spin_unlock(&io_lock); | 219 | spin_unlock(&pcwd_private.io_lock); |
218 | 220 | ||
219 | command_mode = 0; | 221 | pcwd_private.command_mode = 0; |
220 | } | 222 | } |
221 | 223 | ||
222 | static void pcwd_timer_ping(unsigned long data) | 224 | static void pcwd_timer_ping(unsigned long data) |
@@ -225,25 +227,25 @@ static void pcwd_timer_ping(unsigned long data) | |||
225 | 227 | ||
226 | /* If we got a heartbeat pulse within the WDT_INTERVAL | 228 | /* If we got a heartbeat pulse within the WDT_INTERVAL |
227 | * we agree to ping the WDT */ | 229 | * we agree to ping the WDT */ |
228 | if(time_before(jiffies, next_heartbeat)) { | 230 | if(time_before(jiffies, pcwd_private.next_heartbeat)) { |
229 | /* Ping the watchdog */ | 231 | /* Ping the watchdog */ |
230 | spin_lock(&io_lock); | 232 | spin_lock(&pcwd_private.io_lock); |
231 | if (revision == PCWD_REVISION_A) { | 233 | if (pcwd_private.revision == PCWD_REVISION_A) { |
232 | /* Rev A cards are reset by setting the WD_WDRST bit in register 1 */ | 234 | /* Rev A cards are reset by setting the WD_WDRST bit in register 1 */ |
233 | wdrst_stat = inb_p(current_readport); | 235 | wdrst_stat = inb_p(pcwd_private.io_addr); |
234 | wdrst_stat &= 0x0F; | 236 | wdrst_stat &= 0x0F; |
235 | wdrst_stat |= WD_WDRST; | 237 | wdrst_stat |= WD_WDRST; |
236 | 238 | ||
237 | outb_p(wdrst_stat, current_readport + 1); | 239 | outb_p(wdrst_stat, pcwd_private.io_addr + 1); |
238 | } else { | 240 | } else { |
239 | /* Re-trigger watchdog by writing to port 0 */ | 241 | /* Re-trigger watchdog by writing to port 0 */ |
240 | outb_p(0x00, current_readport); | 242 | outb_p(0x00, pcwd_private.io_addr); |
241 | } | 243 | } |
242 | 244 | ||
243 | /* Re-set the timer interval */ | 245 | /* Re-set the timer interval */ |
244 | mod_timer(&timer, jiffies + WDT_INTERVAL); | 246 | mod_timer(&pcwd_private.timer, jiffies + WDT_INTERVAL); |
245 | 247 | ||
246 | spin_unlock(&io_lock); | 248 | spin_unlock(&pcwd_private.io_lock); |
247 | } else { | 249 | } else { |
248 | printk(KERN_WARNING PFX "Heartbeat lost! Will not ping the watchdog\n"); | 250 | printk(KERN_WARNING PFX "Heartbeat lost! Will not ping the watchdog\n"); |
249 | } | 251 | } |
@@ -253,18 +255,18 @@ static int pcwd_start(void) | |||
253 | { | 255 | { |
254 | int stat_reg; | 256 | int stat_reg; |
255 | 257 | ||
256 | next_heartbeat = jiffies + (heartbeat * HZ); | 258 | pcwd_private.next_heartbeat = jiffies + (heartbeat * HZ); |
257 | 259 | ||
258 | /* Start the timer */ | 260 | /* Start the timer */ |
259 | mod_timer(&timer, jiffies + WDT_INTERVAL); | 261 | mod_timer(&pcwd_private.timer, jiffies + WDT_INTERVAL); |
260 | 262 | ||
261 | /* Enable the port */ | 263 | /* Enable the port */ |
262 | if (revision == PCWD_REVISION_C) { | 264 | if (pcwd_private.revision == PCWD_REVISION_C) { |
263 | spin_lock(&io_lock); | 265 | spin_lock(&pcwd_private.io_lock); |
264 | outb_p(0x00, current_readport + 3); | 266 | outb_p(0x00, pcwd_private.io_addr + 3); |
265 | udelay(ISA_COMMAND_TIMEOUT); | 267 | udelay(ISA_COMMAND_TIMEOUT); |
266 | stat_reg = inb_p(current_readport + 2); | 268 | stat_reg = inb_p(pcwd_private.io_addr + 2); |
267 | spin_unlock(&io_lock); | 269 | spin_unlock(&pcwd_private.io_lock); |
268 | if (stat_reg & 0x10) { | 270 | if (stat_reg & 0x10) { |
269 | printk(KERN_INFO PFX "Could not start watchdog\n"); | 271 | printk(KERN_INFO PFX "Could not start watchdog\n"); |
270 | return -EIO; | 272 | return -EIO; |
@@ -278,17 +280,17 @@ static int pcwd_stop(void) | |||
278 | int stat_reg; | 280 | int stat_reg; |
279 | 281 | ||
280 | /* Stop the timer */ | 282 | /* Stop the timer */ |
281 | del_timer(&timer); | 283 | del_timer(&pcwd_private.timer); |
282 | 284 | ||
283 | /* Disable the board */ | 285 | /* Disable the board */ |
284 | if (revision == PCWD_REVISION_C) { | 286 | if (pcwd_private.revision == PCWD_REVISION_C) { |
285 | spin_lock(&io_lock); | 287 | spin_lock(&pcwd_private.io_lock); |
286 | outb_p(0xA5, current_readport + 3); | 288 | outb_p(0xA5, pcwd_private.io_addr + 3); |
287 | udelay(ISA_COMMAND_TIMEOUT); | 289 | udelay(ISA_COMMAND_TIMEOUT); |
288 | outb_p(0xA5, current_readport + 3); | 290 | outb_p(0xA5, pcwd_private.io_addr + 3); |
289 | udelay(ISA_COMMAND_TIMEOUT); | 291 | udelay(ISA_COMMAND_TIMEOUT); |
290 | stat_reg = inb_p(current_readport + 2); | 292 | stat_reg = inb_p(pcwd_private.io_addr + 2); |
291 | spin_unlock(&io_lock); | 293 | spin_unlock(&pcwd_private.io_lock); |
292 | if ((stat_reg & 0x10) == 0) { | 294 | if ((stat_reg & 0x10) == 0) { |
293 | printk(KERN_INFO PFX "Could not stop watchdog\n"); | 295 | printk(KERN_INFO PFX "Could not stop watchdog\n"); |
294 | return -EIO; | 296 | return -EIO; |
@@ -300,7 +302,7 @@ static int pcwd_stop(void) | |||
300 | static int pcwd_keepalive(void) | 302 | static int pcwd_keepalive(void) |
301 | { | 303 | { |
302 | /* user land ping */ | 304 | /* user land ping */ |
303 | next_heartbeat = jiffies + (heartbeat * HZ); | 305 | pcwd_private.next_heartbeat = jiffies + (heartbeat * HZ); |
304 | return 0; | 306 | return 0; |
305 | } | 307 | } |
306 | 308 | ||
@@ -318,23 +320,23 @@ static int pcwd_get_status(int *status) | |||
318 | int card_status; | 320 | int card_status; |
319 | 321 | ||
320 | *status=0; | 322 | *status=0; |
321 | spin_lock(&io_lock); | 323 | spin_lock(&pcwd_private.io_lock); |
322 | if (revision == PCWD_REVISION_A) | 324 | if (pcwd_private.revision == PCWD_REVISION_A) |
323 | /* Rev A cards return status information from | 325 | /* Rev A cards return status information from |
324 | * the base register, which is used for the | 326 | * the base register, which is used for the |
325 | * temperature in other cards. */ | 327 | * temperature in other cards. */ |
326 | card_status = inb(current_readport); | 328 | card_status = inb(pcwd_private.io_addr); |
327 | else { | 329 | else { |
328 | /* Rev C cards return card status in the base | 330 | /* Rev C cards return card status in the base |
329 | * address + 1 register. And use different bits | 331 | * address + 1 register. And use different bits |
330 | * to indicate a card initiated reset, and an | 332 | * to indicate a card initiated reset, and an |
331 | * over-temperature condition. And the reboot | 333 | * over-temperature condition. And the reboot |
332 | * status can be reset. */ | 334 | * status can be reset. */ |
333 | card_status = inb(current_readport + 1); | 335 | card_status = inb(pcwd_private.io_addr + 1); |
334 | } | 336 | } |
335 | spin_unlock(&io_lock); | 337 | spin_unlock(&pcwd_private.io_lock); |
336 | 338 | ||
337 | if (revision == PCWD_REVISION_A) { | 339 | if (pcwd_private.revision == PCWD_REVISION_A) { |
338 | if (card_status & WD_WDRST) | 340 | if (card_status & WD_WDRST) |
339 | *status |= WDIOF_CARDRESET; | 341 | *status |= WDIOF_CARDRESET; |
340 | 342 | ||
@@ -363,10 +365,10 @@ static int pcwd_get_status(int *status) | |||
363 | 365 | ||
364 | static int pcwd_clear_status(void) | 366 | static int pcwd_clear_status(void) |
365 | { | 367 | { |
366 | if (revision == PCWD_REVISION_C) { | 368 | if (pcwd_private.revision == PCWD_REVISION_C) { |
367 | spin_lock(&io_lock); | 369 | spin_lock(&pcwd_private.io_lock); |
368 | outb_p(0x00, current_readport + 1); /* clear reset status */ | 370 | outb_p(0x00, pcwd_private.io_addr + 1); /* clear reset status */ |
369 | spin_unlock(&io_lock); | 371 | spin_unlock(&pcwd_private.io_lock); |
370 | } | 372 | } |
371 | return 0; | 373 | return 0; |
372 | } | 374 | } |
@@ -374,20 +376,20 @@ static int pcwd_clear_status(void) | |||
374 | static int pcwd_get_temperature(int *temperature) | 376 | static int pcwd_get_temperature(int *temperature) |
375 | { | 377 | { |
376 | /* check that port 0 gives temperature info and no command results */ | 378 | /* check that port 0 gives temperature info and no command results */ |
377 | if (command_mode) | 379 | if (pcwd_private.command_mode) |
378 | return -1; | 380 | return -1; |
379 | 381 | ||
380 | *temperature = 0; | 382 | *temperature = 0; |
381 | if (!supports_temp) | 383 | if (!pcwd_private.supports_temp) |
382 | return -ENODEV; | 384 | return -ENODEV; |
383 | 385 | ||
384 | /* | 386 | /* |
385 | * Convert celsius to fahrenheit, since this was | 387 | * Convert celsius to fahrenheit, since this was |
386 | * the decided 'standard' for this return value. | 388 | * the decided 'standard' for this return value. |
387 | */ | 389 | */ |
388 | spin_lock(&io_lock); | 390 | spin_lock(&pcwd_private.io_lock); |
389 | *temperature = ((inb(current_readport)) * 9 / 5) + 32; | 391 | *temperature = ((inb(pcwd_private.io_addr)) * 9 / 5) + 32; |
390 | spin_unlock(&io_lock); | 392 | spin_unlock(&pcwd_private.io_lock); |
391 | 393 | ||
392 | return 0; | 394 | return 0; |
393 | } | 395 | } |
@@ -428,7 +430,7 @@ static int pcwd_ioctl(struct inode *inode, struct file *file, | |||
428 | return put_user(status, argp); | 430 | return put_user(status, argp); |
429 | 431 | ||
430 | case WDIOC_GETBOOTSTATUS: | 432 | case WDIOC_GETBOOTSTATUS: |
431 | return put_user(initial_status, argp); | 433 | return put_user(pcwd_private.boot_status, argp); |
432 | 434 | ||
433 | case WDIOC_GETTEMP: | 435 | case WDIOC_GETTEMP: |
434 | if (pcwd_get_temperature(&temperature)) | 436 | if (pcwd_get_temperature(&temperature)) |
@@ -437,7 +439,7 @@ static int pcwd_ioctl(struct inode *inode, struct file *file, | |||
437 | return put_user(temperature, argp); | 439 | return put_user(temperature, argp); |
438 | 440 | ||
439 | case WDIOC_SETOPTIONS: | 441 | case WDIOC_SETOPTIONS: |
440 | if (revision == PCWD_REVISION_C) | 442 | if (pcwd_private.revision == PCWD_REVISION_C) |
441 | { | 443 | { |
442 | if(copy_from_user(&rv, argp, sizeof(int))) | 444 | if(copy_from_user(&rv, argp, sizeof(int))) |
443 | return -EFAULT; | 445 | return -EFAULT; |
@@ -553,7 +555,7 @@ static ssize_t pcwd_temp_read(struct file *file, char __user *buf, size_t count, | |||
553 | 555 | ||
554 | static int pcwd_temp_open(struct inode *inode, struct file *file) | 556 | static int pcwd_temp_open(struct inode *inode, struct file *file) |
555 | { | 557 | { |
556 | if (!supports_temp) | 558 | if (!pcwd_private.supports_temp) |
557 | return -ENODEV; | 559 | return -ENODEV; |
558 | 560 | ||
559 | return nonseekable_open(inode, file); | 561 | return nonseekable_open(inode, file); |
@@ -621,21 +623,21 @@ static struct notifier_block pcwd_notifier = { | |||
621 | 623 | ||
622 | static inline void get_support(void) | 624 | static inline void get_support(void) |
623 | { | 625 | { |
624 | if (inb(current_readport) != 0xF0) | 626 | if (inb(pcwd_private.io_addr) != 0xF0) |
625 | supports_temp = 1; | 627 | pcwd_private.supports_temp = 1; |
626 | } | 628 | } |
627 | 629 | ||
628 | static inline int get_revision(void) | 630 | static inline int get_revision(void) |
629 | { | 631 | { |
630 | int r = PCWD_REVISION_C; | 632 | int r = PCWD_REVISION_C; |
631 | 633 | ||
632 | spin_lock(&io_lock); | 634 | spin_lock(&pcwd_private.io_lock); |
633 | /* REV A cards use only 2 io ports; test | 635 | /* REV A cards use only 2 io ports; test |
634 | * presumes a floating bus reads as 0xff. */ | 636 | * presumes a floating bus reads as 0xff. */ |
635 | if ((inb(current_readport + 2) == 0xFF) || | 637 | if ((inb(pcwd_private.io_addr + 2) == 0xFF) || |
636 | (inb(current_readport + 3) == 0xFF)) | 638 | (inb(pcwd_private.io_addr + 3) == 0xFF)) |
637 | r=PCWD_REVISION_A; | 639 | r=PCWD_REVISION_A; |
638 | spin_unlock(&io_lock); | 640 | spin_unlock(&pcwd_private.io_lock); |
639 | 641 | ||
640 | return r; | 642 | return r; |
641 | } | 643 | } |
@@ -695,32 +697,32 @@ static int __devinit pcwatchdog_init(int base_addr) | |||
695 | printk(KERN_ERR PFX "No I/O-Address for card detected\n"); | 697 | printk(KERN_ERR PFX "No I/O-Address for card detected\n"); |
696 | return -ENODEV; | 698 | return -ENODEV; |
697 | } | 699 | } |
698 | current_readport = base_addr; | 700 | pcwd_private.io_addr = base_addr; |
699 | 701 | ||
700 | /* Check card's revision */ | 702 | /* Check card's revision */ |
701 | revision = get_revision(); | 703 | pcwd_private.revision = get_revision(); |
702 | 704 | ||
703 | if (!request_region(current_readport, (revision == PCWD_REVISION_A) ? 2 : 4, "PCWD")) { | 705 | if (!request_region(pcwd_private.io_addr, (pcwd_private.revision == PCWD_REVISION_A) ? 2 : 4, "PCWD")) { |
704 | printk(KERN_ERR PFX "I/O address 0x%04x already in use\n", | 706 | printk(KERN_ERR PFX "I/O address 0x%04x already in use\n", |
705 | current_readport); | 707 | pcwd_private.io_addr); |
706 | current_readport = 0x0000; | 708 | pcwd_private.io_addr = 0x0000; |
707 | return -EIO; | 709 | return -EIO; |
708 | } | 710 | } |
709 | 711 | ||
710 | /* Initial variables */ | 712 | /* Initial variables */ |
711 | supports_temp = 0; | 713 | pcwd_private.supports_temp = 0; |
712 | temp_panic = 0; | 714 | temp_panic = 0; |
713 | initial_status = 0x0000; | 715 | pcwd_private.boot_status = 0x0000; |
714 | 716 | ||
715 | /* get the boot_status */ | 717 | /* get the boot_status */ |
716 | pcwd_get_status(&initial_status); | 718 | pcwd_get_status(&pcwd_private.boot_status); |
717 | 719 | ||
718 | /* clear the "card caused reboot" flag */ | 720 | /* clear the "card caused reboot" flag */ |
719 | pcwd_clear_status(); | 721 | pcwd_clear_status(); |
720 | 722 | ||
721 | init_timer(&timer); | 723 | init_timer(&pcwd_private.timer); |
722 | timer.function = pcwd_timer_ping; | 724 | pcwd_private.timer.function = pcwd_timer_ping; |
723 | timer.data = 0; | 725 | pcwd_private.timer.data = 0; |
724 | 726 | ||
725 | /* Disable the board */ | 727 | /* Disable the board */ |
726 | pcwd_stop(); | 728 | pcwd_stop(); |
@@ -729,12 +731,12 @@ static int __devinit pcwatchdog_init(int base_addr) | |||
729 | get_support(); | 731 | get_support(); |
730 | 732 | ||
731 | /* Get some extra info from the hardware (in command/debug/diag mode) */ | 733 | /* Get some extra info from the hardware (in command/debug/diag mode) */ |
732 | if (revision == PCWD_REVISION_A) | 734 | if (pcwd_private.revision == PCWD_REVISION_A) |
733 | printk(KERN_INFO PFX "ISA-PC Watchdog (REV.A) detected at port 0x%04x\n", current_readport); | 735 | printk(KERN_INFO PFX "ISA-PC Watchdog (REV.A) detected at port 0x%04x\n", pcwd_private.io_addr); |
734 | else if (revision == PCWD_REVISION_C) { | 736 | else if (pcwd_private.revision == PCWD_REVISION_C) { |
735 | firmware = get_firmware(); | 737 | firmware = get_firmware(); |
736 | printk(KERN_INFO PFX "ISA-PC Watchdog (REV.C) detected at port 0x%04x (Firmware version: %s)\n", | 738 | printk(KERN_INFO PFX "ISA-PC Watchdog (REV.C) detected at port 0x%04x (Firmware version: %s)\n", |
737 | current_readport, firmware); | 739 | pcwd_private.io_addr, firmware); |
738 | kfree(firmware); | 740 | kfree(firmware); |
739 | option_switches = get_option_switches(); | 741 | option_switches = get_option_switches(); |
740 | printk(KERN_INFO PFX "Option switches (0x%02x): Temperature Reset Enable=%s, Power On Delay=%s\n", | 742 | printk(KERN_INFO PFX "Option switches (0x%02x): Temperature Reset Enable=%s, Power On Delay=%s\n", |
@@ -750,23 +752,23 @@ static int __devinit pcwatchdog_init(int base_addr) | |||
750 | } else { | 752 | } else { |
751 | /* Should NEVER happen, unless get_revision() fails. */ | 753 | /* Should NEVER happen, unless get_revision() fails. */ |
752 | printk(KERN_INFO PFX "Unable to get revision\n"); | 754 | printk(KERN_INFO PFX "Unable to get revision\n"); |
753 | release_region(current_readport, (revision == PCWD_REVISION_A) ? 2 : 4); | 755 | release_region(pcwd_private.io_addr, (pcwd_private.revision == PCWD_REVISION_A) ? 2 : 4); |
754 | current_readport = 0x0000; | 756 | pcwd_private.io_addr = 0x0000; |
755 | return -1; | 757 | return -1; |
756 | } | 758 | } |
757 | 759 | ||
758 | if (supports_temp) | 760 | if (pcwd_private.supports_temp) |
759 | printk(KERN_INFO PFX "Temperature Option Detected\n"); | 761 | printk(KERN_INFO PFX "Temperature Option Detected\n"); |
760 | 762 | ||
761 | if (initial_status & WDIOF_CARDRESET) | 763 | if (pcwd_private.boot_status & WDIOF_CARDRESET) |
762 | printk(KERN_INFO PFX "Previous reboot was caused by the card\n"); | 764 | printk(KERN_INFO PFX "Previous reboot was caused by the card\n"); |
763 | 765 | ||
764 | if (initial_status & WDIOF_OVERHEAT) { | 766 | if (pcwd_private.boot_status & WDIOF_OVERHEAT) { |
765 | printk(KERN_EMERG PFX "Card senses a CPU Overheat. Panicking!\n"); | 767 | printk(KERN_EMERG PFX "Card senses a CPU Overheat. Panicking!\n"); |
766 | printk(KERN_EMERG PFX "CPU Overheat\n"); | 768 | printk(KERN_EMERG PFX "CPU Overheat\n"); |
767 | } | 769 | } |
768 | 770 | ||
769 | if (initial_status == 0) | 771 | if (pcwd_private.boot_status == 0) |
770 | printk(KERN_INFO PFX "No previous trip detected - Cold boot or reset\n"); | 772 | printk(KERN_INFO PFX "No previous trip detected - Cold boot or reset\n"); |
771 | 773 | ||
772 | /* Check that the heartbeat value is within it's range ; if not reset to the default */ | 774 | /* Check that the heartbeat value is within it's range ; if not reset to the default */ |
@@ -780,19 +782,19 @@ static int __devinit pcwatchdog_init(int base_addr) | |||
780 | if (ret) { | 782 | if (ret) { |
781 | printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", | 783 | printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", |
782 | ret); | 784 | ret); |
783 | release_region(current_readport, (revision == PCWD_REVISION_A) ? 2 : 4); | 785 | release_region(pcwd_private.io_addr, (pcwd_private.revision == PCWD_REVISION_A) ? 2 : 4); |
784 | current_readport = 0x0000; | 786 | pcwd_private.io_addr = 0x0000; |
785 | return ret; | 787 | return ret; |
786 | } | 788 | } |
787 | 789 | ||
788 | if (supports_temp) { | 790 | if (pcwd_private.supports_temp) { |
789 | ret = misc_register(&temp_miscdev); | 791 | ret = misc_register(&temp_miscdev); |
790 | if (ret) { | 792 | if (ret) { |
791 | printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", | 793 | printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", |
792 | TEMP_MINOR, ret); | 794 | TEMP_MINOR, ret); |
793 | unregister_reboot_notifier(&pcwd_notifier); | 795 | unregister_reboot_notifier(&pcwd_notifier); |
794 | release_region(current_readport, (revision == PCWD_REVISION_A) ? 2 : 4); | 796 | release_region(pcwd_private.io_addr, (pcwd_private.revision == PCWD_REVISION_A) ? 2 : 4); |
795 | current_readport = 0x0000; | 797 | pcwd_private.io_addr = 0x0000; |
796 | return ret; | 798 | return ret; |
797 | } | 799 | } |
798 | } | 800 | } |
@@ -801,11 +803,11 @@ static int __devinit pcwatchdog_init(int base_addr) | |||
801 | if (ret) { | 803 | if (ret) { |
802 | printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", | 804 | printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", |
803 | WATCHDOG_MINOR, ret); | 805 | WATCHDOG_MINOR, ret); |
804 | if (supports_temp) | 806 | if (pcwd_private.supports_temp) |
805 | misc_deregister(&temp_miscdev); | 807 | misc_deregister(&temp_miscdev); |
806 | unregister_reboot_notifier(&pcwd_notifier); | 808 | unregister_reboot_notifier(&pcwd_notifier); |
807 | release_region(current_readport, (revision == PCWD_REVISION_A) ? 2 : 4); | 809 | release_region(pcwd_private.io_addr, (pcwd_private.revision == PCWD_REVISION_A) ? 2 : 4); |
808 | current_readport = 0x0000; | 810 | pcwd_private.io_addr = 0x0000; |
809 | return ret; | 811 | return ret; |
810 | } | 812 | } |
811 | 813 | ||
@@ -823,11 +825,11 @@ static void __devexit pcwatchdog_exit(void) | |||
823 | 825 | ||
824 | /* Deregister */ | 826 | /* Deregister */ |
825 | misc_deregister(&pcwd_miscdev); | 827 | misc_deregister(&pcwd_miscdev); |
826 | if (supports_temp) | 828 | if (pcwd_private.supports_temp) |
827 | misc_deregister(&temp_miscdev); | 829 | misc_deregister(&temp_miscdev); |
828 | unregister_reboot_notifier(&pcwd_notifier); | 830 | unregister_reboot_notifier(&pcwd_notifier); |
829 | release_region(current_readport, (revision == PCWD_REVISION_A) ? 2 : 4); | 831 | release_region(pcwd_private.io_addr, (pcwd_private.revision == PCWD_REVISION_A) ? 2 : 4); |
830 | current_readport = 0x0000; | 832 | pcwd_private.io_addr = 0x0000; |
831 | cards_found--; | 833 | cards_found--; |
832 | } | 834 | } |
833 | 835 | ||
@@ -891,7 +893,7 @@ static int __init pcwd_init_module(void) | |||
891 | { | 893 | { |
892 | int i, found = 0; | 894 | int i, found = 0; |
893 | 895 | ||
894 | spin_lock_init(&io_lock); | 896 | spin_lock_init(&pcwd_private.io_lock); |
895 | 897 | ||
896 | for (i = 0; pcwd_ioports[i] != 0; i++) { | 898 | for (i = 0; pcwd_ioports[i] != 0; i++) { |
897 | if (pcwd_checkcard(pcwd_ioports[i])) { | 899 | if (pcwd_checkcard(pcwd_ioports[i])) { |
@@ -910,7 +912,7 @@ static int __init pcwd_init_module(void) | |||
910 | 912 | ||
911 | static void __exit pcwd_cleanup_module(void) | 913 | static void __exit pcwd_cleanup_module(void) |
912 | { | 914 | { |
913 | if (current_readport) | 915 | if (pcwd_private.io_addr) |
914 | pcwatchdog_exit(); | 916 | pcwatchdog_exit(); |
915 | return; | 917 | return; |
916 | } | 918 | } |