diff options
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/amiserial.c | 36 | ||||
-rw-r--r-- | drivers/char/bsr.c | 2 | ||||
-rw-r--r-- | drivers/char/hvc_console.c | 12 | ||||
-rw-r--r-- | drivers/char/hvc_irq.c | 2 | ||||
-rw-r--r-- | drivers/char/ps3flash.c | 18 | ||||
-rw-r--r-- | drivers/char/pty.c | 4 | ||||
-rw-r--r-- | drivers/char/ser_a2232.c | 12 | ||||
-rw-r--r-- | drivers/char/synclink_gt.c | 16 | ||||
-rw-r--r-- | drivers/char/sysrq.c | 6 | ||||
-rw-r--r-- | drivers/char/tty_ioctl.c | 2 | ||||
-rw-r--r-- | drivers/char/vme_scc.c | 166 |
11 files changed, 207 insertions, 69 deletions
diff --git a/drivers/char/amiserial.c b/drivers/char/amiserial.c index 4e0cfdeab146..a58869ea8513 100644 --- a/drivers/char/amiserial.c +++ b/drivers/char/amiserial.c | |||
@@ -1963,6 +1963,7 @@ static int __init rs_init(void) | |||
1963 | { | 1963 | { |
1964 | unsigned long flags; | 1964 | unsigned long flags; |
1965 | struct serial_state * state; | 1965 | struct serial_state * state; |
1966 | int error; | ||
1966 | 1967 | ||
1967 | if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_SERIAL)) | 1968 | if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_SERIAL)) |
1968 | return -ENODEV; | 1969 | return -ENODEV; |
@@ -1975,8 +1976,11 @@ static int __init rs_init(void) | |||
1975 | * We request SERDAT and SERPER only, because the serial registers are | 1976 | * We request SERDAT and SERPER only, because the serial registers are |
1976 | * too spreaded over the custom register space | 1977 | * too spreaded over the custom register space |
1977 | */ | 1978 | */ |
1978 | if (!request_mem_region(CUSTOM_PHYSADDR+0x30, 4, "amiserial [Paula]")) | 1979 | if (!request_mem_region(CUSTOM_PHYSADDR+0x30, 4, |
1979 | return -EBUSY; | 1980 | "amiserial [Paula]")) { |
1981 | error = -EBUSY; | ||
1982 | goto fail_put_tty_driver; | ||
1983 | } | ||
1980 | 1984 | ||
1981 | IRQ_ports = NULL; | 1985 | IRQ_ports = NULL; |
1982 | 1986 | ||
@@ -1997,8 +2001,9 @@ static int __init rs_init(void) | |||
1997 | serial_driver->flags = TTY_DRIVER_REAL_RAW; | 2001 | serial_driver->flags = TTY_DRIVER_REAL_RAW; |
1998 | tty_set_operations(serial_driver, &serial_ops); | 2002 | tty_set_operations(serial_driver, &serial_ops); |
1999 | 2003 | ||
2000 | if (tty_register_driver(serial_driver)) | 2004 | error = tty_register_driver(serial_driver); |
2001 | panic("Couldn't register serial driver\n"); | 2005 | if (error) |
2006 | goto fail_release_mem_region; | ||
2002 | 2007 | ||
2003 | state = rs_table; | 2008 | state = rs_table; |
2004 | state->magic = SSTATE_MAGIC; | 2009 | state->magic = SSTATE_MAGIC; |
@@ -2024,8 +2029,14 @@ static int __init rs_init(void) | |||
2024 | local_irq_save(flags); | 2029 | local_irq_save(flags); |
2025 | 2030 | ||
2026 | /* set ISRs, and then disable the rx interrupts */ | 2031 | /* set ISRs, and then disable the rx interrupts */ |
2027 | request_irq(IRQ_AMIGA_TBE, ser_tx_int, 0, "serial TX", state); | 2032 | error = request_irq(IRQ_AMIGA_TBE, ser_tx_int, 0, "serial TX", state); |
2028 | request_irq(IRQ_AMIGA_RBF, ser_rx_int, IRQF_DISABLED, "serial RX", state); | 2033 | if (error) |
2034 | goto fail_unregister; | ||
2035 | |||
2036 | error = request_irq(IRQ_AMIGA_RBF, ser_rx_int, IRQF_DISABLED, | ||
2037 | "serial RX", state); | ||
2038 | if (error) | ||
2039 | goto fail_free_irq; | ||
2029 | 2040 | ||
2030 | /* turn off Rx and Tx interrupts */ | 2041 | /* turn off Rx and Tx interrupts */ |
2031 | custom.intena = IF_RBF | IF_TBE; | 2042 | custom.intena = IF_RBF | IF_TBE; |
@@ -2045,6 +2056,16 @@ static int __init rs_init(void) | |||
2045 | ciab.ddra &= ~(SER_DCD | SER_CTS | SER_DSR); /* inputs */ | 2056 | ciab.ddra &= ~(SER_DCD | SER_CTS | SER_DSR); /* inputs */ |
2046 | 2057 | ||
2047 | return 0; | 2058 | return 0; |
2059 | |||
2060 | fail_free_irq: | ||
2061 | free_irq(IRQ_AMIGA_TBE, state); | ||
2062 | fail_unregister: | ||
2063 | tty_unregister_driver(serial_driver); | ||
2064 | fail_release_mem_region: | ||
2065 | release_mem_region(CUSTOM_PHYSADDR+0x30, 4); | ||
2066 | fail_put_tty_driver: | ||
2067 | put_tty_driver(serial_driver); | ||
2068 | return error; | ||
2048 | } | 2069 | } |
2049 | 2070 | ||
2050 | static __exit void rs_exit(void) | 2071 | static __exit void rs_exit(void) |
@@ -2064,6 +2085,9 @@ static __exit void rs_exit(void) | |||
2064 | kfree(info); | 2085 | kfree(info); |
2065 | } | 2086 | } |
2066 | 2087 | ||
2088 | free_irq(IRQ_AMIGA_TBE, rs_table); | ||
2089 | free_irq(IRQ_AMIGA_RBF, rs_table); | ||
2090 | |||
2067 | release_mem_region(CUSTOM_PHYSADDR+0x30, 4); | 2091 | release_mem_region(CUSTOM_PHYSADDR+0x30, 4); |
2068 | } | 2092 | } |
2069 | 2093 | ||
diff --git a/drivers/char/bsr.c b/drivers/char/bsr.c index 977dfb1096a0..f6094ae0ef33 100644 --- a/drivers/char/bsr.c +++ b/drivers/char/bsr.c | |||
@@ -103,7 +103,7 @@ static ssize_t | |||
103 | bsr_len_show(struct device *dev, struct device_attribute *attr, char *buf) | 103 | bsr_len_show(struct device *dev, struct device_attribute *attr, char *buf) |
104 | { | 104 | { |
105 | struct bsr_dev *bsr_dev = dev_get_drvdata(dev); | 105 | struct bsr_dev *bsr_dev = dev_get_drvdata(dev); |
106 | return sprintf(buf, "%lu\n", bsr_dev->bsr_len); | 106 | return sprintf(buf, "%llu\n", bsr_dev->bsr_len); |
107 | } | 107 | } |
108 | 108 | ||
109 | static struct device_attribute bsr_dev_attrs[] = { | 109 | static struct device_attribute bsr_dev_attrs[] = { |
diff --git a/drivers/char/hvc_console.c b/drivers/char/hvc_console.c index 5a8a4c28c867..94e7e3c8c05a 100644 --- a/drivers/char/hvc_console.c +++ b/drivers/char/hvc_console.c | |||
@@ -318,7 +318,6 @@ static int hvc_open(struct tty_struct *tty, struct file * filp) | |||
318 | } /* else count == 0 */ | 318 | } /* else count == 0 */ |
319 | 319 | ||
320 | tty->driver_data = hp; | 320 | tty->driver_data = hp; |
321 | tty->low_latency = 1; /* Makes flushes to ldisc synchronous. */ | ||
322 | 321 | ||
323 | hp->tty = tty; | 322 | hp->tty = tty; |
324 | 323 | ||
@@ -764,13 +763,11 @@ struct hvc_struct __devinit *hvc_alloc(uint32_t vtermno, int data, | |||
764 | return ERR_PTR(err); | 763 | return ERR_PTR(err); |
765 | } | 764 | } |
766 | 765 | ||
767 | hp = kmalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size, | 766 | hp = kzalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size, |
768 | GFP_KERNEL); | 767 | GFP_KERNEL); |
769 | if (!hp) | 768 | if (!hp) |
770 | return ERR_PTR(-ENOMEM); | 769 | return ERR_PTR(-ENOMEM); |
771 | 770 | ||
772 | memset(hp, 0x00, sizeof(*hp)); | ||
773 | |||
774 | hp->vtermno = vtermno; | 771 | hp->vtermno = vtermno; |
775 | hp->data = data; | 772 | hp->data = data; |
776 | hp->ops = ops; | 773 | hp->ops = ops; |
@@ -876,8 +873,11 @@ static int hvc_init(void) | |||
876 | goto stop_thread; | 873 | goto stop_thread; |
877 | } | 874 | } |
878 | 875 | ||
879 | /* FIXME: This mb() seems completely random. Remove it. */ | 876 | /* |
880 | mb(); | 877 | * Make sure tty is fully registered before allowing it to be |
878 | * found by hvc_console_device. | ||
879 | */ | ||
880 | smp_mb(); | ||
881 | hvc_driver = drv; | 881 | hvc_driver = drv; |
882 | return 0; | 882 | return 0; |
883 | 883 | ||
diff --git a/drivers/char/hvc_irq.c b/drivers/char/hvc_irq.c index d09e5688d449..2623e177e8d6 100644 --- a/drivers/char/hvc_irq.c +++ b/drivers/char/hvc_irq.c | |||
@@ -37,7 +37,7 @@ int notifier_add_irq(struct hvc_struct *hp, int irq) | |||
37 | 37 | ||
38 | void notifier_del_irq(struct hvc_struct *hp, int irq) | 38 | void notifier_del_irq(struct hvc_struct *hp, int irq) |
39 | { | 39 | { |
40 | if (!irq) | 40 | if (!hp->irq_requested) |
41 | return; | 41 | return; |
42 | free_irq(irq, hp); | 42 | free_irq(irq, hp); |
43 | hp->irq_requested = 0; | 43 | hp->irq_requested = 0; |
diff --git a/drivers/char/ps3flash.c b/drivers/char/ps3flash.c index 79b6f461be75..afbe45676d71 100644 --- a/drivers/char/ps3flash.c +++ b/drivers/char/ps3flash.c | |||
@@ -44,7 +44,7 @@ static ssize_t ps3flash_read_write_sectors(struct ps3_storage_device *dev, | |||
44 | u64 res = ps3stor_read_write_sectors(dev, lpar, start_sector, sectors, | 44 | u64 res = ps3stor_read_write_sectors(dev, lpar, start_sector, sectors, |
45 | write); | 45 | write); |
46 | if (res) { | 46 | if (res) { |
47 | dev_err(&dev->sbd.core, "%s:%u: %s failed 0x%lx\n", __func__, | 47 | dev_err(&dev->sbd.core, "%s:%u: %s failed 0x%llx\n", __func__, |
48 | __LINE__, write ? "write" : "read", res); | 48 | __LINE__, write ? "write" : "read", res); |
49 | return -EIO; | 49 | return -EIO; |
50 | } | 50 | } |
@@ -59,7 +59,7 @@ static ssize_t ps3flash_read_sectors(struct ps3_storage_device *dev, | |||
59 | 59 | ||
60 | max_sectors = dev->bounce_size / dev->blk_size; | 60 | max_sectors = dev->bounce_size / dev->blk_size; |
61 | if (sectors > max_sectors) { | 61 | if (sectors > max_sectors) { |
62 | dev_dbg(&dev->sbd.core, "%s:%u Limiting sectors to %lu\n", | 62 | dev_dbg(&dev->sbd.core, "%s:%u Limiting sectors to %llu\n", |
63 | __func__, __LINE__, max_sectors); | 63 | __func__, __LINE__, max_sectors); |
64 | sectors = max_sectors; | 64 | sectors = max_sectors; |
65 | } | 65 | } |
@@ -144,7 +144,7 @@ static ssize_t ps3flash_read(struct file *file, char __user *buf, size_t count, | |||
144 | goto fail; | 144 | goto fail; |
145 | } | 145 | } |
146 | 146 | ||
147 | n = min(remaining, sectors_read*dev->blk_size-offset); | 147 | n = min_t(u64, remaining, sectors_read*dev->blk_size-offset); |
148 | dev_dbg(&dev->sbd.core, | 148 | dev_dbg(&dev->sbd.core, |
149 | "%s:%u: copy %lu bytes from 0x%p to user 0x%p\n", | 149 | "%s:%u: copy %lu bytes from 0x%p to user 0x%p\n", |
150 | __func__, __LINE__, n, dev->bounce_buf+offset, buf); | 150 | __func__, __LINE__, n, dev->bounce_buf+offset, buf); |
@@ -225,7 +225,7 @@ static ssize_t ps3flash_write(struct file *file, const char __user *buf, | |||
225 | if (end_read_sector >= start_read_sector) { | 225 | if (end_read_sector >= start_read_sector) { |
226 | /* Merge head and tail */ | 226 | /* Merge head and tail */ |
227 | dev_dbg(&dev->sbd.core, | 227 | dev_dbg(&dev->sbd.core, |
228 | "Merged head and tail: %lu sectors at %lu\n", | 228 | "Merged head and tail: %llu sectors at %llu\n", |
229 | chunk_sectors, start_write_sector); | 229 | chunk_sectors, start_write_sector); |
230 | res = ps3flash_read_sectors(dev, start_write_sector, | 230 | res = ps3flash_read_sectors(dev, start_write_sector, |
231 | chunk_sectors, 0); | 231 | chunk_sectors, 0); |
@@ -235,7 +235,7 @@ static ssize_t ps3flash_write(struct file *file, const char __user *buf, | |||
235 | if (head) { | 235 | if (head) { |
236 | /* Read head */ | 236 | /* Read head */ |
237 | dev_dbg(&dev->sbd.core, | 237 | dev_dbg(&dev->sbd.core, |
238 | "head: %lu sectors at %lu\n", head, | 238 | "head: %llu sectors at %llu\n", head, |
239 | start_write_sector); | 239 | start_write_sector); |
240 | res = ps3flash_read_sectors(dev, | 240 | res = ps3flash_read_sectors(dev, |
241 | start_write_sector, | 241 | start_write_sector, |
@@ -247,7 +247,7 @@ static ssize_t ps3flash_write(struct file *file, const char __user *buf, | |||
247 | start_write_sector+chunk_sectors) { | 247 | start_write_sector+chunk_sectors) { |
248 | /* Read tail */ | 248 | /* Read tail */ |
249 | dev_dbg(&dev->sbd.core, | 249 | dev_dbg(&dev->sbd.core, |
250 | "tail: %lu sectors at %lu\n", tail, | 250 | "tail: %llu sectors at %llu\n", tail, |
251 | start_read_sector); | 251 | start_read_sector); |
252 | sec_off = start_read_sector-start_write_sector; | 252 | sec_off = start_read_sector-start_write_sector; |
253 | res = ps3flash_read_sectors(dev, | 253 | res = ps3flash_read_sectors(dev, |
@@ -258,7 +258,7 @@ static ssize_t ps3flash_write(struct file *file, const char __user *buf, | |||
258 | } | 258 | } |
259 | } | 259 | } |
260 | 260 | ||
261 | n = min(remaining, dev->bounce_size-offset); | 261 | n = min_t(u64, remaining, dev->bounce_size-offset); |
262 | dev_dbg(&dev->sbd.core, | 262 | dev_dbg(&dev->sbd.core, |
263 | "%s:%u: copy %lu bytes from user 0x%p to 0x%p\n", | 263 | "%s:%u: copy %lu bytes from user 0x%p to 0x%p\n", |
264 | __func__, __LINE__, n, buf, dev->bounce_buf+offset); | 264 | __func__, __LINE__, n, buf, dev->bounce_buf+offset); |
@@ -299,11 +299,11 @@ static irqreturn_t ps3flash_interrupt(int irq, void *data) | |||
299 | 299 | ||
300 | if (tag != dev->tag) | 300 | if (tag != dev->tag) |
301 | dev_err(&dev->sbd.core, | 301 | dev_err(&dev->sbd.core, |
302 | "%s:%u: tag mismatch, got %lx, expected %lx\n", | 302 | "%s:%u: tag mismatch, got %llx, expected %llx\n", |
303 | __func__, __LINE__, tag, dev->tag); | 303 | __func__, __LINE__, tag, dev->tag); |
304 | 304 | ||
305 | if (res) { | 305 | if (res) { |
306 | dev_err(&dev->sbd.core, "%s:%u: res=%d status=0x%lx\n", | 306 | dev_err(&dev->sbd.core, "%s:%u: res=%d status=0x%llx\n", |
307 | __func__, __LINE__, res, status); | 307 | __func__, __LINE__, res, status); |
308 | } else { | 308 | } else { |
309 | dev->lv1_status = status; | 309 | dev->lv1_status = status; |
diff --git a/drivers/char/pty.c b/drivers/char/pty.c index 146c97613da0..31038a0052a2 100644 --- a/drivers/char/pty.c +++ b/drivers/char/pty.c | |||
@@ -230,9 +230,7 @@ static void pty_set_termios(struct tty_struct *tty, | |||
230 | /** | 230 | /** |
231 | * pty_do_resize - resize event | 231 | * pty_do_resize - resize event |
232 | * @tty: tty being resized | 232 | * @tty: tty being resized |
233 | * @real_tty: real tty (not the same as tty if using a pty/tty pair) | 233 | * @ws: window size being set. |
234 | * @rows: rows (character) | ||
235 | * @cols: cols (character) | ||
236 | * | 234 | * |
237 | * Update the termios variables and send the neccessary signals to | 235 | * Update the termios variables and send the neccessary signals to |
238 | * peform a terminal resize correctly | 236 | * peform a terminal resize correctly |
diff --git a/drivers/char/ser_a2232.c b/drivers/char/ser_a2232.c index 33872a219df6..33a2b531802e 100644 --- a/drivers/char/ser_a2232.c +++ b/drivers/char/ser_a2232.c | |||
@@ -718,6 +718,7 @@ static int __init a2232board_init(void) | |||
718 | u_char *from; | 718 | u_char *from; |
719 | volatile u_char *to; | 719 | volatile u_char *to; |
720 | volatile struct a2232memory *mem; | 720 | volatile struct a2232memory *mem; |
721 | int error, i; | ||
721 | 722 | ||
722 | #ifdef CONFIG_SMP | 723 | #ifdef CONFIG_SMP |
723 | return -ENODEV; /* This driver is not SMP aware. Is there an SMP ZorroII-bus-machine? */ | 724 | return -ENODEV; /* This driver is not SMP aware. Is there an SMP ZorroII-bus-machine? */ |
@@ -797,8 +798,15 @@ static int __init a2232board_init(void) | |||
797 | */ | 798 | */ |
798 | if (a2232_init_drivers()) return -ENODEV; // maybe we should use a different -Exxx? | 799 | if (a2232_init_drivers()) return -ENODEV; // maybe we should use a different -Exxx? |
799 | 800 | ||
800 | request_irq(IRQ_AMIGA_VERTB, a2232_vbl_inter, 0, "A2232 serial VBL", a2232_driver_ID); | 801 | error = request_irq(IRQ_AMIGA_VERTB, a2232_vbl_inter, 0, |
801 | return 0; | 802 | "A2232 serial VBL", a2232_driver_ID); |
803 | if (error) { | ||
804 | for (i = 0; i < nr_a2232; i++) | ||
805 | zorro_release_device(zd_a2232[i]); | ||
806 | tty_unregister_driver(a2232_driver); | ||
807 | put_tty_driver(a2232_driver); | ||
808 | } | ||
809 | return error; | ||
802 | } | 810 | } |
803 | 811 | ||
804 | static void __exit a2232board_exit(void) | 812 | static void __exit a2232board_exit(void) |
diff --git a/drivers/char/synclink_gt.c b/drivers/char/synclink_gt.c index 53544e21f191..f329f459817c 100644 --- a/drivers/char/synclink_gt.c +++ b/drivers/char/synclink_gt.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: synclink_gt.c,v 4.50 2007/07/25 19:29:25 paulkf Exp $ | ||
3 | * | ||
4 | * Device driver for Microgate SyncLink GT serial adapters. | 2 | * Device driver for Microgate SyncLink GT serial adapters. |
5 | * | 3 | * |
6 | * written by Paul Fulghum for Microgate Corporation | 4 | * written by Paul Fulghum for Microgate Corporation |
@@ -91,7 +89,6 @@ | |||
91 | * module identification | 89 | * module identification |
92 | */ | 90 | */ |
93 | static char *driver_name = "SyncLink GT"; | 91 | static char *driver_name = "SyncLink GT"; |
94 | static char *driver_version = "$Revision: 4.50 $"; | ||
95 | static char *tty_driver_name = "synclink_gt"; | 92 | static char *tty_driver_name = "synclink_gt"; |
96 | static char *tty_dev_prefix = "ttySLG"; | 93 | static char *tty_dev_prefix = "ttySLG"; |
97 | MODULE_LICENSE("GPL"); | 94 | MODULE_LICENSE("GPL"); |
@@ -1309,7 +1306,7 @@ static int read_proc(char *page, char **start, off_t off, int count, | |||
1309 | off_t begin = 0; | 1306 | off_t begin = 0; |
1310 | struct slgt_info *info; | 1307 | struct slgt_info *info; |
1311 | 1308 | ||
1312 | len += sprintf(page, "synclink_gt driver:%s\n", driver_version); | 1309 | len += sprintf(page, "synclink_gt driver\n"); |
1313 | 1310 | ||
1314 | info = slgt_device_list; | 1311 | info = slgt_device_list; |
1315 | while( info ) { | 1312 | while( info ) { |
@@ -2441,7 +2438,7 @@ static void program_hw(struct slgt_info *info) | |||
2441 | info->ri_chkcount = 0; | 2438 | info->ri_chkcount = 0; |
2442 | info->dsr_chkcount = 0; | 2439 | info->dsr_chkcount = 0; |
2443 | 2440 | ||
2444 | slgt_irq_on(info, IRQ_DCD | IRQ_CTS | IRQ_DSR); | 2441 | slgt_irq_on(info, IRQ_DCD | IRQ_CTS | IRQ_DSR | IRQ_RI); |
2445 | get_signals(info); | 2442 | get_signals(info); |
2446 | 2443 | ||
2447 | if (info->netcount || | 2444 | if (info->netcount || |
@@ -3576,7 +3573,7 @@ static void slgt_cleanup(void) | |||
3576 | struct slgt_info *info; | 3573 | struct slgt_info *info; |
3577 | struct slgt_info *tmp; | 3574 | struct slgt_info *tmp; |
3578 | 3575 | ||
3579 | printk("unload %s %s\n", driver_name, driver_version); | 3576 | printk(KERN_INFO "unload %s\n", driver_name); |
3580 | 3577 | ||
3581 | if (serial_driver) { | 3578 | if (serial_driver) { |
3582 | for (info=slgt_device_list ; info != NULL ; info=info->next_device) | 3579 | for (info=slgt_device_list ; info != NULL ; info=info->next_device) |
@@ -3619,7 +3616,7 @@ static int __init slgt_init(void) | |||
3619 | { | 3616 | { |
3620 | int rc; | 3617 | int rc; |
3621 | 3618 | ||
3622 | printk("%s %s\n", driver_name, driver_version); | 3619 | printk(KERN_INFO "%s\n", driver_name); |
3623 | 3620 | ||
3624 | serial_driver = alloc_tty_driver(MAX_DEVICES); | 3621 | serial_driver = alloc_tty_driver(MAX_DEVICES); |
3625 | if (!serial_driver) { | 3622 | if (!serial_driver) { |
@@ -3650,9 +3647,8 @@ static int __init slgt_init(void) | |||
3650 | goto error; | 3647 | goto error; |
3651 | } | 3648 | } |
3652 | 3649 | ||
3653 | printk("%s %s, tty major#%d\n", | 3650 | printk(KERN_INFO "%s, tty major#%d\n", |
3654 | driver_name, driver_version, | 3651 | driver_name, serial_driver->major); |
3655 | serial_driver->major); | ||
3656 | 3652 | ||
3657 | slgt_device_count = 0; | 3653 | slgt_device_count = 0; |
3658 | if ((rc = pci_register_driver(&pci_driver)) < 0) { | 3654 | if ((rc = pci_register_driver(&pci_driver)) < 0) { |
diff --git a/drivers/char/sysrq.c b/drivers/char/sysrq.c index 985dc8f6c747..30659ce9bcf4 100644 --- a/drivers/char/sysrq.c +++ b/drivers/char/sysrq.c | |||
@@ -473,6 +473,12 @@ void __handle_sysrq(int key, struct tty_struct *tty, int check_mask) | |||
473 | unsigned long flags; | 473 | unsigned long flags; |
474 | 474 | ||
475 | spin_lock_irqsave(&sysrq_key_table_lock, flags); | 475 | spin_lock_irqsave(&sysrq_key_table_lock, flags); |
476 | /* | ||
477 | * Raise the apparent loglevel to maximum so that the sysrq header | ||
478 | * is shown to provide the user with positive feedback. We do not | ||
479 | * simply emit this at KERN_EMERG as that would change message | ||
480 | * routing in the consumers of /proc/kmsg. | ||
481 | */ | ||
476 | orig_log_level = console_loglevel; | 482 | orig_log_level = console_loglevel; |
477 | console_loglevel = 7; | 483 | console_loglevel = 7; |
478 | printk(KERN_INFO "SysRq : "); | 484 | printk(KERN_INFO "SysRq : "); |
diff --git a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c index a408c8e487ec..6f4c7d0a53bf 100644 --- a/drivers/char/tty_ioctl.c +++ b/drivers/char/tty_ioctl.c | |||
@@ -1057,7 +1057,7 @@ int tty_perform_flush(struct tty_struct *tty, unsigned long arg) | |||
1057 | if (retval) | 1057 | if (retval) |
1058 | return retval; | 1058 | return retval; |
1059 | 1059 | ||
1060 | ld = tty_ldisc_ref(tty); | 1060 | ld = tty_ldisc_ref_wait(tty); |
1061 | switch (arg) { | 1061 | switch (arg) { |
1062 | case TCIFLUSH: | 1062 | case TCIFLUSH: |
1063 | if (ld && ld->ops->flush_buffer) | 1063 | if (ld && ld->ops->flush_buffer) |
diff --git a/drivers/char/vme_scc.c b/drivers/char/vme_scc.c index 0e8234bd0e19..994e1a58b987 100644 --- a/drivers/char/vme_scc.c +++ b/drivers/char/vme_scc.c | |||
@@ -198,6 +198,7 @@ static void scc_init_portstructs(void) | |||
198 | static int mvme147_scc_init(void) | 198 | static int mvme147_scc_init(void) |
199 | { | 199 | { |
200 | struct scc_port *port; | 200 | struct scc_port *port; |
201 | int error; | ||
201 | 202 | ||
202 | printk(KERN_INFO "SCC: MVME147 Serial Driver\n"); | 203 | printk(KERN_INFO "SCC: MVME147 Serial Driver\n"); |
203 | /* Init channel A */ | 204 | /* Init channel A */ |
@@ -207,14 +208,23 @@ static int mvme147_scc_init(void) | |||
207 | port->datap = port->ctrlp + 1; | 208 | port->datap = port->ctrlp + 1; |
208 | port->port_a = &scc_ports[0]; | 209 | port->port_a = &scc_ports[0]; |
209 | port->port_b = &scc_ports[1]; | 210 | port->port_b = &scc_ports[1]; |
210 | request_irq(MVME147_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED, | 211 | error = request_irq(MVME147_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED, |
211 | "SCC-A TX", port); | 212 | "SCC-A TX", port); |
212 | request_irq(MVME147_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED, | 213 | if (error) |
214 | goto fail; | ||
215 | error = request_irq(MVME147_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED, | ||
213 | "SCC-A status", port); | 216 | "SCC-A status", port); |
214 | request_irq(MVME147_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED, | 217 | if (error) |
218 | goto fail_free_a_tx; | ||
219 | error = request_irq(MVME147_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED, | ||
215 | "SCC-A RX", port); | 220 | "SCC-A RX", port); |
216 | request_irq(MVME147_IRQ_SCCA_SPCOND, scc_spcond_int, IRQF_DISABLED, | 221 | if (error) |
217 | "SCC-A special cond", port); | 222 | goto fail_free_a_stat; |
223 | error = request_irq(MVME147_IRQ_SCCA_SPCOND, scc_spcond_int, | ||
224 | IRQF_DISABLED, "SCC-A special cond", port); | ||
225 | if (error) | ||
226 | goto fail_free_a_rx; | ||
227 | |||
218 | { | 228 | { |
219 | SCC_ACCESS_INIT(port); | 229 | SCC_ACCESS_INIT(port); |
220 | 230 | ||
@@ -234,14 +244,23 @@ static int mvme147_scc_init(void) | |||
234 | port->datap = port->ctrlp + 1; | 244 | port->datap = port->ctrlp + 1; |
235 | port->port_a = &scc_ports[0]; | 245 | port->port_a = &scc_ports[0]; |
236 | port->port_b = &scc_ports[1]; | 246 | port->port_b = &scc_ports[1]; |
237 | request_irq(MVME147_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED, | 247 | error = request_irq(MVME147_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED, |
238 | "SCC-B TX", port); | 248 | "SCC-B TX", port); |
239 | request_irq(MVME147_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED, | 249 | if (error) |
250 | goto fail_free_a_spcond; | ||
251 | error = request_irq(MVME147_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED, | ||
240 | "SCC-B status", port); | 252 | "SCC-B status", port); |
241 | request_irq(MVME147_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED, | 253 | if (error) |
254 | goto fail_free_b_tx; | ||
255 | error = request_irq(MVME147_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED, | ||
242 | "SCC-B RX", port); | 256 | "SCC-B RX", port); |
243 | request_irq(MVME147_IRQ_SCCB_SPCOND, scc_spcond_int, IRQF_DISABLED, | 257 | if (error) |
244 | "SCC-B special cond", port); | 258 | goto fail_free_b_stat; |
259 | error = request_irq(MVME147_IRQ_SCCB_SPCOND, scc_spcond_int, | ||
260 | IRQF_DISABLED, "SCC-B special cond", port); | ||
261 | if (error) | ||
262 | goto fail_free_b_rx; | ||
263 | |||
245 | { | 264 | { |
246 | SCC_ACCESS_INIT(port); | 265 | SCC_ACCESS_INIT(port); |
247 | 266 | ||
@@ -257,6 +276,23 @@ static int mvme147_scc_init(void) | |||
257 | scc_init_drivers(); | 276 | scc_init_drivers(); |
258 | 277 | ||
259 | return 0; | 278 | return 0; |
279 | |||
280 | fail_free_b_rx: | ||
281 | free_irq(MVME147_IRQ_SCCB_RX, port); | ||
282 | fail_free_b_stat: | ||
283 | free_irq(MVME147_IRQ_SCCB_STAT, port); | ||
284 | fail_free_b_tx: | ||
285 | free_irq(MVME147_IRQ_SCCB_TX, port); | ||
286 | fail_free_a_spcond: | ||
287 | free_irq(MVME147_IRQ_SCCA_SPCOND, port); | ||
288 | fail_free_a_rx: | ||
289 | free_irq(MVME147_IRQ_SCCA_RX, port); | ||
290 | fail_free_a_stat: | ||
291 | free_irq(MVME147_IRQ_SCCA_STAT, port); | ||
292 | fail_free_a_tx: | ||
293 | free_irq(MVME147_IRQ_SCCA_TX, port); | ||
294 | fail: | ||
295 | return error; | ||
260 | } | 296 | } |
261 | #endif | 297 | #endif |
262 | 298 | ||
@@ -265,6 +301,7 @@ static int mvme147_scc_init(void) | |||
265 | static int mvme162_scc_init(void) | 301 | static int mvme162_scc_init(void) |
266 | { | 302 | { |
267 | struct scc_port *port; | 303 | struct scc_port *port; |
304 | int error; | ||
268 | 305 | ||
269 | if (!(mvme16x_config & MVME16x_CONFIG_GOT_SCCA)) | 306 | if (!(mvme16x_config & MVME16x_CONFIG_GOT_SCCA)) |
270 | return (-ENODEV); | 307 | return (-ENODEV); |
@@ -277,14 +314,23 @@ static int mvme162_scc_init(void) | |||
277 | port->datap = port->ctrlp + 2; | 314 | port->datap = port->ctrlp + 2; |
278 | port->port_a = &scc_ports[0]; | 315 | port->port_a = &scc_ports[0]; |
279 | port->port_b = &scc_ports[1]; | 316 | port->port_b = &scc_ports[1]; |
280 | request_irq(MVME162_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED, | 317 | error = request_irq(MVME162_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED, |
281 | "SCC-A TX", port); | 318 | "SCC-A TX", port); |
282 | request_irq(MVME162_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED, | 319 | if (error) |
320 | goto fail; | ||
321 | error = request_irq(MVME162_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED, | ||
283 | "SCC-A status", port); | 322 | "SCC-A status", port); |
284 | request_irq(MVME162_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED, | 323 | if (error) |
324 | goto fail_free_a_tx; | ||
325 | error = request_irq(MVME162_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED, | ||
285 | "SCC-A RX", port); | 326 | "SCC-A RX", port); |
286 | request_irq(MVME162_IRQ_SCCA_SPCOND, scc_spcond_int, IRQF_DISABLED, | 327 | if (error) |
287 | "SCC-A special cond", port); | 328 | goto fail_free_a_stat; |
329 | error = request_irq(MVME162_IRQ_SCCA_SPCOND, scc_spcond_int, | ||
330 | IRQF_DISABLED, "SCC-A special cond", port); | ||
331 | if (error) | ||
332 | goto fail_free_a_rx; | ||
333 | |||
288 | { | 334 | { |
289 | SCC_ACCESS_INIT(port); | 335 | SCC_ACCESS_INIT(port); |
290 | 336 | ||
@@ -304,14 +350,22 @@ static int mvme162_scc_init(void) | |||
304 | port->datap = port->ctrlp + 2; | 350 | port->datap = port->ctrlp + 2; |
305 | port->port_a = &scc_ports[0]; | 351 | port->port_a = &scc_ports[0]; |
306 | port->port_b = &scc_ports[1]; | 352 | port->port_b = &scc_ports[1]; |
307 | request_irq(MVME162_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED, | 353 | error = request_irq(MVME162_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED, |
308 | "SCC-B TX", port); | 354 | "SCC-B TX", port); |
309 | request_irq(MVME162_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED, | 355 | if (error) |
356 | goto fail_free_a_spcond; | ||
357 | error = request_irq(MVME162_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED, | ||
310 | "SCC-B status", port); | 358 | "SCC-B status", port); |
311 | request_irq(MVME162_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED, | 359 | if (error) |
360 | goto fail_free_b_tx; | ||
361 | error = request_irq(MVME162_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED, | ||
312 | "SCC-B RX", port); | 362 | "SCC-B RX", port); |
313 | request_irq(MVME162_IRQ_SCCB_SPCOND, scc_spcond_int, IRQF_DISABLED, | 363 | if (error) |
314 | "SCC-B special cond", port); | 364 | goto fail_free_b_stat; |
365 | error = request_irq(MVME162_IRQ_SCCB_SPCOND, scc_spcond_int, | ||
366 | IRQF_DISABLED, "SCC-B special cond", port); | ||
367 | if (error) | ||
368 | goto fail_free_b_rx; | ||
315 | 369 | ||
316 | { | 370 | { |
317 | SCC_ACCESS_INIT(port); /* Either channel will do */ | 371 | SCC_ACCESS_INIT(port); /* Either channel will do */ |
@@ -328,6 +382,23 @@ static int mvme162_scc_init(void) | |||
328 | scc_init_drivers(); | 382 | scc_init_drivers(); |
329 | 383 | ||
330 | return 0; | 384 | return 0; |
385 | |||
386 | fail_free_b_rx: | ||
387 | free_irq(MVME162_IRQ_SCCB_RX, port); | ||
388 | fail_free_b_stat: | ||
389 | free_irq(MVME162_IRQ_SCCB_STAT, port); | ||
390 | fail_free_b_tx: | ||
391 | free_irq(MVME162_IRQ_SCCB_TX, port); | ||
392 | fail_free_a_spcond: | ||
393 | free_irq(MVME162_IRQ_SCCA_SPCOND, port); | ||
394 | fail_free_a_rx: | ||
395 | free_irq(MVME162_IRQ_SCCA_RX, port); | ||
396 | fail_free_a_stat: | ||
397 | free_irq(MVME162_IRQ_SCCA_STAT, port); | ||
398 | fail_free_a_tx: | ||
399 | free_irq(MVME162_IRQ_SCCA_TX, port); | ||
400 | fail: | ||
401 | return error; | ||
331 | } | 402 | } |
332 | #endif | 403 | #endif |
333 | 404 | ||
@@ -336,6 +407,7 @@ static int mvme162_scc_init(void) | |||
336 | static int bvme6000_scc_init(void) | 407 | static int bvme6000_scc_init(void) |
337 | { | 408 | { |
338 | struct scc_port *port; | 409 | struct scc_port *port; |
410 | int error; | ||
339 | 411 | ||
340 | printk(KERN_INFO "SCC: BVME6000 Serial Driver\n"); | 412 | printk(KERN_INFO "SCC: BVME6000 Serial Driver\n"); |
341 | /* Init channel A */ | 413 | /* Init channel A */ |
@@ -345,14 +417,23 @@ static int bvme6000_scc_init(void) | |||
345 | port->datap = port->ctrlp + 4; | 417 | port->datap = port->ctrlp + 4; |
346 | port->port_a = &scc_ports[0]; | 418 | port->port_a = &scc_ports[0]; |
347 | port->port_b = &scc_ports[1]; | 419 | port->port_b = &scc_ports[1]; |
348 | request_irq(BVME_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED, | 420 | error = request_irq(BVME_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED, |
349 | "SCC-A TX", port); | 421 | "SCC-A TX", port); |
350 | request_irq(BVME_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED, | 422 | if (error) |
423 | goto fail; | ||
424 | error = request_irq(BVME_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED, | ||
351 | "SCC-A status", port); | 425 | "SCC-A status", port); |
352 | request_irq(BVME_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED, | 426 | if (error) |
427 | goto fail_free_a_tx; | ||
428 | error = request_irq(BVME_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED, | ||
353 | "SCC-A RX", port); | 429 | "SCC-A RX", port); |
354 | request_irq(BVME_IRQ_SCCA_SPCOND, scc_spcond_int, IRQF_DISABLED, | 430 | if (error) |
355 | "SCC-A special cond", port); | 431 | goto fail_free_a_stat; |
432 | error = request_irq(BVME_IRQ_SCCA_SPCOND, scc_spcond_int, | ||
433 | IRQF_DISABLED, "SCC-A special cond", port); | ||
434 | if (error) | ||
435 | goto fail_free_a_rx; | ||
436 | |||
356 | { | 437 | { |
357 | SCC_ACCESS_INIT(port); | 438 | SCC_ACCESS_INIT(port); |
358 | 439 | ||
@@ -372,14 +453,22 @@ static int bvme6000_scc_init(void) | |||
372 | port->datap = port->ctrlp + 4; | 453 | port->datap = port->ctrlp + 4; |
373 | port->port_a = &scc_ports[0]; | 454 | port->port_a = &scc_ports[0]; |
374 | port->port_b = &scc_ports[1]; | 455 | port->port_b = &scc_ports[1]; |
375 | request_irq(BVME_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED, | 456 | error = request_irq(BVME_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED, |
376 | "SCC-B TX", port); | 457 | "SCC-B TX", port); |
377 | request_irq(BVME_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED, | 458 | if (error) |
459 | goto fail_free_a_spcond; | ||
460 | error = request_irq(BVME_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED, | ||
378 | "SCC-B status", port); | 461 | "SCC-B status", port); |
379 | request_irq(BVME_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED, | 462 | if (error) |
463 | goto fail_free_b_tx; | ||
464 | error = request_irq(BVME_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED, | ||
380 | "SCC-B RX", port); | 465 | "SCC-B RX", port); |
381 | request_irq(BVME_IRQ_SCCB_SPCOND, scc_spcond_int, IRQF_DISABLED, | 466 | if (error) |
382 | "SCC-B special cond", port); | 467 | goto fail_free_b_stat; |
468 | error = request_irq(BVME_IRQ_SCCB_SPCOND, scc_spcond_int, | ||
469 | IRQF_DISABLED, "SCC-B special cond", port); | ||
470 | if (error) | ||
471 | goto fail_free_b_rx; | ||
383 | 472 | ||
384 | { | 473 | { |
385 | SCC_ACCESS_INIT(port); /* Either channel will do */ | 474 | SCC_ACCESS_INIT(port); /* Either channel will do */ |
@@ -393,6 +482,23 @@ static int bvme6000_scc_init(void) | |||
393 | scc_init_drivers(); | 482 | scc_init_drivers(); |
394 | 483 | ||
395 | return 0; | 484 | return 0; |
485 | |||
486 | fail: | ||
487 | free_irq(BVME_IRQ_SCCA_STAT, port); | ||
488 | fail_free_a_tx: | ||
489 | free_irq(BVME_IRQ_SCCA_RX, port); | ||
490 | fail_free_a_stat: | ||
491 | free_irq(BVME_IRQ_SCCA_SPCOND, port); | ||
492 | fail_free_a_rx: | ||
493 | free_irq(BVME_IRQ_SCCB_TX, port); | ||
494 | fail_free_a_spcond: | ||
495 | free_irq(BVME_IRQ_SCCB_STAT, port); | ||
496 | fail_free_b_tx: | ||
497 | free_irq(BVME_IRQ_SCCB_RX, port); | ||
498 | fail_free_b_stat: | ||
499 | free_irq(BVME_IRQ_SCCB_SPCOND, port); | ||
500 | fail_free_b_rx: | ||
501 | return error; | ||
396 | } | 502 | } |
397 | #endif | 503 | #endif |
398 | 504 | ||