diff options
author | Paul Mackerras <paulus@samba.org> | 2008-05-09 06:12:06 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2008-05-09 06:12:06 -0400 |
commit | 2a5f2e3e6cd1ce9fb3f8b186b6bc9aa1f1497a92 (patch) | |
tree | b2306840f227972a7c9d4a2b75e516fe81358ce8 /drivers/isdn | |
parent | 02539d71fa98d5737bb668b02286c76241e4bac9 (diff) | |
parent | 78be76476a34a77f0ea9db2f78ba46a2b0fd5ab5 (diff) |
Merge branch 'for-2.6.26' of master.kernel.org:/pub/scm/linux/kernel/git/jwboyer/powerpc-4xx into merge
Diffstat (limited to 'drivers/isdn')
-rw-r--r-- | drivers/isdn/capi/capi.c | 9 | ||||
-rw-r--r-- | drivers/isdn/capi/kcapi_proc.c | 24 | ||||
-rw-r--r-- | drivers/isdn/divert/divert_procfs.c | 5 | ||||
-rw-r--r-- | drivers/isdn/gigaset/ser-gigaset.c | 15 | ||||
-rw-r--r-- | drivers/isdn/hardware/eicon/divasproc.c | 8 | ||||
-rw-r--r-- | drivers/isdn/hysdn/hysdn_procconf.c | 10 | ||||
-rw-r--r-- | drivers/isdn/hysdn/hysdn_proclog.c | 8 | ||||
-rw-r--r-- | drivers/isdn/i4l/isdn_tty.c | 30 |
8 files changed, 46 insertions, 63 deletions
diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c index 24c6b7ca62be..6ca0bb949ad3 100644 --- a/drivers/isdn/capi/capi.c +++ b/drivers/isdn/capi/capi.c | |||
@@ -1111,11 +1111,12 @@ static int capinc_tty_write(struct tty_struct * tty, | |||
1111 | return count; | 1111 | return count; |
1112 | } | 1112 | } |
1113 | 1113 | ||
1114 | static void capinc_tty_put_char(struct tty_struct *tty, unsigned char ch) | 1114 | static int capinc_tty_put_char(struct tty_struct *tty, unsigned char ch) |
1115 | { | 1115 | { |
1116 | struct capiminor *mp = (struct capiminor *)tty->driver_data; | 1116 | struct capiminor *mp = (struct capiminor *)tty->driver_data; |
1117 | struct sk_buff *skb; | 1117 | struct sk_buff *skb; |
1118 | unsigned long flags; | 1118 | unsigned long flags; |
1119 | int ret = 1; | ||
1119 | 1120 | ||
1120 | #ifdef _DEBUG_TTYFUNCS | 1121 | #ifdef _DEBUG_TTYFUNCS |
1121 | printk(KERN_DEBUG "capinc_put_char(%u)\n", ch); | 1122 | printk(KERN_DEBUG "capinc_put_char(%u)\n", ch); |
@@ -1125,7 +1126,7 @@ static void capinc_tty_put_char(struct tty_struct *tty, unsigned char ch) | |||
1125 | #ifdef _DEBUG_TTYFUNCS | 1126 | #ifdef _DEBUG_TTYFUNCS |
1126 | printk(KERN_DEBUG "capinc_tty_put_char: mp or mp->ncci NULL\n"); | 1127 | printk(KERN_DEBUG "capinc_tty_put_char: mp or mp->ncci NULL\n"); |
1127 | #endif | 1128 | #endif |
1128 | return; | 1129 | return 0; |
1129 | } | 1130 | } |
1130 | 1131 | ||
1131 | spin_lock_irqsave(&workaround_lock, flags); | 1132 | spin_lock_irqsave(&workaround_lock, flags); |
@@ -1134,7 +1135,7 @@ static void capinc_tty_put_char(struct tty_struct *tty, unsigned char ch) | |||
1134 | if (skb_tailroom(skb) > 0) { | 1135 | if (skb_tailroom(skb) > 0) { |
1135 | *(skb_put(skb, 1)) = ch; | 1136 | *(skb_put(skb, 1)) = ch; |
1136 | spin_unlock_irqrestore(&workaround_lock, flags); | 1137 | spin_unlock_irqrestore(&workaround_lock, flags); |
1137 | return; | 1138 | return 1; |
1138 | } | 1139 | } |
1139 | mp->ttyskb = NULL; | 1140 | mp->ttyskb = NULL; |
1140 | skb_queue_tail(&mp->outqueue, skb); | 1141 | skb_queue_tail(&mp->outqueue, skb); |
@@ -1148,8 +1149,10 @@ static void capinc_tty_put_char(struct tty_struct *tty, unsigned char ch) | |||
1148 | mp->ttyskb = skb; | 1149 | mp->ttyskb = skb; |
1149 | } else { | 1150 | } else { |
1150 | printk(KERN_ERR "capinc_put_char: char %u lost\n", ch); | 1151 | printk(KERN_ERR "capinc_put_char: char %u lost\n", ch); |
1152 | ret = 0; | ||
1151 | } | 1153 | } |
1152 | spin_unlock_irqrestore(&workaround_lock, flags); | 1154 | spin_unlock_irqrestore(&workaround_lock, flags); |
1155 | return ret; | ||
1153 | } | 1156 | } |
1154 | 1157 | ||
1155 | static void capinc_tty_flush_chars(struct tty_struct *tty) | 1158 | static void capinc_tty_flush_chars(struct tty_struct *tty) |
diff --git a/drivers/isdn/capi/kcapi_proc.c b/drivers/isdn/capi/kcapi_proc.c index 845a797b0030..c29208bd7521 100644 --- a/drivers/isdn/capi/kcapi_proc.c +++ b/drivers/isdn/capi/kcapi_proc.c | |||
@@ -114,6 +114,7 @@ static int seq_contrstats_open(struct inode *inode, struct file *file) | |||
114 | } | 114 | } |
115 | 115 | ||
116 | static const struct file_operations proc_controller_ops = { | 116 | static const struct file_operations proc_controller_ops = { |
117 | .owner = THIS_MODULE, | ||
117 | .open = seq_controller_open, | 118 | .open = seq_controller_open, |
118 | .read = seq_read, | 119 | .read = seq_read, |
119 | .llseek = seq_lseek, | 120 | .llseek = seq_lseek, |
@@ -121,6 +122,7 @@ static const struct file_operations proc_controller_ops = { | |||
121 | }; | 122 | }; |
122 | 123 | ||
123 | static const struct file_operations proc_contrstats_ops = { | 124 | static const struct file_operations proc_contrstats_ops = { |
125 | .owner = THIS_MODULE, | ||
124 | .open = seq_contrstats_open, | 126 | .open = seq_contrstats_open, |
125 | .read = seq_read, | 127 | .read = seq_read, |
126 | .llseek = seq_lseek, | 128 | .llseek = seq_lseek, |
@@ -219,6 +221,7 @@ seq_applstats_open(struct inode *inode, struct file *file) | |||
219 | } | 221 | } |
220 | 222 | ||
221 | static const struct file_operations proc_applications_ops = { | 223 | static const struct file_operations proc_applications_ops = { |
224 | .owner = THIS_MODULE, | ||
222 | .open = seq_applications_open, | 225 | .open = seq_applications_open, |
223 | .read = seq_read, | 226 | .read = seq_read, |
224 | .llseek = seq_lseek, | 227 | .llseek = seq_lseek, |
@@ -226,21 +229,13 @@ static const struct file_operations proc_applications_ops = { | |||
226 | }; | 229 | }; |
227 | 230 | ||
228 | static const struct file_operations proc_applstats_ops = { | 231 | static const struct file_operations proc_applstats_ops = { |
232 | .owner = THIS_MODULE, | ||
229 | .open = seq_applstats_open, | 233 | .open = seq_applstats_open, |
230 | .read = seq_read, | 234 | .read = seq_read, |
231 | .llseek = seq_lseek, | 235 | .llseek = seq_lseek, |
232 | .release = seq_release, | 236 | .release = seq_release, |
233 | }; | 237 | }; |
234 | 238 | ||
235 | static void | ||
236 | create_seq_entry(char *name, mode_t mode, const struct file_operations *f) | ||
237 | { | ||
238 | struct proc_dir_entry *entry; | ||
239 | entry = create_proc_entry(name, mode, NULL); | ||
240 | if (entry) | ||
241 | entry->proc_fops = f; | ||
242 | } | ||
243 | |||
244 | // --------------------------------------------------------------------------- | 239 | // --------------------------------------------------------------------------- |
245 | 240 | ||
246 | static void *capi_driver_start(struct seq_file *seq, loff_t *pos) | 241 | static void *capi_driver_start(struct seq_file *seq, loff_t *pos) |
@@ -283,6 +278,7 @@ seq_capi_driver_open(struct inode *inode, struct file *file) | |||
283 | } | 278 | } |
284 | 279 | ||
285 | static const struct file_operations proc_driver_ops = { | 280 | static const struct file_operations proc_driver_ops = { |
281 | .owner = THIS_MODULE, | ||
286 | .open = seq_capi_driver_open, | 282 | .open = seq_capi_driver_open, |
287 | .read = seq_read, | 283 | .read = seq_read, |
288 | .llseek = seq_lseek, | 284 | .llseek = seq_lseek, |
@@ -296,11 +292,11 @@ kcapi_proc_init(void) | |||
296 | { | 292 | { |
297 | proc_mkdir("capi", NULL); | 293 | proc_mkdir("capi", NULL); |
298 | proc_mkdir("capi/controllers", NULL); | 294 | proc_mkdir("capi/controllers", NULL); |
299 | create_seq_entry("capi/controller", 0, &proc_controller_ops); | 295 | proc_create("capi/controller", 0, NULL, &proc_controller_ops); |
300 | create_seq_entry("capi/contrstats", 0, &proc_contrstats_ops); | 296 | proc_create("capi/contrstats", 0, NULL, &proc_contrstats_ops); |
301 | create_seq_entry("capi/applications", 0, &proc_applications_ops); | 297 | proc_create("capi/applications", 0, NULL, &proc_applications_ops); |
302 | create_seq_entry("capi/applstats", 0, &proc_applstats_ops); | 298 | proc_create("capi/applstats", 0, NULL, &proc_applstats_ops); |
303 | create_seq_entry("capi/driver", 0, &proc_driver_ops); | 299 | proc_create("capi/driver", 0, NULL, &proc_driver_ops); |
304 | } | 300 | } |
305 | 301 | ||
306 | void __exit | 302 | void __exit |
diff --git a/drivers/isdn/divert/divert_procfs.c b/drivers/isdn/divert/divert_procfs.c index 4fd4c46892e3..8b256a617c8a 100644 --- a/drivers/isdn/divert/divert_procfs.c +++ b/drivers/isdn/divert/divert_procfs.c | |||
@@ -288,13 +288,12 @@ divert_dev_init(void) | |||
288 | isdn_proc_entry = proc_mkdir("isdn", init_net.proc_net); | 288 | isdn_proc_entry = proc_mkdir("isdn", init_net.proc_net); |
289 | if (!isdn_proc_entry) | 289 | if (!isdn_proc_entry) |
290 | return (-1); | 290 | return (-1); |
291 | isdn_divert_entry = create_proc_entry("divert", S_IFREG | S_IRUGO, isdn_proc_entry); | 291 | isdn_divert_entry = proc_create("divert", S_IFREG | S_IRUGO, |
292 | isdn_proc_entry, &isdn_fops); | ||
292 | if (!isdn_divert_entry) { | 293 | if (!isdn_divert_entry) { |
293 | remove_proc_entry("isdn", init_net.proc_net); | 294 | remove_proc_entry("isdn", init_net.proc_net); |
294 | return (-1); | 295 | return (-1); |
295 | } | 296 | } |
296 | isdn_divert_entry->proc_fops = &isdn_fops; | ||
297 | isdn_divert_entry->owner = THIS_MODULE; | ||
298 | #endif /* CONFIG_PROC_FS */ | 297 | #endif /* CONFIG_PROC_FS */ |
299 | 298 | ||
300 | return (0); | 299 | return (0); |
diff --git a/drivers/isdn/gigaset/ser-gigaset.c b/drivers/isdn/gigaset/ser-gigaset.c index fceeb1d57682..45d1ee93cd39 100644 --- a/drivers/isdn/gigaset/ser-gigaset.c +++ b/drivers/isdn/gigaset/ser-gigaset.c | |||
@@ -68,10 +68,10 @@ static int write_modem(struct cardstate *cs) | |||
68 | struct tty_struct *tty = cs->hw.ser->tty; | 68 | struct tty_struct *tty = cs->hw.ser->tty; |
69 | struct bc_state *bcs = &cs->bcs[0]; /* only one channel */ | 69 | struct bc_state *bcs = &cs->bcs[0]; /* only one channel */ |
70 | struct sk_buff *skb = bcs->tx_skb; | 70 | struct sk_buff *skb = bcs->tx_skb; |
71 | int sent; | 71 | int sent = -EOPNOTSUPP; |
72 | 72 | ||
73 | if (!tty || !tty->driver || !skb) | 73 | if (!tty || !tty->driver || !skb) |
74 | return -EFAULT; | 74 | return -EINVAL; |
75 | 75 | ||
76 | if (!skb->len) { | 76 | if (!skb->len) { |
77 | dev_kfree_skb_any(skb); | 77 | dev_kfree_skb_any(skb); |
@@ -80,7 +80,8 @@ static int write_modem(struct cardstate *cs) | |||
80 | } | 80 | } |
81 | 81 | ||
82 | set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); | 82 | set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); |
83 | sent = tty->driver->write(tty, skb->data, skb->len); | 83 | if (tty->ops->write) |
84 | sent = tty->ops->write(tty, skb->data, skb->len); | ||
84 | gig_dbg(DEBUG_OUTPUT, "write_modem: sent %d", sent); | 85 | gig_dbg(DEBUG_OUTPUT, "write_modem: sent %d", sent); |
85 | if (sent < 0) { | 86 | if (sent < 0) { |
86 | /* error */ | 87 | /* error */ |
@@ -120,7 +121,7 @@ static int send_cb(struct cardstate *cs) | |||
120 | 121 | ||
121 | if (cb->len) { | 122 | if (cb->len) { |
122 | set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); | 123 | set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); |
123 | sent = tty->driver->write(tty, cb->buf + cb->offset, cb->len); | 124 | sent = tty->ops->write(tty, cb->buf + cb->offset, cb->len); |
124 | if (sent < 0) { | 125 | if (sent < 0) { |
125 | /* error */ | 126 | /* error */ |
126 | gig_dbg(DEBUG_OUTPUT, "send_cb: write error %d", sent); | 127 | gig_dbg(DEBUG_OUTPUT, "send_cb: write error %d", sent); |
@@ -440,14 +441,14 @@ static int gigaset_set_modem_ctrl(struct cardstate *cs, unsigned old_state, unsi | |||
440 | struct tty_struct *tty = cs->hw.ser->tty; | 441 | struct tty_struct *tty = cs->hw.ser->tty; |
441 | unsigned int set, clear; | 442 | unsigned int set, clear; |
442 | 443 | ||
443 | if (!tty || !tty->driver || !tty->driver->tiocmset) | 444 | if (!tty || !tty->driver || !tty->ops->tiocmset) |
444 | return -EFAULT; | 445 | return -EINVAL; |
445 | set = new_state & ~old_state; | 446 | set = new_state & ~old_state; |
446 | clear = old_state & ~new_state; | 447 | clear = old_state & ~new_state; |
447 | if (!set && !clear) | 448 | if (!set && !clear) |
448 | return 0; | 449 | return 0; |
449 | gig_dbg(DEBUG_IF, "tiocmset set %x clear %x", set, clear); | 450 | gig_dbg(DEBUG_IF, "tiocmset set %x clear %x", set, clear); |
450 | return tty->driver->tiocmset(tty, NULL, set, clear); | 451 | return tty->ops->tiocmset(tty, NULL, set, clear); |
451 | } | 452 | } |
452 | 453 | ||
453 | static int gigaset_baud_rate(struct cardstate *cs, unsigned cflag) | 454 | static int gigaset_baud_rate(struct cardstate *cs, unsigned cflag) |
diff --git a/drivers/isdn/hardware/eicon/divasproc.c b/drivers/isdn/hardware/eicon/divasproc.c index 0632a2606998..fae895828a17 100644 --- a/drivers/isdn/hardware/eicon/divasproc.c +++ b/drivers/isdn/hardware/eicon/divasproc.c | |||
@@ -125,15 +125,11 @@ static const struct file_operations divas_fops = { | |||
125 | 125 | ||
126 | int create_divas_proc(void) | 126 | int create_divas_proc(void) |
127 | { | 127 | { |
128 | divas_proc_entry = create_proc_entry(divas_proc_name, | 128 | proc_create(divas_proc_name, S_IFREG | S_IRUGO, proc_net_eicon, |
129 | S_IFREG | S_IRUGO, | 129 | &divas_fops); |
130 | proc_net_eicon); | ||
131 | if (!divas_proc_entry) | 130 | if (!divas_proc_entry) |
132 | return (0); | 131 | return (0); |
133 | 132 | ||
134 | divas_proc_entry->proc_fops = &divas_fops; | ||
135 | divas_proc_entry->owner = THIS_MODULE; | ||
136 | |||
137 | return (1); | 133 | return (1); |
138 | } | 134 | } |
139 | 135 | ||
diff --git a/drivers/isdn/hysdn/hysdn_procconf.c b/drivers/isdn/hysdn/hysdn_procconf.c index 27d890b48f88..15906d005b05 100644 --- a/drivers/isdn/hysdn/hysdn_procconf.c +++ b/drivers/isdn/hysdn/hysdn_procconf.c | |||
@@ -370,6 +370,7 @@ hysdn_conf_close(struct inode *ino, struct file *filep) | |||
370 | /******************************************************/ | 370 | /******************************************************/ |
371 | static const struct file_operations conf_fops = | 371 | static const struct file_operations conf_fops = |
372 | { | 372 | { |
373 | .owner = THIS_MODULE, | ||
373 | .llseek = no_llseek, | 374 | .llseek = no_llseek, |
374 | .read = hysdn_conf_read, | 375 | .read = hysdn_conf_read, |
375 | .write = hysdn_conf_write, | 376 | .write = hysdn_conf_write, |
@@ -402,11 +403,10 @@ hysdn_procconf_init(void) | |||
402 | while (card) { | 403 | while (card) { |
403 | 404 | ||
404 | sprintf(conf_name, "%s%d", PROC_CONF_BASENAME, card->myid); | 405 | sprintf(conf_name, "%s%d", PROC_CONF_BASENAME, card->myid); |
405 | if ((card->procconf = (void *) create_proc_entry(conf_name, | 406 | if ((card->procconf = (void *) proc_create(conf_name, |
406 | S_IFREG | S_IRUGO | S_IWUSR, | 407 | S_IFREG | S_IRUGO | S_IWUSR, |
407 | hysdn_proc_entry)) != NULL) { | 408 | hysdn_proc_entry, |
408 | ((struct proc_dir_entry *) card->procconf)->proc_fops = &conf_fops; | 409 | &conf_fops)) != NULL) { |
409 | ((struct proc_dir_entry *) card->procconf)->owner = THIS_MODULE; | ||
410 | hysdn_proclog_init(card); /* init the log file entry */ | 410 | hysdn_proclog_init(card); /* init the log file entry */ |
411 | } | 411 | } |
412 | card = card->next; /* next entry */ | 412 | card = card->next; /* next entry */ |
diff --git a/drivers/isdn/hysdn/hysdn_proclog.c b/drivers/isdn/hysdn/hysdn_proclog.c index 27b3991fb0ec..8991d2c8ee4a 100644 --- a/drivers/isdn/hysdn/hysdn_proclog.c +++ b/drivers/isdn/hysdn/hysdn_proclog.c | |||
@@ -380,6 +380,7 @@ hysdn_log_poll(struct file *file, poll_table * wait) | |||
380 | /**************************************************/ | 380 | /**************************************************/ |
381 | static const struct file_operations log_fops = | 381 | static const struct file_operations log_fops = |
382 | { | 382 | { |
383 | .owner = THIS_MODULE, | ||
383 | .llseek = no_llseek, | 384 | .llseek = no_llseek, |
384 | .read = hysdn_log_read, | 385 | .read = hysdn_log_read, |
385 | .write = hysdn_log_write, | 386 | .write = hysdn_log_write, |
@@ -402,10 +403,9 @@ hysdn_proclog_init(hysdn_card * card) | |||
402 | 403 | ||
403 | if ((pd = kzalloc(sizeof(struct procdata), GFP_KERNEL)) != NULL) { | 404 | if ((pd = kzalloc(sizeof(struct procdata), GFP_KERNEL)) != NULL) { |
404 | sprintf(pd->log_name, "%s%d", PROC_LOG_BASENAME, card->myid); | 405 | sprintf(pd->log_name, "%s%d", PROC_LOG_BASENAME, card->myid); |
405 | if ((pd->log = create_proc_entry(pd->log_name, S_IFREG | S_IRUGO | S_IWUSR, hysdn_proc_entry)) != NULL) { | 406 | pd->log = proc_create(pd->log_name, |
406 | pd->log->proc_fops = &log_fops; | 407 | S_IFREG | S_IRUGO | S_IWUSR, hysdn_proc_entry, |
407 | pd->log->owner = THIS_MODULE; | 408 | &log_fops); |
408 | } | ||
409 | 409 | ||
410 | init_waitqueue_head(&(pd->rd_queue)); | 410 | init_waitqueue_head(&(pd->rd_queue)); |
411 | 411 | ||
diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index 8af0df1d5b8c..1a2222cbb805 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c | |||
@@ -1352,12 +1352,14 @@ isdn_tty_tiocmget(struct tty_struct *tty, struct file *file) | |||
1352 | if (tty->flags & (1 << TTY_IO_ERROR)) | 1352 | if (tty->flags & (1 << TTY_IO_ERROR)) |
1353 | return -EIO; | 1353 | return -EIO; |
1354 | 1354 | ||
1355 | lock_kernel(); | ||
1355 | #ifdef ISDN_DEBUG_MODEM_IOCTL | 1356 | #ifdef ISDN_DEBUG_MODEM_IOCTL |
1356 | printk(KERN_DEBUG "ttyI%d ioctl TIOCMGET\n", info->line); | 1357 | printk(KERN_DEBUG "ttyI%d ioctl TIOCMGET\n", info->line); |
1357 | #endif | 1358 | #endif |
1358 | 1359 | ||
1359 | control = info->mcr; | 1360 | control = info->mcr; |
1360 | status = info->msr; | 1361 | status = info->msr; |
1362 | unlock_kernel(); | ||
1361 | return ((control & UART_MCR_RTS) ? TIOCM_RTS : 0) | 1363 | return ((control & UART_MCR_RTS) ? TIOCM_RTS : 0) |
1362 | | ((control & UART_MCR_DTR) ? TIOCM_DTR : 0) | 1364 | | ((control & UART_MCR_DTR) ? TIOCM_DTR : 0) |
1363 | | ((status & UART_MSR_DCD) ? TIOCM_CAR : 0) | 1365 | | ((status & UART_MSR_DCD) ? TIOCM_CAR : 0) |
@@ -1381,6 +1383,7 @@ isdn_tty_tiocmset(struct tty_struct *tty, struct file *file, | |||
1381 | printk(KERN_DEBUG "ttyI%d ioctl TIOCMxxx: %x %x\n", info->line, set, clear); | 1383 | printk(KERN_DEBUG "ttyI%d ioctl TIOCMxxx: %x %x\n", info->line, set, clear); |
1382 | #endif | 1384 | #endif |
1383 | 1385 | ||
1386 | lock_kernel(); | ||
1384 | if (set & TIOCM_RTS) | 1387 | if (set & TIOCM_RTS) |
1385 | info->mcr |= UART_MCR_RTS; | 1388 | info->mcr |= UART_MCR_RTS; |
1386 | if (set & TIOCM_DTR) { | 1389 | if (set & TIOCM_DTR) { |
@@ -1402,6 +1405,7 @@ isdn_tty_tiocmset(struct tty_struct *tty, struct file *file, | |||
1402 | isdn_tty_modem_hup(info, 1); | 1405 | isdn_tty_modem_hup(info, 1); |
1403 | } | 1406 | } |
1404 | } | 1407 | } |
1408 | unlock_kernel(); | ||
1405 | return 0; | 1409 | return 0; |
1406 | } | 1410 | } |
1407 | 1411 | ||
@@ -1435,21 +1439,6 @@ isdn_tty_ioctl(struct tty_struct *tty, struct file *file, | |||
1435 | return retval; | 1439 | return retval; |
1436 | tty_wait_until_sent(tty, 0); | 1440 | tty_wait_until_sent(tty, 0); |
1437 | return 0; | 1441 | return 0; |
1438 | case TIOCGSOFTCAR: | ||
1439 | #ifdef ISDN_DEBUG_MODEM_IOCTL | ||
1440 | printk(KERN_DEBUG "ttyI%d ioctl TIOCGSOFTCAR\n", info->line); | ||
1441 | #endif | ||
1442 | return put_user(C_CLOCAL(tty) ? 1 : 0, (ulong __user *) arg); | ||
1443 | case TIOCSSOFTCAR: | ||
1444 | #ifdef ISDN_DEBUG_MODEM_IOCTL | ||
1445 | printk(KERN_DEBUG "ttyI%d ioctl TIOCSSOFTCAR\n", info->line); | ||
1446 | #endif | ||
1447 | if (get_user(arg, (ulong __user *) arg)) | ||
1448 | return -EFAULT; | ||
1449 | tty->termios->c_cflag = | ||
1450 | ((tty->termios->c_cflag & ~CLOCAL) | | ||
1451 | (arg ? CLOCAL : 0)); | ||
1452 | return 0; | ||
1453 | case TIOCSERGETLSR: /* Get line status register */ | 1442 | case TIOCSERGETLSR: /* Get line status register */ |
1454 | #ifdef ISDN_DEBUG_MODEM_IOCTL | 1443 | #ifdef ISDN_DEBUG_MODEM_IOCTL |
1455 | printk(KERN_DEBUG "ttyI%d ioctl TIOCSERGETLSR\n", info->line); | 1444 | printk(KERN_DEBUG "ttyI%d ioctl TIOCSERGETLSR\n", info->line); |
@@ -1472,13 +1461,14 @@ isdn_tty_set_termios(struct tty_struct *tty, struct ktermios *old_termios) | |||
1472 | if (!old_termios) | 1461 | if (!old_termios) |
1473 | isdn_tty_change_speed(info); | 1462 | isdn_tty_change_speed(info); |
1474 | else { | 1463 | else { |
1475 | if (tty->termios->c_cflag == old_termios->c_cflag) | 1464 | if (tty->termios->c_cflag == old_termios->c_cflag && |
1465 | tty->termios->c_ispeed == old_termios->c_ispeed && | ||
1466 | tty->termios->c_ospeed == old_termios->c_ospeed) | ||
1476 | return; | 1467 | return; |
1477 | isdn_tty_change_speed(info); | 1468 | isdn_tty_change_speed(info); |
1478 | if ((old_termios->c_cflag & CRTSCTS) && | 1469 | if ((old_termios->c_cflag & CRTSCTS) && |
1479 | !(tty->termios->c_cflag & CRTSCTS)) { | 1470 | !(tty->termios->c_cflag & CRTSCTS)) |
1480 | tty->hw_stopped = 0; | 1471 | tty->hw_stopped = 0; |
1481 | } | ||
1482 | } | 1472 | } |
1483 | } | 1473 | } |
1484 | 1474 | ||
@@ -1718,9 +1708,7 @@ isdn_tty_close(struct tty_struct *tty, struct file *filp) | |||
1718 | } | 1708 | } |
1719 | dev->modempoll--; | 1709 | dev->modempoll--; |
1720 | isdn_tty_shutdown(info); | 1710 | isdn_tty_shutdown(info); |
1721 | 1711 | isdn_tty_flush_buffer(tty); | |
1722 | if (tty->driver->flush_buffer) | ||
1723 | tty->driver->flush_buffer(tty); | ||
1724 | tty_ldisc_flush(tty); | 1712 | tty_ldisc_flush(tty); |
1725 | info->tty = NULL; | 1713 | info->tty = NULL; |
1726 | info->ncarrier = 0; | 1714 | info->ncarrier = 0; |