diff options
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/Kconfig | 4 | ||||
-rw-r--r-- | drivers/char/agp/backend.c | 7 | ||||
-rw-r--r-- | drivers/char/applicom.c | 24 | ||||
-rw-r--r-- | drivers/char/cyclades.c | 2 | ||||
-rw-r--r-- | drivers/char/ftape/lowlevel/fdc-io.c | 6 | ||||
-rw-r--r-- | drivers/char/hangcheck-timer.c | 3 | ||||
-rw-r--r-- | drivers/char/hpet.c | 4 | ||||
-rw-r--r-- | drivers/char/hw_random.c | 5 | ||||
-rw-r--r-- | drivers/char/ip2/i2lib.c | 6 | ||||
-rw-r--r-- | drivers/char/ip2main.c | 3 | ||||
-rw-r--r-- | drivers/char/ipmi/ipmi_devintf.c | 5 | ||||
-rw-r--r-- | drivers/char/ipmi/ipmi_si_intf.c | 18 | ||||
-rw-r--r-- | drivers/char/ipmi/ipmi_watchdog.c | 6 | ||||
-rw-r--r-- | drivers/char/istallion.c | 2 | ||||
-rw-r--r-- | drivers/char/keyboard.c | 3 | ||||
-rw-r--r-- | drivers/char/lcd.c | 7 | ||||
-rw-r--r-- | drivers/char/lp.c | 3 | ||||
-rw-r--r-- | drivers/char/mxser.c | 12 | ||||
-rw-r--r-- | drivers/char/n_tty.c | 2 | ||||
-rw-r--r-- | drivers/char/pcmcia/synclink_cs.c | 16 | ||||
-rw-r--r-- | drivers/char/pty.c | 5 | ||||
-rw-r--r-- | drivers/char/synclink.c | 29 | ||||
-rw-r--r-- | drivers/char/synclinkmp.c | 41 | ||||
-rw-r--r-- | drivers/char/tty_io.c | 87 | ||||
-rw-r--r-- | drivers/char/vt.c | 37 | ||||
-rw-r--r-- | drivers/char/watchdog/mixcomwd.c | 2 |
26 files changed, 198 insertions, 141 deletions
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index 2bc9d64db106..c29365d5b524 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
@@ -80,7 +80,7 @@ config SERIAL_NONSTANDARD | |||
80 | 80 | ||
81 | config COMPUTONE | 81 | config COMPUTONE |
82 | tristate "Computone IntelliPort Plus serial support" | 82 | tristate "Computone IntelliPort Plus serial support" |
83 | depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP && (BROKEN || !SPARC32) | 83 | depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP |
84 | ---help--- | 84 | ---help--- |
85 | This driver supports the entire family of Intelliport II/Plus | 85 | This driver supports the entire family of Intelliport II/Plus |
86 | controllers with the exception of the MicroChannel controllers and | 86 | controllers with the exception of the MicroChannel controllers and |
@@ -208,7 +208,7 @@ config SYNCLINK | |||
208 | 208 | ||
209 | config SYNCLINKMP | 209 | config SYNCLINKMP |
210 | tristate "SyncLink Multiport support" | 210 | tristate "SyncLink Multiport support" |
211 | depends on SERIAL_NONSTANDARD && (BROKEN || !SPARC32) | 211 | depends on SERIAL_NONSTANDARD |
212 | help | 212 | help |
213 | Enable support for the SyncLink Multiport (2 or 4 ports) | 213 | Enable support for the SyncLink Multiport (2 or 4 ports) |
214 | serial adapter, running asynchronous and HDLC communications up | 214 | serial adapter, running asynchronous and HDLC communications up |
diff --git a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c index 4d4e602fdc7e..82b43c541c8d 100644 --- a/drivers/char/agp/backend.c +++ b/drivers/char/agp/backend.c | |||
@@ -206,10 +206,9 @@ static void agp_backend_cleanup(struct agp_bridge_data *bridge) | |||
206 | bridge->driver->cleanup(); | 206 | bridge->driver->cleanup(); |
207 | if (bridge->driver->free_gatt_table) | 207 | if (bridge->driver->free_gatt_table) |
208 | bridge->driver->free_gatt_table(bridge); | 208 | bridge->driver->free_gatt_table(bridge); |
209 | if (bridge->key_list) { | 209 | |
210 | vfree(bridge->key_list); | 210 | vfree(bridge->key_list); |
211 | bridge->key_list = NULL; | 211 | bridge->key_list = NULL; |
212 | } | ||
213 | 212 | ||
214 | if (bridge->driver->agp_destroy_page && | 213 | if (bridge->driver->agp_destroy_page && |
215 | bridge->driver->needs_scratch_page) | 214 | bridge->driver->needs_scratch_page) |
diff --git a/drivers/char/applicom.c b/drivers/char/applicom.c index 11f9ee581124..927a5bbe112c 100644 --- a/drivers/char/applicom.c +++ b/drivers/char/applicom.c | |||
@@ -172,7 +172,7 @@ static int ac_register_board(unsigned long physloc, void __iomem *loc, | |||
172 | 172 | ||
173 | void cleanup_module(void) | 173 | void cleanup_module(void) |
174 | { | 174 | { |
175 | int i; | 175 | unsigned int i; |
176 | 176 | ||
177 | misc_deregister(&ac_miscdev); | 177 | misc_deregister(&ac_miscdev); |
178 | 178 | ||
@@ -195,7 +195,7 @@ int __init applicom_init(void) | |||
195 | int i, numisa = 0; | 195 | int i, numisa = 0; |
196 | struct pci_dev *dev = NULL; | 196 | struct pci_dev *dev = NULL; |
197 | void __iomem *RamIO; | 197 | void __iomem *RamIO; |
198 | int boardno; | 198 | int boardno, ret; |
199 | 199 | ||
200 | printk(KERN_INFO "Applicom driver: $Id: ac.c,v 1.30 2000/03/22 16:03:57 dwmw2 Exp $\n"); | 200 | printk(KERN_INFO "Applicom driver: $Id: ac.c,v 1.30 2000/03/22 16:03:57 dwmw2 Exp $\n"); |
201 | 201 | ||
@@ -294,7 +294,8 @@ int __init applicom_init(void) | |||
294 | } | 294 | } |
295 | 295 | ||
296 | if (!numisa) | 296 | if (!numisa) |
297 | printk(KERN_WARNING"ac.o: No valid ISA Applicom boards found at mem 0x%lx\n",mem); | 297 | printk(KERN_WARNING "ac.o: No valid ISA Applicom boards found " |
298 | "at mem 0x%lx\n", mem); | ||
298 | 299 | ||
299 | fin: | 300 | fin: |
300 | init_waitqueue_head(&FlagSleepRec); | 301 | init_waitqueue_head(&FlagSleepRec); |
@@ -304,7 +305,11 @@ int __init applicom_init(void) | |||
304 | DeviceErrorCount = 0; | 305 | DeviceErrorCount = 0; |
305 | 306 | ||
306 | if (numboards) { | 307 | if (numboards) { |
307 | misc_register(&ac_miscdev); | 308 | ret = misc_register(&ac_miscdev); |
309 | if (ret) { | ||
310 | printk(KERN_WARNING "ac.o: Unable to register misc device\n"); | ||
311 | goto out; | ||
312 | } | ||
308 | for (i = 0; i < MAX_BOARD; i++) { | 313 | for (i = 0; i < MAX_BOARD; i++) { |
309 | int serial; | 314 | int serial; |
310 | char boardname[(SERIAL_NUMBER - TYPE_CARD) + 1]; | 315 | char boardname[(SERIAL_NUMBER - TYPE_CARD) + 1]; |
@@ -337,6 +342,17 @@ int __init applicom_init(void) | |||
337 | 342 | ||
338 | else | 343 | else |
339 | return -ENXIO; | 344 | return -ENXIO; |
345 | |||
346 | out: | ||
347 | for (i = 0; i < MAX_BOARD; i++) { | ||
348 | if (!apbs[i].RamIO) | ||
349 | continue; | ||
350 | if (apbs[i].irq) | ||
351 | free_irq(apbs[i].irq, &dummy); | ||
352 | iounmap(apbs[i].RamIO); | ||
353 | } | ||
354 | pci_disable_device(dev); | ||
355 | return ret; | ||
340 | } | 356 | } |
341 | 357 | ||
342 | 358 | ||
diff --git a/drivers/char/cyclades.c b/drivers/char/cyclades.c index 6a5337bf0936..cf4c3648463d 100644 --- a/drivers/char/cyclades.c +++ b/drivers/char/cyclades.c | |||
@@ -865,7 +865,7 @@ static void cyz_poll(unsigned long); | |||
865 | static long cyz_polling_cycle = CZ_DEF_POLL; | 865 | static long cyz_polling_cycle = CZ_DEF_POLL; |
866 | 866 | ||
867 | static int cyz_timeron = 0; | 867 | static int cyz_timeron = 0; |
868 | static struct timer_list cyz_timerlist = TIMER_INITIALIZER(cyz_poll, 0, 0); | 868 | static DEFINE_TIMER(cyz_timerlist, cyz_poll, 0, 0); |
869 | 869 | ||
870 | #else /* CONFIG_CYZ_INTR */ | 870 | #else /* CONFIG_CYZ_INTR */ |
871 | static void cyz_rx_restart(unsigned long); | 871 | static void cyz_rx_restart(unsigned long); |
diff --git a/drivers/char/ftape/lowlevel/fdc-io.c b/drivers/char/ftape/lowlevel/fdc-io.c index 1704a2a57048..b2e0928e8428 100644 --- a/drivers/char/ftape/lowlevel/fdc-io.c +++ b/drivers/char/ftape/lowlevel/fdc-io.c | |||
@@ -387,10 +387,8 @@ int fdc_interrupt_wait(unsigned int time) | |||
387 | 387 | ||
388 | set_current_state(TASK_INTERRUPTIBLE); | 388 | set_current_state(TASK_INTERRUPTIBLE); |
389 | add_wait_queue(&ftape_wait_intr, &wait); | 389 | add_wait_queue(&ftape_wait_intr, &wait); |
390 | while (!ft_interrupt_seen && timeout) { | 390 | while (!ft_interrupt_seen && timeout) |
391 | set_current_state(TASK_INTERRUPTIBLE); | 391 | timeout = schedule_timeout_interruptible(timeout); |
392 | timeout = schedule_timeout(timeout); | ||
393 | } | ||
394 | 392 | ||
395 | spin_lock_irq(¤t->sighand->siglock); | 393 | spin_lock_irq(¤t->sighand->siglock); |
396 | current->blocked = old_sigmask; | 394 | current->blocked = old_sigmask; |
diff --git a/drivers/char/hangcheck-timer.c b/drivers/char/hangcheck-timer.c index 81d811edf3c5..a54bc93353af 100644 --- a/drivers/char/hangcheck-timer.c +++ b/drivers/char/hangcheck-timer.c | |||
@@ -149,8 +149,7 @@ static unsigned long long hangcheck_tsc, hangcheck_tsc_margin; | |||
149 | 149 | ||
150 | static void hangcheck_fire(unsigned long); | 150 | static void hangcheck_fire(unsigned long); |
151 | 151 | ||
152 | static struct timer_list hangcheck_ticktock = | 152 | static DEFINE_TIMER(hangcheck_ticktock, hangcheck_fire, 0, 0); |
153 | TIMER_INITIALIZER(hangcheck_fire, 0, 0); | ||
154 | 153 | ||
155 | 154 | ||
156 | static void hangcheck_fire(unsigned long data) | 155 | static void hangcheck_fire(unsigned long data) |
diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c index 5fe8461271fc..de0379b6d502 100644 --- a/drivers/char/hpet.c +++ b/drivers/char/hpet.c | |||
@@ -100,14 +100,14 @@ static struct hpets *hpets; | |||
100 | #endif | 100 | #endif |
101 | 101 | ||
102 | #ifndef readq | 102 | #ifndef readq |
103 | static unsigned long long __inline readq(void __iomem *addr) | 103 | static inline unsigned long long readq(void __iomem *addr) |
104 | { | 104 | { |
105 | return readl(addr) | (((unsigned long long)readl(addr + 4)) << 32LL); | 105 | return readl(addr) | (((unsigned long long)readl(addr + 4)) << 32LL); |
106 | } | 106 | } |
107 | #endif | 107 | #endif |
108 | 108 | ||
109 | #ifndef writeq | 109 | #ifndef writeq |
110 | static void __inline writeq(unsigned long long v, void __iomem *addr) | 110 | static inline void writeq(unsigned long long v, void __iomem *addr) |
111 | { | 111 | { |
112 | writel(v & 0xffffffff, addr); | 112 | writel(v & 0xffffffff, addr); |
113 | writel(v >> 32, addr + 4); | 113 | writel(v >> 32, addr + 4); |
diff --git a/drivers/char/hw_random.c b/drivers/char/hw_random.c index 3480535a09c5..6f673d2de0b1 100644 --- a/drivers/char/hw_random.c +++ b/drivers/char/hw_random.c | |||
@@ -513,10 +513,7 @@ static ssize_t rng_dev_read (struct file *filp, char __user *buf, size_t size, | |||
513 | return ret ? : -EAGAIN; | 513 | return ret ? : -EAGAIN; |
514 | 514 | ||
515 | if(need_resched()) | 515 | if(need_resched()) |
516 | { | 516 | schedule_timeout_interruptible(1); |
517 | current->state = TASK_INTERRUPTIBLE; | ||
518 | schedule_timeout(1); | ||
519 | } | ||
520 | else | 517 | else |
521 | udelay(200); /* FIXME: We could poll for 250uS ?? */ | 518 | udelay(200); /* FIXME: We could poll for 250uS ?? */ |
522 | 519 | ||
diff --git a/drivers/char/ip2/i2lib.c b/drivers/char/ip2/i2lib.c index 82c5f30375ac..ba85eb1b6ec7 100644 --- a/drivers/char/ip2/i2lib.c +++ b/drivers/char/ip2/i2lib.c | |||
@@ -655,8 +655,7 @@ i2QueueCommands(int type, i2ChanStrPtr pCh, int timeout, int nCommands, | |||
655 | timeout--; // So negative values == forever | 655 | timeout--; // So negative values == forever |
656 | 656 | ||
657 | if (!in_interrupt()) { | 657 | if (!in_interrupt()) { |
658 | current->state = TASK_INTERRUPTIBLE; | 658 | schedule_timeout_interruptible(1); // short nap |
659 | schedule_timeout(1); // short nap | ||
660 | } else { | 659 | } else { |
661 | // we cannot sched/sleep in interrrupt silly | 660 | // we cannot sched/sleep in interrrupt silly |
662 | return 0; | 661 | return 0; |
@@ -1132,8 +1131,7 @@ i2Output(i2ChanStrPtr pCh, const char *pSource, int count, int user ) | |||
1132 | 1131 | ||
1133 | ip2trace (CHANN, ITRC_OUTPUT, 61, 0 ); | 1132 | ip2trace (CHANN, ITRC_OUTPUT, 61, 0 ); |
1134 | 1133 | ||
1135 | current->state = TASK_INTERRUPTIBLE; | 1134 | schedule_timeout_interruptible(2); |
1136 | schedule_timeout(2); | ||
1137 | if (signal_pending(current)) { | 1135 | if (signal_pending(current)) { |
1138 | break; | 1136 | break; |
1139 | } | 1137 | } |
diff --git a/drivers/char/ip2main.c b/drivers/char/ip2main.c index cf0cd58d6305..9e4e26aef94e 100644 --- a/drivers/char/ip2main.c +++ b/drivers/char/ip2main.c | |||
@@ -120,7 +120,6 @@ | |||
120 | 120 | ||
121 | #include <linux/vmalloc.h> | 121 | #include <linux/vmalloc.h> |
122 | #include <linux/init.h> | 122 | #include <linux/init.h> |
123 | #include <asm/serial.h> | ||
124 | 123 | ||
125 | #include <asm/uaccess.h> | 124 | #include <asm/uaccess.h> |
126 | 125 | ||
@@ -255,7 +254,7 @@ static unsigned long bh_counter = 0; | |||
255 | * selected, the board is serviced periodically to see if anything needs doing. | 254 | * selected, the board is serviced periodically to see if anything needs doing. |
256 | */ | 255 | */ |
257 | #define POLL_TIMEOUT (jiffies + 1) | 256 | #define POLL_TIMEOUT (jiffies + 1) |
258 | static struct timer_list PollTimer = TIMER_INITIALIZER(ip2_poll, 0, 0); | 257 | static DEFINE_TIMER(PollTimer, ip2_poll, 0, 0); |
259 | static char TimerOn; | 258 | static char TimerOn; |
260 | 259 | ||
261 | #ifdef IP2DEBUG_TRACE | 260 | #ifdef IP2DEBUG_TRACE |
diff --git a/drivers/char/ipmi/ipmi_devintf.c b/drivers/char/ipmi/ipmi_devintf.c index 883ac4352be4..a09ff1080687 100644 --- a/drivers/char/ipmi/ipmi_devintf.c +++ b/drivers/char/ipmi/ipmi_devintf.c | |||
@@ -735,7 +735,8 @@ static long compat_ipmi_ioctl(struct file *filep, unsigned int cmd, | |||
735 | case COMPAT_IPMICTL_RECEIVE_MSG: | 735 | case COMPAT_IPMICTL_RECEIVE_MSG: |
736 | case COMPAT_IPMICTL_RECEIVE_MSG_TRUNC: | 736 | case COMPAT_IPMICTL_RECEIVE_MSG_TRUNC: |
737 | { | 737 | { |
738 | struct ipmi_recv *precv64, recv64; | 738 | struct ipmi_recv __user *precv64; |
739 | struct ipmi_recv recv64; | ||
739 | 740 | ||
740 | if (get_compat_ipmi_recv(&recv64, compat_ptr(arg))) | 741 | if (get_compat_ipmi_recv(&recv64, compat_ptr(arg))) |
741 | return -EFAULT; | 742 | return -EFAULT; |
@@ -748,7 +749,7 @@ static long compat_ipmi_ioctl(struct file *filep, unsigned int cmd, | |||
748 | ((cmd == COMPAT_IPMICTL_RECEIVE_MSG) | 749 | ((cmd == COMPAT_IPMICTL_RECEIVE_MSG) |
749 | ? IPMICTL_RECEIVE_MSG | 750 | ? IPMICTL_RECEIVE_MSG |
750 | : IPMICTL_RECEIVE_MSG_TRUNC), | 751 | : IPMICTL_RECEIVE_MSG_TRUNC), |
751 | (long) precv64); | 752 | (unsigned long) precv64); |
752 | if (rc != 0) | 753 | if (rc != 0) |
753 | return rc; | 754 | return rc; |
754 | 755 | ||
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 278f84104996..b6e5cbfb09f8 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
@@ -1920,8 +1920,7 @@ static int try_get_dev_id(struct smi_info *smi_info) | |||
1920 | for (;;) | 1920 | for (;;) |
1921 | { | 1921 | { |
1922 | if (smi_result == SI_SM_CALL_WITH_DELAY) { | 1922 | if (smi_result == SI_SM_CALL_WITH_DELAY) { |
1923 | set_current_state(TASK_UNINTERRUPTIBLE); | 1923 | schedule_timeout_uninterruptible(1); |
1924 | schedule_timeout(1); | ||
1925 | smi_result = smi_info->handlers->event( | 1924 | smi_result = smi_info->handlers->event( |
1926 | smi_info->si_sm, 100); | 1925 | smi_info->si_sm, 100); |
1927 | } | 1926 | } |
@@ -2256,10 +2255,8 @@ static int init_one_smi(int intf_num, struct smi_info **smi) | |||
2256 | 2255 | ||
2257 | /* Wait for the timer to stop. This avoids problems with race | 2256 | /* Wait for the timer to stop. This avoids problems with race |
2258 | conditions removing the timer here. */ | 2257 | conditions removing the timer here. */ |
2259 | while (! new_smi->timer_stopped) { | 2258 | while (!new_smi->timer_stopped) |
2260 | set_current_state(TASK_UNINTERRUPTIBLE); | 2259 | schedule_timeout_uninterruptible(1); |
2261 | schedule_timeout(1); | ||
2262 | } | ||
2263 | 2260 | ||
2264 | out_err: | 2261 | out_err: |
2265 | if (new_smi->intf) | 2262 | if (new_smi->intf) |
@@ -2379,17 +2376,14 @@ static void __exit cleanup_one_si(struct smi_info *to_clean) | |||
2379 | 2376 | ||
2380 | /* Wait for the timer to stop. This avoids problems with race | 2377 | /* Wait for the timer to stop. This avoids problems with race |
2381 | conditions removing the timer here. */ | 2378 | conditions removing the timer here. */ |
2382 | while (! to_clean->timer_stopped) { | 2379 | while (!to_clean->timer_stopped) |
2383 | set_current_state(TASK_UNINTERRUPTIBLE); | 2380 | schedule_timeout_uninterruptible(1); |
2384 | schedule_timeout(1); | ||
2385 | } | ||
2386 | 2381 | ||
2387 | /* Interrupts and timeouts are stopped, now make sure the | 2382 | /* Interrupts and timeouts are stopped, now make sure the |
2388 | interface is in a clean state. */ | 2383 | interface is in a clean state. */ |
2389 | while (to_clean->curr_msg || (to_clean->si_state != SI_NORMAL)) { | 2384 | while (to_clean->curr_msg || (to_clean->si_state != SI_NORMAL)) { |
2390 | poll(to_clean); | 2385 | poll(to_clean); |
2391 | set_current_state(TASK_UNINTERRUPTIBLE); | 2386 | schedule_timeout_uninterruptible(1); |
2392 | schedule_timeout(1); | ||
2393 | } | 2387 | } |
2394 | 2388 | ||
2395 | rv = ipmi_unregister_smi(to_clean->intf); | 2389 | rv = ipmi_unregister_smi(to_clean->intf); |
diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c index e71aaae855ad..2da64bf7469c 100644 --- a/drivers/char/ipmi/ipmi_watchdog.c +++ b/drivers/char/ipmi/ipmi_watchdog.c | |||
@@ -1037,10 +1037,8 @@ static __exit void ipmi_unregister_watchdog(void) | |||
1037 | /* Wait to make sure the message makes it out. The lower layer has | 1037 | /* Wait to make sure the message makes it out. The lower layer has |
1038 | pointers to our buffers, we want to make sure they are done before | 1038 | pointers to our buffers, we want to make sure they are done before |
1039 | we release our memory. */ | 1039 | we release our memory. */ |
1040 | while (atomic_read(&set_timeout_tofree)) { | 1040 | while (atomic_read(&set_timeout_tofree)) |
1041 | set_current_state(TASK_UNINTERRUPTIBLE); | 1041 | schedule_timeout_uninterruptible(1); |
1042 | schedule_timeout(1); | ||
1043 | } | ||
1044 | 1042 | ||
1045 | /* Disconnect from IPMI. */ | 1043 | /* Disconnect from IPMI. */ |
1046 | rv = ipmi_destroy_user(watchdog_user); | 1044 | rv = ipmi_destroy_user(watchdog_user); |
diff --git a/drivers/char/istallion.c b/drivers/char/istallion.c index 52a073eee201..9c19e5435a11 100644 --- a/drivers/char/istallion.c +++ b/drivers/char/istallion.c | |||
@@ -780,7 +780,7 @@ static struct file_operations stli_fsiomem = { | |||
780 | * much cheaper on host cpu than using interrupts. It turns out to | 780 | * much cheaper on host cpu than using interrupts. It turns out to |
781 | * not increase character latency by much either... | 781 | * not increase character latency by much either... |
782 | */ | 782 | */ |
783 | static struct timer_list stli_timerlist = TIMER_INITIALIZER(stli_poll, 0, 0); | 783 | static DEFINE_TIMER(stli_timerlist, stli_poll, 0, 0); |
784 | 784 | ||
785 | static int stli_timeron; | 785 | static int stli_timeron; |
786 | 786 | ||
diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c index 523fd3c8bbaa..1745065d8f78 100644 --- a/drivers/char/keyboard.c +++ b/drivers/char/keyboard.c | |||
@@ -233,8 +233,7 @@ static void kd_nosound(unsigned long ignored) | |||
233 | } | 233 | } |
234 | } | 234 | } |
235 | 235 | ||
236 | static struct timer_list kd_mksound_timer = | 236 | static DEFINE_TIMER(kd_mksound_timer, kd_nosound, 0, 0); |
237 | TIMER_INITIALIZER(kd_nosound, 0, 0); | ||
238 | 237 | ||
239 | void kd_mksound(unsigned int hz, unsigned int ticks) | 238 | void kd_mksound(unsigned int hz, unsigned int ticks) |
240 | { | 239 | { |
diff --git a/drivers/char/lcd.c b/drivers/char/lcd.c index cf01a720eb2e..b77161146144 100644 --- a/drivers/char/lcd.c +++ b/drivers/char/lcd.c | |||
@@ -613,10 +613,15 @@ static struct miscdevice lcd_dev = { | |||
613 | 613 | ||
614 | static int lcd_init(void) | 614 | static int lcd_init(void) |
615 | { | 615 | { |
616 | int ret; | ||
616 | unsigned long data; | 617 | unsigned long data; |
617 | 618 | ||
618 | pr_info("%s\n", LCD_DRIVER); | 619 | pr_info("%s\n", LCD_DRIVER); |
619 | misc_register(&lcd_dev); | 620 | ret = misc_register(&lcd_dev); |
621 | if (ret) { | ||
622 | printk(KERN_WARNING LCD "Unable to register misc device.\n"); | ||
623 | return ret; | ||
624 | } | ||
620 | 625 | ||
621 | /* Check region? Naaah! Just snarf it up. */ | 626 | /* Check region? Naaah! Just snarf it up. */ |
622 | /* request_region(RTC_PORT(0), RTC_IO_EXTENT, "lcd");*/ | 627 | /* request_region(RTC_PORT(0), RTC_IO_EXTENT, "lcd");*/ |
diff --git a/drivers/char/lp.c b/drivers/char/lp.c index 59eebe5a035f..2afb9038dbc5 100644 --- a/drivers/char/lp.c +++ b/drivers/char/lp.c | |||
@@ -128,6 +128,7 @@ | |||
128 | #include <linux/console.h> | 128 | #include <linux/console.h> |
129 | #include <linux/device.h> | 129 | #include <linux/device.h> |
130 | #include <linux/wait.h> | 130 | #include <linux/wait.h> |
131 | #include <linux/jiffies.h> | ||
131 | 132 | ||
132 | #include <linux/parport.h> | 133 | #include <linux/parport.h> |
133 | #undef LP_STATS | 134 | #undef LP_STATS |
@@ -307,7 +308,7 @@ static ssize_t lp_write(struct file * file, const char __user * buf, | |||
307 | (LP_F(minor) & LP_ABORT)); | 308 | (LP_F(minor) & LP_ABORT)); |
308 | 309 | ||
309 | #ifdef LP_STATS | 310 | #ifdef LP_STATS |
310 | if (jiffies-lp_table[minor].lastcall > LP_TIME(minor)) | 311 | if (time_after(jiffies, lp_table[minor].lastcall + LP_TIME(minor))) |
311 | lp_table[minor].runchars = 0; | 312 | lp_table[minor].runchars = 0; |
312 | 313 | ||
313 | lp_table[minor].lastcall = jiffies; | 314 | lp_table[minor].lastcall = jiffies; |
diff --git a/drivers/char/mxser.c b/drivers/char/mxser.c index d0ef1ae41298..45d012d85e8c 100644 --- a/drivers/char/mxser.c +++ b/drivers/char/mxser.c | |||
@@ -1058,8 +1058,7 @@ static void mxser_close(struct tty_struct *tty, struct file *filp) | |||
1058 | */ | 1058 | */ |
1059 | timeout = jiffies + HZ; | 1059 | timeout = jiffies + HZ; |
1060 | while (!(inb(info->base + UART_LSR) & UART_LSR_TEMT)) { | 1060 | while (!(inb(info->base + UART_LSR) & UART_LSR_TEMT)) { |
1061 | set_current_state(TASK_INTERRUPTIBLE); | 1061 | schedule_timeout_interruptible(5); |
1062 | schedule_timeout(5); | ||
1063 | if (time_after(jiffies, timeout)) | 1062 | if (time_after(jiffies, timeout)) |
1064 | break; | 1063 | break; |
1065 | } | 1064 | } |
@@ -1080,10 +1079,8 @@ static void mxser_close(struct tty_struct *tty, struct file *filp) | |||
1080 | info->event = 0; | 1079 | info->event = 0; |
1081 | info->tty = NULL; | 1080 | info->tty = NULL; |
1082 | if (info->blocked_open) { | 1081 | if (info->blocked_open) { |
1083 | if (info->close_delay) { | 1082 | if (info->close_delay) |
1084 | set_current_state(TASK_INTERRUPTIBLE); | 1083 | schedule_timeout_interruptible(info->close_delay); |
1085 | schedule_timeout(info->close_delay); | ||
1086 | } | ||
1087 | wake_up_interruptible(&info->open_wait); | 1084 | wake_up_interruptible(&info->open_wait); |
1088 | } | 1085 | } |
1089 | 1086 | ||
@@ -1801,8 +1798,7 @@ static void mxser_wait_until_sent(struct tty_struct *tty, int timeout) | |||
1801 | #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT | 1798 | #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT |
1802 | printk("lsr = %d (jiff=%lu)...", lsr, jiffies); | 1799 | printk("lsr = %d (jiff=%lu)...", lsr, jiffies); |
1803 | #endif | 1800 | #endif |
1804 | set_current_state(TASK_INTERRUPTIBLE); | 1801 | schedule_timeout_interruptible(char_time); |
1805 | schedule_timeout(char_time); | ||
1806 | if (signal_pending(current)) | 1802 | if (signal_pending(current)) |
1807 | break; | 1803 | break; |
1808 | if (timeout && time_after(jiffies, orig_jiffies + timeout)) | 1804 | if (timeout && time_after(jiffies, orig_jiffies + timeout)) |
diff --git a/drivers/char/n_tty.c b/drivers/char/n_tty.c index 09103b3d8f05..c9bdf544ed2c 100644 --- a/drivers/char/n_tty.c +++ b/drivers/char/n_tty.c | |||
@@ -62,7 +62,7 @@ | |||
62 | 62 | ||
63 | static inline unsigned char *alloc_buf(void) | 63 | static inline unsigned char *alloc_buf(void) |
64 | { | 64 | { |
65 | int prio = in_interrupt() ? GFP_ATOMIC : GFP_KERNEL; | 65 | unsigned int prio = in_interrupt() ? GFP_ATOMIC : GFP_KERNEL; |
66 | 66 | ||
67 | if (PAGE_SIZE != N_TTY_BUF_SIZE) | 67 | if (PAGE_SIZE != N_TTY_BUF_SIZE) |
68 | return kmalloc(N_TTY_BUF_SIZE, prio); | 68 | return kmalloc(N_TTY_BUF_SIZE, prio); |
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c index 7a0c74648124..02d7f046c10a 100644 --- a/drivers/char/pcmcia/synclink_cs.c +++ b/drivers/char/pcmcia/synclink_cs.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/char/pcmcia/synclink_cs.c | 2 | * linux/drivers/char/pcmcia/synclink_cs.c |
3 | * | 3 | * |
4 | * $Id: synclink_cs.c,v 4.26 2004/08/11 19:30:02 paulkf Exp $ | 4 | * $Id: synclink_cs.c,v 4.34 2005/09/08 13:20:54 paulkf Exp $ |
5 | * | 5 | * |
6 | * Device driver for Microgate SyncLink PC Card | 6 | * Device driver for Microgate SyncLink PC Card |
7 | * multiprotocol serial adapter. | 7 | * multiprotocol serial adapter. |
@@ -472,7 +472,7 @@ module_param_array(dosyncppp, int, NULL, 0); | |||
472 | MODULE_LICENSE("GPL"); | 472 | MODULE_LICENSE("GPL"); |
473 | 473 | ||
474 | static char *driver_name = "SyncLink PC Card driver"; | 474 | static char *driver_name = "SyncLink PC Card driver"; |
475 | static char *driver_version = "$Revision: 4.26 $"; | 475 | static char *driver_version = "$Revision: 4.34 $"; |
476 | 476 | ||
477 | static struct tty_driver *serial_driver; | 477 | static struct tty_driver *serial_driver; |
478 | 478 | ||
@@ -1457,6 +1457,8 @@ static int startup(MGSLPC_INFO * info) | |||
1457 | 1457 | ||
1458 | info->pending_bh = 0; | 1458 | info->pending_bh = 0; |
1459 | 1459 | ||
1460 | memset(&info->icount, 0, sizeof(info->icount)); | ||
1461 | |||
1460 | init_timer(&info->tx_timer); | 1462 | init_timer(&info->tx_timer); |
1461 | info->tx_timer.data = (unsigned long)info; | 1463 | info->tx_timer.data = (unsigned long)info; |
1462 | info->tx_timer.function = tx_timeout; | 1464 | info->tx_timer.function = tx_timeout; |
@@ -1946,9 +1948,13 @@ static int get_stats(MGSLPC_INFO * info, struct mgsl_icount __user *user_icount) | |||
1946 | int err; | 1948 | int err; |
1947 | if (debug_level >= DEBUG_LEVEL_INFO) | 1949 | if (debug_level >= DEBUG_LEVEL_INFO) |
1948 | printk("get_params(%s)\n", info->device_name); | 1950 | printk("get_params(%s)\n", info->device_name); |
1949 | COPY_TO_USER(err,user_icount, &info->icount, sizeof(struct mgsl_icount)); | 1951 | if (!user_icount) { |
1950 | if (err) | 1952 | memset(&info->icount, 0, sizeof(info->icount)); |
1951 | return -EFAULT; | 1953 | } else { |
1954 | COPY_TO_USER(err, user_icount, &info->icount, sizeof(struct mgsl_icount)); | ||
1955 | if (err) | ||
1956 | return -EFAULT; | ||
1957 | } | ||
1952 | return 0; | 1958 | return 0; |
1953 | } | 1959 | } |
1954 | 1960 | ||
diff --git a/drivers/char/pty.c b/drivers/char/pty.c index da32889d22c0..49f3997fd251 100644 --- a/drivers/char/pty.c +++ b/drivers/char/pty.c | |||
@@ -149,15 +149,14 @@ static int pty_write_room(struct tty_struct *tty) | |||
149 | static int pty_chars_in_buffer(struct tty_struct *tty) | 149 | static int pty_chars_in_buffer(struct tty_struct *tty) |
150 | { | 150 | { |
151 | struct tty_struct *to = tty->link; | 151 | struct tty_struct *to = tty->link; |
152 | ssize_t (*chars_in_buffer)(struct tty_struct *); | ||
153 | int count; | 152 | int count; |
154 | 153 | ||
155 | /* We should get the line discipline lock for "tty->link" */ | 154 | /* We should get the line discipline lock for "tty->link" */ |
156 | if (!to || !(chars_in_buffer = to->ldisc.chars_in_buffer)) | 155 | if (!to || !to->ldisc.chars_in_buffer) |
157 | return 0; | 156 | return 0; |
158 | 157 | ||
159 | /* The ldisc must report 0 if no characters available to be read */ | 158 | /* The ldisc must report 0 if no characters available to be read */ |
160 | count = chars_in_buffer(to); | 159 | count = to->ldisc.chars_in_buffer(to); |
161 | 160 | ||
162 | if (tty->driver->subtype == PTY_TYPE_SLAVE) return count; | 161 | if (tty->driver->subtype == PTY_TYPE_SLAVE) return count; |
163 | 162 | ||
diff --git a/drivers/char/synclink.c b/drivers/char/synclink.c index 37c8bea8e2b0..ea2d54be4843 100644 --- a/drivers/char/synclink.c +++ b/drivers/char/synclink.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/char/synclink.c | 2 | * linux/drivers/char/synclink.c |
3 | * | 3 | * |
4 | * $Id: synclink.c,v 4.28 2004/08/11 19:30:01 paulkf Exp $ | 4 | * $Id: synclink.c,v 4.37 2005/09/07 13:13:19 paulkf Exp $ |
5 | * | 5 | * |
6 | * Device driver for Microgate SyncLink ISA and PCI | 6 | * Device driver for Microgate SyncLink ISA and PCI |
7 | * high speed multiprotocol serial adapters. | 7 | * high speed multiprotocol serial adapters. |
@@ -141,9 +141,9 @@ static MGSL_PARAMS default_params = { | |||
141 | typedef struct _DMABUFFERENTRY | 141 | typedef struct _DMABUFFERENTRY |
142 | { | 142 | { |
143 | u32 phys_addr; /* 32-bit flat physical address of data buffer */ | 143 | u32 phys_addr; /* 32-bit flat physical address of data buffer */ |
144 | u16 count; /* buffer size/data count */ | 144 | volatile u16 count; /* buffer size/data count */ |
145 | u16 status; /* Control/status field */ | 145 | volatile u16 status; /* Control/status field */ |
146 | u16 rcc; /* character count field */ | 146 | volatile u16 rcc; /* character count field */ |
147 | u16 reserved; /* padding required by 16C32 */ | 147 | u16 reserved; /* padding required by 16C32 */ |
148 | u32 link; /* 32-bit flat link to next buffer entry */ | 148 | u32 link; /* 32-bit flat link to next buffer entry */ |
149 | char *virt_addr; /* virtual address of data buffer */ | 149 | char *virt_addr; /* virtual address of data buffer */ |
@@ -896,7 +896,7 @@ module_param_array(txdmabufs, int, NULL, 0); | |||
896 | module_param_array(txholdbufs, int, NULL, 0); | 896 | module_param_array(txholdbufs, int, NULL, 0); |
897 | 897 | ||
898 | static char *driver_name = "SyncLink serial driver"; | 898 | static char *driver_name = "SyncLink serial driver"; |
899 | static char *driver_version = "$Revision: 4.28 $"; | 899 | static char *driver_version = "$Revision: 4.37 $"; |
900 | 900 | ||
901 | static int synclink_init_one (struct pci_dev *dev, | 901 | static int synclink_init_one (struct pci_dev *dev, |
902 | const struct pci_device_id *ent); | 902 | const struct pci_device_id *ent); |
@@ -1814,6 +1814,8 @@ static int startup(struct mgsl_struct * info) | |||
1814 | 1814 | ||
1815 | info->pending_bh = 0; | 1815 | info->pending_bh = 0; |
1816 | 1816 | ||
1817 | memset(&info->icount, 0, sizeof(info->icount)); | ||
1818 | |||
1817 | init_timer(&info->tx_timer); | 1819 | init_timer(&info->tx_timer); |
1818 | info->tx_timer.data = (unsigned long)info; | 1820 | info->tx_timer.data = (unsigned long)info; |
1819 | info->tx_timer.function = mgsl_tx_timeout; | 1821 | info->tx_timer.function = mgsl_tx_timeout; |
@@ -2470,12 +2472,12 @@ static int mgsl_get_stats(struct mgsl_struct * info, struct mgsl_icount __user * | |||
2470 | printk("%s(%d):mgsl_get_params(%s)\n", | 2472 | printk("%s(%d):mgsl_get_params(%s)\n", |
2471 | __FILE__,__LINE__, info->device_name); | 2473 | __FILE__,__LINE__, info->device_name); |
2472 | 2474 | ||
2473 | COPY_TO_USER(err,user_icount, &info->icount, sizeof(struct mgsl_icount)); | 2475 | if (!user_icount) { |
2474 | if (err) { | 2476 | memset(&info->icount, 0, sizeof(info->icount)); |
2475 | if ( debug_level >= DEBUG_LEVEL_INFO ) | 2477 | } else { |
2476 | printk( "%s(%d):mgsl_get_stats(%s) user buffer copy failed\n", | 2478 | COPY_TO_USER(err, user_icount, &info->icount, sizeof(struct mgsl_icount)); |
2477 | __FILE__,__LINE__,info->device_name); | 2479 | if (err) |
2478 | return -EFAULT; | 2480 | return -EFAULT; |
2479 | } | 2481 | } |
2480 | 2482 | ||
2481 | return 0; | 2483 | return 0; |
@@ -6149,6 +6151,11 @@ static void usc_set_async_mode( struct mgsl_struct *info ) | |||
6149 | usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT13) & ~BIT12)); | 6151 | usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT13) & ~BIT12)); |
6150 | } | 6152 | } |
6151 | 6153 | ||
6154 | if (info->params.loopback) { | ||
6155 | info->loopback_bits = 0x300; | ||
6156 | outw(0x0300, info->io_base + CCAR); | ||
6157 | } | ||
6158 | |||
6152 | } /* end of usc_set_async_mode() */ | 6159 | } /* end of usc_set_async_mode() */ |
6153 | 6160 | ||
6154 | /* usc_loopback_frame() | 6161 | /* usc_loopback_frame() |
diff --git a/drivers/char/synclinkmp.c b/drivers/char/synclinkmp.c index ec949e4c070f..6fb165cf8a61 100644 --- a/drivers/char/synclinkmp.c +++ b/drivers/char/synclinkmp.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: synclinkmp.c,v 4.34 2005/03/04 15:07:10 paulkf Exp $ | 2 | * $Id: synclinkmp.c,v 4.38 2005/07/15 13:29:44 paulkf Exp $ |
3 | * | 3 | * |
4 | * Device driver for Microgate SyncLink Multiport | 4 | * Device driver for Microgate SyncLink Multiport |
5 | * high speed multiprotocol serial adapter. | 5 | * high speed multiprotocol serial adapter. |
@@ -55,7 +55,6 @@ | |||
55 | #include <linux/netdevice.h> | 55 | #include <linux/netdevice.h> |
56 | #include <linux/vmalloc.h> | 56 | #include <linux/vmalloc.h> |
57 | #include <linux/init.h> | 57 | #include <linux/init.h> |
58 | #include <asm/serial.h> | ||
59 | #include <linux/delay.h> | 58 | #include <linux/delay.h> |
60 | #include <linux/ioctl.h> | 59 | #include <linux/ioctl.h> |
61 | 60 | ||
@@ -487,7 +486,7 @@ module_param_array(maxframe, int, NULL, 0); | |||
487 | module_param_array(dosyncppp, int, NULL, 0); | 486 | module_param_array(dosyncppp, int, NULL, 0); |
488 | 487 | ||
489 | static char *driver_name = "SyncLink MultiPort driver"; | 488 | static char *driver_name = "SyncLink MultiPort driver"; |
490 | static char *driver_version = "$Revision: 4.34 $"; | 489 | static char *driver_version = "$Revision: 4.38 $"; |
491 | 490 | ||
492 | static int synclinkmp_init_one(struct pci_dev *dev,const struct pci_device_id *ent); | 491 | static int synclinkmp_init_one(struct pci_dev *dev,const struct pci_device_id *ent); |
493 | static void synclinkmp_remove_one(struct pci_dev *dev); | 492 | static void synclinkmp_remove_one(struct pci_dev *dev); |
@@ -556,7 +555,6 @@ static int set_txidle(SLMP_INFO *info, int idle_mode); | |||
556 | static int tx_enable(SLMP_INFO *info, int enable); | 555 | static int tx_enable(SLMP_INFO *info, int enable); |
557 | static int tx_abort(SLMP_INFO *info); | 556 | static int tx_abort(SLMP_INFO *info); |
558 | static int rx_enable(SLMP_INFO *info, int enable); | 557 | static int rx_enable(SLMP_INFO *info, int enable); |
559 | static int map_status(int signals); | ||
560 | static int modem_input_wait(SLMP_INFO *info,int arg); | 558 | static int modem_input_wait(SLMP_INFO *info,int arg); |
561 | static int wait_mgsl_event(SLMP_INFO *info, int __user *mask_ptr); | 559 | static int wait_mgsl_event(SLMP_INFO *info, int __user *mask_ptr); |
562 | static int tiocmget(struct tty_struct *tty, struct file *file); | 560 | static int tiocmget(struct tty_struct *tty, struct file *file); |
@@ -645,7 +643,7 @@ static unsigned char tx_active_fifo_level = 16; // tx request FIFO activation le | |||
645 | static unsigned char tx_negate_fifo_level = 32; // tx request FIFO negation level in bytes | 643 | static unsigned char tx_negate_fifo_level = 32; // tx request FIFO negation level in bytes |
646 | 644 | ||
647 | static u32 misc_ctrl_value = 0x007e4040; | 645 | static u32 misc_ctrl_value = 0x007e4040; |
648 | static u32 lcr1_brdr_value = 0x00800029; | 646 | static u32 lcr1_brdr_value = 0x00800028; |
649 | 647 | ||
650 | static u32 read_ahead_count = 8; | 648 | static u32 read_ahead_count = 8; |
651 | 649 | ||
@@ -2750,6 +2748,8 @@ static int startup(SLMP_INFO * info) | |||
2750 | 2748 | ||
2751 | info->pending_bh = 0; | 2749 | info->pending_bh = 0; |
2752 | 2750 | ||
2751 | memset(&info->icount, 0, sizeof(info->icount)); | ||
2752 | |||
2753 | /* program hardware for current parameters */ | 2753 | /* program hardware for current parameters */ |
2754 | reset_port(info); | 2754 | reset_port(info); |
2755 | 2755 | ||
@@ -2953,12 +2953,12 @@ static int get_stats(SLMP_INFO * info, struct mgsl_icount __user *user_icount) | |||
2953 | printk("%s(%d):%s get_params()\n", | 2953 | printk("%s(%d):%s get_params()\n", |
2954 | __FILE__,__LINE__, info->device_name); | 2954 | __FILE__,__LINE__, info->device_name); |
2955 | 2955 | ||
2956 | COPY_TO_USER(err,user_icount, &info->icount, sizeof(struct mgsl_icount)); | 2956 | if (!user_icount) { |
2957 | if (err) { | 2957 | memset(&info->icount, 0, sizeof(info->icount)); |
2958 | if ( debug_level >= DEBUG_LEVEL_INFO ) | 2958 | } else { |
2959 | printk( "%s(%d):%s get_stats() user buffer copy failed\n", | 2959 | COPY_TO_USER(err, user_icount, &info->icount, sizeof(struct mgsl_icount)); |
2960 | __FILE__,__LINE__,info->device_name); | 2960 | if (err) |
2961 | return -EFAULT; | 2961 | return -EFAULT; |
2962 | } | 2962 | } |
2963 | 2963 | ||
2964 | return 0; | 2964 | return 0; |
@@ -3109,16 +3109,6 @@ static int rx_enable(SLMP_INFO * info, int enable) | |||
3109 | return 0; | 3109 | return 0; |
3110 | } | 3110 | } |
3111 | 3111 | ||
3112 | static int map_status(int signals) | ||
3113 | { | ||
3114 | /* Map status bits to API event bits */ | ||
3115 | |||
3116 | return ((signals & SerialSignal_DSR) ? MgslEvent_DsrActive : MgslEvent_DsrInactive) + | ||
3117 | ((signals & SerialSignal_CTS) ? MgslEvent_CtsActive : MgslEvent_CtsInactive) + | ||
3118 | ((signals & SerialSignal_DCD) ? MgslEvent_DcdActive : MgslEvent_DcdInactive) + | ||
3119 | ((signals & SerialSignal_RI) ? MgslEvent_RiActive : MgslEvent_RiInactive); | ||
3120 | } | ||
3121 | |||
3122 | /* wait for specified event to occur | 3112 | /* wait for specified event to occur |
3123 | */ | 3113 | */ |
3124 | static int wait_mgsl_event(SLMP_INFO * info, int __user *mask_ptr) | 3114 | static int wait_mgsl_event(SLMP_INFO * info, int __user *mask_ptr) |
@@ -3145,7 +3135,7 @@ static int wait_mgsl_event(SLMP_INFO * info, int __user *mask_ptr) | |||
3145 | 3135 | ||
3146 | /* return immediately if state matches requested events */ | 3136 | /* return immediately if state matches requested events */ |
3147 | get_signals(info); | 3137 | get_signals(info); |
3148 | s = map_status(info->serial_signals); | 3138 | s = info->serial_signals; |
3149 | 3139 | ||
3150 | events = mask & | 3140 | events = mask & |
3151 | ( ((s & SerialSignal_DSR) ? MgslEvent_DsrActive:MgslEvent_DsrInactive) + | 3141 | ( ((s & SerialSignal_DSR) ? MgslEvent_DsrActive:MgslEvent_DsrInactive) + |
@@ -4489,11 +4479,13 @@ void async_mode(SLMP_INFO *info) | |||
4489 | /* MD2, Mode Register 2 | 4479 | /* MD2, Mode Register 2 |
4490 | * | 4480 | * |
4491 | * 07..02 Reserved, must be 0 | 4481 | * 07..02 Reserved, must be 0 |
4492 | * 01..00 CNCT<1..0> Channel connection, 0=normal | 4482 | * 01..00 CNCT<1..0> Channel connection, 00=normal 11=local loopback |
4493 | * | 4483 | * |
4494 | * 0000 0000 | 4484 | * 0000 0000 |
4495 | */ | 4485 | */ |
4496 | RegValue = 0x00; | 4486 | RegValue = 0x00; |
4487 | if (info->params.loopback) | ||
4488 | RegValue |= (BIT1 + BIT0); | ||
4497 | write_reg(info, MD2, RegValue); | 4489 | write_reg(info, MD2, RegValue); |
4498 | 4490 | ||
4499 | /* RXS, Receive clock source | 4491 | /* RXS, Receive clock source |
@@ -4574,9 +4566,6 @@ void async_mode(SLMP_INFO *info) | |||
4574 | write_reg(info, IE2, info->ie2_value); | 4566 | write_reg(info, IE2, info->ie2_value); |
4575 | 4567 | ||
4576 | set_rate( info, info->params.data_rate * 16 ); | 4568 | set_rate( info, info->params.data_rate * 16 ); |
4577 | |||
4578 | if (info->params.loopback) | ||
4579 | enable_loopback(info,1); | ||
4580 | } | 4569 | } |
4581 | 4570 | ||
4582 | /* Program the SCA for HDLC communications. | 4571 | /* Program the SCA for HDLC communications. |
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index 9d657127f313..e5953f3433f3 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
@@ -469,21 +469,19 @@ static void tty_ldisc_enable(struct tty_struct *tty) | |||
469 | 469 | ||
470 | static int tty_set_ldisc(struct tty_struct *tty, int ldisc) | 470 | static int tty_set_ldisc(struct tty_struct *tty, int ldisc) |
471 | { | 471 | { |
472 | int retval = 0; | 472 | int retval = 0; |
473 | struct tty_ldisc o_ldisc; | 473 | struct tty_ldisc o_ldisc; |
474 | char buf[64]; | 474 | char buf[64]; |
475 | int work; | 475 | int work; |
476 | unsigned long flags; | 476 | unsigned long flags; |
477 | struct tty_ldisc *ld; | 477 | struct tty_ldisc *ld; |
478 | struct tty_struct *o_tty; | ||
478 | 479 | ||
479 | if ((ldisc < N_TTY) || (ldisc >= NR_LDISCS)) | 480 | if ((ldisc < N_TTY) || (ldisc >= NR_LDISCS)) |
480 | return -EINVAL; | 481 | return -EINVAL; |
481 | 482 | ||
482 | restart: | 483 | restart: |
483 | 484 | ||
484 | if (tty->ldisc.num == ldisc) | ||
485 | return 0; /* We are already in the desired discipline */ | ||
486 | |||
487 | ld = tty_ldisc_get(ldisc); | 485 | ld = tty_ldisc_get(ldisc); |
488 | /* Eduardo Blanco <ejbs@cs.cs.com.uy> */ | 486 | /* Eduardo Blanco <ejbs@cs.cs.com.uy> */ |
489 | /* Cyrus Durgin <cider@speakeasy.org> */ | 487 | /* Cyrus Durgin <cider@speakeasy.org> */ |
@@ -494,45 +492,74 @@ restart: | |||
494 | if (ld == NULL) | 492 | if (ld == NULL) |
495 | return -EINVAL; | 493 | return -EINVAL; |
496 | 494 | ||
497 | o_ldisc = tty->ldisc; | ||
498 | |||
499 | tty_wait_until_sent(tty, 0); | 495 | tty_wait_until_sent(tty, 0); |
500 | 496 | ||
497 | if (tty->ldisc.num == ldisc) { | ||
498 | tty_ldisc_put(ldisc); | ||
499 | return 0; | ||
500 | } | ||
501 | |||
502 | o_ldisc = tty->ldisc; | ||
503 | o_tty = tty->link; | ||
504 | |||
501 | /* | 505 | /* |
502 | * Make sure we don't change while someone holds a | 506 | * Make sure we don't change while someone holds a |
503 | * reference to the line discipline. The TTY_LDISC bit | 507 | * reference to the line discipline. The TTY_LDISC bit |
504 | * prevents anyone taking a reference once it is clear. | 508 | * prevents anyone taking a reference once it is clear. |
505 | * We need the lock to avoid racing reference takers. | 509 | * We need the lock to avoid racing reference takers. |
506 | */ | 510 | */ |
507 | 511 | ||
508 | spin_lock_irqsave(&tty_ldisc_lock, flags); | 512 | spin_lock_irqsave(&tty_ldisc_lock, flags); |
509 | if(tty->ldisc.refcount) | 513 | if (tty->ldisc.refcount || (o_tty && o_tty->ldisc.refcount)) { |
510 | { | 514 | if(tty->ldisc.refcount) { |
511 | /* Free the new ldisc we grabbed. Must drop the lock | 515 | /* Free the new ldisc we grabbed. Must drop the lock |
512 | first. */ | 516 | first. */ |
517 | spin_unlock_irqrestore(&tty_ldisc_lock, flags); | ||
518 | tty_ldisc_put(ldisc); | ||
519 | /* | ||
520 | * There are several reasons we may be busy, including | ||
521 | * random momentary I/O traffic. We must therefore | ||
522 | * retry. We could distinguish between blocking ops | ||
523 | * and retries if we made tty_ldisc_wait() smarter. That | ||
524 | * is up for discussion. | ||
525 | */ | ||
526 | if (wait_event_interruptible(tty_ldisc_wait, tty->ldisc.refcount == 0) < 0) | ||
527 | return -ERESTARTSYS; | ||
528 | goto restart; | ||
529 | } | ||
530 | if(o_tty && o_tty->ldisc.refcount) { | ||
531 | spin_unlock_irqrestore(&tty_ldisc_lock, flags); | ||
532 | tty_ldisc_put(ldisc); | ||
533 | if (wait_event_interruptible(tty_ldisc_wait, o_tty->ldisc.refcount == 0) < 0) | ||
534 | return -ERESTARTSYS; | ||
535 | goto restart; | ||
536 | } | ||
537 | } | ||
538 | |||
539 | /* if the TTY_LDISC bit is set, then we are racing against another ldisc change */ | ||
540 | |||
541 | if (!test_bit(TTY_LDISC, &tty->flags)) { | ||
513 | spin_unlock_irqrestore(&tty_ldisc_lock, flags); | 542 | spin_unlock_irqrestore(&tty_ldisc_lock, flags); |
514 | tty_ldisc_put(ldisc); | 543 | tty_ldisc_put(ldisc); |
515 | /* | 544 | ld = tty_ldisc_ref_wait(tty); |
516 | * There are several reasons we may be busy, including | 545 | tty_ldisc_deref(ld); |
517 | * random momentary I/O traffic. We must therefore | ||
518 | * retry. We could distinguish between blocking ops | ||
519 | * and retries if we made tty_ldisc_wait() smarter. That | ||
520 | * is up for discussion. | ||
521 | */ | ||
522 | if(wait_event_interruptible(tty_ldisc_wait, tty->ldisc.refcount == 0) < 0) | ||
523 | return -ERESTARTSYS; | ||
524 | goto restart; | 546 | goto restart; |
525 | } | 547 | } |
526 | clear_bit(TTY_LDISC, &tty->flags); | 548 | |
549 | clear_bit(TTY_LDISC, &tty->flags); | ||
527 | clear_bit(TTY_DONT_FLIP, &tty->flags); | 550 | clear_bit(TTY_DONT_FLIP, &tty->flags); |
551 | if (o_tty) { | ||
552 | clear_bit(TTY_LDISC, &o_tty->flags); | ||
553 | clear_bit(TTY_DONT_FLIP, &o_tty->flags); | ||
554 | } | ||
528 | spin_unlock_irqrestore(&tty_ldisc_lock, flags); | 555 | spin_unlock_irqrestore(&tty_ldisc_lock, flags); |
529 | 556 | ||
530 | /* | 557 | /* |
531 | * From this point on we know nobody has an ldisc | 558 | * From this point on we know nobody has an ldisc |
532 | * usage reference, nor can they obtain one until | 559 | * usage reference, nor can they obtain one until |
533 | * we say so later on. | 560 | * we say so later on. |
534 | */ | 561 | */ |
535 | 562 | ||
536 | work = cancel_delayed_work(&tty->flip.work); | 563 | work = cancel_delayed_work(&tty->flip.work); |
537 | /* | 564 | /* |
538 | * Wait for ->hangup_work and ->flip.work handlers to terminate | 565 | * Wait for ->hangup_work and ->flip.work handlers to terminate |
@@ -583,10 +610,12 @@ restart: | |||
583 | */ | 610 | */ |
584 | 611 | ||
585 | tty_ldisc_enable(tty); | 612 | tty_ldisc_enable(tty); |
613 | if (o_tty) | ||
614 | tty_ldisc_enable(o_tty); | ||
586 | 615 | ||
587 | /* Restart it in case no characters kick it off. Safe if | 616 | /* Restart it in case no characters kick it off. Safe if |
588 | already running */ | 617 | already running */ |
589 | if(work) | 618 | if (work) |
590 | schedule_delayed_work(&tty->flip.work, 1); | 619 | schedule_delayed_work(&tty->flip.work, 1); |
591 | return retval; | 620 | return retval; |
592 | } | 621 | } |
@@ -2425,6 +2454,7 @@ static void __do_SAK(void *arg) | |||
2425 | int i; | 2454 | int i; |
2426 | struct file *filp; | 2455 | struct file *filp; |
2427 | struct tty_ldisc *disc; | 2456 | struct tty_ldisc *disc; |
2457 | struct fdtable *fdt; | ||
2428 | 2458 | ||
2429 | if (!tty) | 2459 | if (!tty) |
2430 | return; | 2460 | return; |
@@ -2450,8 +2480,9 @@ static void __do_SAK(void *arg) | |||
2450 | } | 2480 | } |
2451 | task_lock(p); | 2481 | task_lock(p); |
2452 | if (p->files) { | 2482 | if (p->files) { |
2453 | spin_lock(&p->files->file_lock); | 2483 | rcu_read_lock(); |
2454 | for (i=0; i < p->files->max_fds; i++) { | 2484 | fdt = files_fdtable(p->files); |
2485 | for (i=0; i < fdt->max_fds; i++) { | ||
2455 | filp = fcheck_files(p->files, i); | 2486 | filp = fcheck_files(p->files, i); |
2456 | if (!filp) | 2487 | if (!filp) |
2457 | continue; | 2488 | continue; |
@@ -2464,7 +2495,7 @@ static void __do_SAK(void *arg) | |||
2464 | break; | 2495 | break; |
2465 | } | 2496 | } |
2466 | } | 2497 | } |
2467 | spin_unlock(&p->files->file_lock); | 2498 | rcu_read_unlock(); |
2468 | } | 2499 | } |
2469 | task_unlock(p); | 2500 | task_unlock(p); |
2470 | } while_each_task_pid(session, PIDTYPE_SID, p); | 2501 | } while_each_task_pid(session, PIDTYPE_SID, p); |
diff --git a/drivers/char/vt.c b/drivers/char/vt.c index b8d0c290b0db..1e33cb032e07 100644 --- a/drivers/char/vt.c +++ b/drivers/char/vt.c | |||
@@ -751,6 +751,7 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | |||
751 | unsigned long old_origin, new_origin, new_scr_end, rlth, rrem, err = 0; | 751 | unsigned long old_origin, new_origin, new_scr_end, rlth, rrem, err = 0; |
752 | unsigned int old_cols, old_rows, old_row_size, old_screen_size; | 752 | unsigned int old_cols, old_rows, old_row_size, old_screen_size; |
753 | unsigned int new_cols, new_rows, new_row_size, new_screen_size; | 753 | unsigned int new_cols, new_rows, new_row_size, new_screen_size; |
754 | unsigned int end; | ||
754 | unsigned short *newscreen; | 755 | unsigned short *newscreen; |
755 | 756 | ||
756 | WARN_CONSOLE_UNLOCKED(); | 757 | WARN_CONSOLE_UNLOCKED(); |
@@ -794,20 +795,44 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | |||
794 | old_origin = vc->vc_origin; | 795 | old_origin = vc->vc_origin; |
795 | new_origin = (long) newscreen; | 796 | new_origin = (long) newscreen; |
796 | new_scr_end = new_origin + new_screen_size; | 797 | new_scr_end = new_origin + new_screen_size; |
797 | if (new_rows < old_rows) | 798 | |
798 | old_origin += (old_rows - new_rows) * old_row_size; | 799 | if (vc->vc_y > new_rows) { |
800 | if (old_rows - vc->vc_y < new_rows) { | ||
801 | /* | ||
802 | * Cursor near the bottom, copy contents from the | ||
803 | * bottom of buffer | ||
804 | */ | ||
805 | old_origin += (old_rows - new_rows) * old_row_size; | ||
806 | end = vc->vc_scr_end; | ||
807 | } else { | ||
808 | /* | ||
809 | * Cursor is in no man's land, copy 1/2 screenful | ||
810 | * from the top and bottom of cursor position | ||
811 | */ | ||
812 | old_origin += (vc->vc_y - new_rows/2) * old_row_size; | ||
813 | end = old_origin + new_screen_size; | ||
814 | } | ||
815 | } else | ||
816 | /* | ||
817 | * Cursor near the top, copy contents from the top of buffer | ||
818 | */ | ||
819 | end = (old_rows > new_rows) ? old_origin + new_screen_size : | ||
820 | vc->vc_scr_end; | ||
799 | 821 | ||
800 | update_attr(vc); | 822 | update_attr(vc); |
801 | 823 | ||
802 | while (old_origin < vc->vc_scr_end) { | 824 | while (old_origin < end) { |
803 | scr_memcpyw((unsigned short *) new_origin, (unsigned short *) old_origin, rlth); | 825 | scr_memcpyw((unsigned short *) new_origin, |
826 | (unsigned short *) old_origin, rlth); | ||
804 | if (rrem) | 827 | if (rrem) |
805 | scr_memsetw((void *)(new_origin + rlth), vc->vc_video_erase_char, rrem); | 828 | scr_memsetw((void *)(new_origin + rlth), |
829 | vc->vc_video_erase_char, rrem); | ||
806 | old_origin += old_row_size; | 830 | old_origin += old_row_size; |
807 | new_origin += new_row_size; | 831 | new_origin += new_row_size; |
808 | } | 832 | } |
809 | if (new_scr_end > new_origin) | 833 | if (new_scr_end > new_origin) |
810 | scr_memsetw((void *)new_origin, vc->vc_video_erase_char, new_scr_end - new_origin); | 834 | scr_memsetw((void *)new_origin, vc->vc_video_erase_char, |
835 | new_scr_end - new_origin); | ||
811 | if (vc->vc_kmalloced) | 836 | if (vc->vc_kmalloced) |
812 | kfree(vc->vc_screenbuf); | 837 | kfree(vc->vc_screenbuf); |
813 | vc->vc_screenbuf = newscreen; | 838 | vc->vc_screenbuf = newscreen; |
diff --git a/drivers/char/watchdog/mixcomwd.c b/drivers/char/watchdog/mixcomwd.c index c9b301dccec3..7fc2188386d9 100644 --- a/drivers/char/watchdog/mixcomwd.c +++ b/drivers/char/watchdog/mixcomwd.c | |||
@@ -59,7 +59,7 @@ static unsigned long mixcomwd_opened; /* long req'd for setbit --RR */ | |||
59 | 59 | ||
60 | static int watchdog_port; | 60 | static int watchdog_port; |
61 | static int mixcomwd_timer_alive; | 61 | static int mixcomwd_timer_alive; |
62 | static struct timer_list mixcomwd_timer = TIMER_INITIALIZER(NULL, 0, 0); | 62 | static DEFINE_TIMER(mixcomwd_timer, NULL, 0, 0); |
63 | static char expect_close; | 63 | static char expect_close; |
64 | 64 | ||
65 | static int nowayout = WATCHDOG_NOWAYOUT; | 65 | static int nowayout = WATCHDOG_NOWAYOUT; |