]> Pileus Git - ~andy/linux/blob - net/irda/ircomm/ircomm_tty.c
Merge 3.5-rc4 into tty-next
[~andy/linux] / net / irda / ircomm / ircomm_tty.c
1 /*********************************************************************
2  *
3  * Filename:      ircomm_tty.c
4  * Version:       1.0
5  * Description:   IrCOMM serial TTY driver
6  * Status:        Experimental.
7  * Author:        Dag Brattli <dagb@cs.uit.no>
8  * Created at:    Sun Jun  6 21:00:56 1999
9  * Modified at:   Wed Feb 23 00:09:02 2000
10  * Modified by:   Dag Brattli <dagb@cs.uit.no>
11  * Sources:       serial.c and previous IrCOMM work by Takahide Higuchi
12  *
13  *     Copyright (c) 1999-2000 Dag Brattli, All Rights Reserved.
14  *     Copyright (c) 2000-2003 Jean Tourrilhes <jt@hpl.hp.com>
15  *
16  *     This program is free software; you can redistribute it and/or
17  *     modify it under the terms of the GNU General Public License as
18  *     published by the Free Software Foundation; either version 2 of
19  *     the License, or (at your option) any later version.
20  *
21  *     This program is distributed in the hope that it will be useful,
22  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
23  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24  *     GNU General Public License for more details.
25  *
26  *     You should have received a copy of the GNU General Public License
27  *     along with this program; if not, write to the Free Software
28  *     Foundation, Inc., 59 Temple Place, Suite 330, Boston,
29  *     MA 02111-1307 USA
30  *
31  ********************************************************************/
32
33 #include <linux/init.h>
34 #include <linux/module.h>
35 #include <linux/fs.h>
36 #include <linux/slab.h>
37 #include <linux/sched.h>
38 #include <linux/seq_file.h>
39 #include <linux/termios.h>
40 #include <linux/tty.h>
41 #include <linux/tty_flip.h>
42 #include <linux/interrupt.h>
43 #include <linux/device.h>               /* for MODULE_ALIAS_CHARDEV_MAJOR */
44
45 #include <asm/uaccess.h>
46
47 #include <net/irda/irda.h>
48 #include <net/irda/irmod.h>
49
50 #include <net/irda/ircomm_core.h>
51 #include <net/irda/ircomm_param.h>
52 #include <net/irda/ircomm_tty_attach.h>
53 #include <net/irda/ircomm_tty.h>
54
55 static int  ircomm_tty_open(struct tty_struct *tty, struct file *filp);
56 static void ircomm_tty_close(struct tty_struct * tty, struct file *filp);
57 static int  ircomm_tty_write(struct tty_struct * tty,
58                              const unsigned char *buf, int count);
59 static int  ircomm_tty_write_room(struct tty_struct *tty);
60 static void ircomm_tty_throttle(struct tty_struct *tty);
61 static void ircomm_tty_unthrottle(struct tty_struct *tty);
62 static int  ircomm_tty_chars_in_buffer(struct tty_struct *tty);
63 static void ircomm_tty_flush_buffer(struct tty_struct *tty);
64 static void ircomm_tty_send_xchar(struct tty_struct *tty, char ch);
65 static void ircomm_tty_wait_until_sent(struct tty_struct *tty, int timeout);
66 static void ircomm_tty_hangup(struct tty_struct *tty);
67 static void ircomm_tty_do_softint(struct work_struct *work);
68 static void ircomm_tty_shutdown(struct ircomm_tty_cb *self);
69 static void ircomm_tty_stop(struct tty_struct *tty);
70
71 static int ircomm_tty_data_indication(void *instance, void *sap,
72                                       struct sk_buff *skb);
73 static int ircomm_tty_control_indication(void *instance, void *sap,
74                                          struct sk_buff *skb);
75 static void ircomm_tty_flow_indication(void *instance, void *sap,
76                                        LOCAL_FLOW cmd);
77 #ifdef CONFIG_PROC_FS
78 static const struct file_operations ircomm_tty_proc_fops;
79 #endif /* CONFIG_PROC_FS */
80 static struct tty_driver *driver;
81
82 static hashbin_t *ircomm_tty = NULL;
83
84 static const struct tty_operations ops = {
85         .open            = ircomm_tty_open,
86         .close           = ircomm_tty_close,
87         .write           = ircomm_tty_write,
88         .write_room      = ircomm_tty_write_room,
89         .chars_in_buffer = ircomm_tty_chars_in_buffer,
90         .flush_buffer    = ircomm_tty_flush_buffer,
91         .ioctl           = ircomm_tty_ioctl,    /* ircomm_tty_ioctl.c */
92         .tiocmget        = ircomm_tty_tiocmget, /* ircomm_tty_ioctl.c */
93         .tiocmset        = ircomm_tty_tiocmset, /* ircomm_tty_ioctl.c */
94         .throttle        = ircomm_tty_throttle,
95         .unthrottle      = ircomm_tty_unthrottle,
96         .send_xchar      = ircomm_tty_send_xchar,
97         .set_termios     = ircomm_tty_set_termios,
98         .stop            = ircomm_tty_stop,
99         .start           = ircomm_tty_start,
100         .hangup          = ircomm_tty_hangup,
101         .wait_until_sent = ircomm_tty_wait_until_sent,
102 #ifdef CONFIG_PROC_FS
103         .proc_fops       = &ircomm_tty_proc_fops,
104 #endif /* CONFIG_PROC_FS */
105 };
106
107 static void ircomm_port_raise_dtr_rts(struct tty_port *port, int raise)
108 {
109         struct ircomm_tty_cb *self = container_of(port, struct ircomm_tty_cb,
110                         port);
111         /*
112          * Here, we use to lock those two guys, but as ircomm_param_request()
113          * does it itself, I don't see the point (and I see the deadlock).
114          * Jean II
115          */
116         if (raise)
117                 self->settings.dte |= IRCOMM_RTS | IRCOMM_DTR;
118         else
119                 self->settings.dte &= ~(IRCOMM_RTS | IRCOMM_DTR);
120
121         ircomm_param_request(self, IRCOMM_DTE, TRUE);
122 }
123
124 static int ircomm_port_carrier_raised(struct tty_port *port)
125 {
126         struct ircomm_tty_cb *self = container_of(port, struct ircomm_tty_cb,
127                         port);
128         return self->settings.dce & IRCOMM_CD;
129 }
130
131 static const struct tty_port_operations ircomm_port_ops = {
132         .dtr_rts = ircomm_port_raise_dtr_rts,
133         .carrier_raised = ircomm_port_carrier_raised,
134 };
135
136 /*
137  * Function ircomm_tty_init()
138  *
139  *    Init IrCOMM TTY layer/driver
140  *
141  */
142 static int __init ircomm_tty_init(void)
143 {
144         driver = alloc_tty_driver(IRCOMM_TTY_PORTS);
145         if (!driver)
146                 return -ENOMEM;
147         ircomm_tty = hashbin_new(HB_LOCK);
148         if (ircomm_tty == NULL) {
149                 IRDA_ERROR("%s(), can't allocate hashbin!\n", __func__);
150                 put_tty_driver(driver);
151                 return -ENOMEM;
152         }
153
154         driver->driver_name     = "ircomm";
155         driver->name            = "ircomm";
156         driver->major           = IRCOMM_TTY_MAJOR;
157         driver->minor_start     = IRCOMM_TTY_MINOR;
158         driver->type            = TTY_DRIVER_TYPE_SERIAL;
159         driver->subtype         = SERIAL_TYPE_NORMAL;
160         driver->init_termios    = tty_std_termios;
161         driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
162         driver->flags           = TTY_DRIVER_REAL_RAW;
163         tty_set_operations(driver, &ops);
164         if (tty_register_driver(driver)) {
165                 IRDA_ERROR("%s(): Couldn't register serial driver\n",
166                            __func__);
167                 put_tty_driver(driver);
168                 return -1;
169         }
170         return 0;
171 }
172
173 static void __exit __ircomm_tty_cleanup(struct ircomm_tty_cb *self)
174 {
175         IRDA_DEBUG(0, "%s()\n", __func__ );
176
177         IRDA_ASSERT(self != NULL, return;);
178         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
179
180         ircomm_tty_shutdown(self);
181
182         self->magic = 0;
183         kfree(self);
184 }
185
186 /*
187  * Function ircomm_tty_cleanup ()
188  *
189  *    Remove IrCOMM TTY layer/driver
190  *
191  */
192 static void __exit ircomm_tty_cleanup(void)
193 {
194         int ret;
195
196         IRDA_DEBUG(4, "%s()\n", __func__ );
197
198         ret = tty_unregister_driver(driver);
199         if (ret) {
200                 IRDA_ERROR("%s(), failed to unregister driver\n",
201                            __func__);
202                 return;
203         }
204
205         hashbin_delete(ircomm_tty, (FREE_FUNC) __ircomm_tty_cleanup);
206         put_tty_driver(driver);
207 }
208
209 /*
210  * Function ircomm_startup (self)
211  *
212  *
213  *
214  */
215 static int ircomm_tty_startup(struct ircomm_tty_cb *self)
216 {
217         notify_t notify;
218         int ret = -ENODEV;
219
220         IRDA_DEBUG(2, "%s()\n", __func__ );
221
222         IRDA_ASSERT(self != NULL, return -1;);
223         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
224
225         /* Check if already open */
226         if (test_and_set_bit(ASYNCB_INITIALIZED, &self->port.flags)) {
227                 IRDA_DEBUG(2, "%s(), already open so break out!\n", __func__ );
228                 return 0;
229         }
230
231         /* Register with IrCOMM */
232         irda_notify_init(&notify);
233         /* These callbacks we must handle ourselves */
234         notify.data_indication       = ircomm_tty_data_indication;
235         notify.udata_indication      = ircomm_tty_control_indication;
236         notify.flow_indication       = ircomm_tty_flow_indication;
237
238         /* Use the ircomm_tty interface for these ones */
239         notify.disconnect_indication = ircomm_tty_disconnect_indication;
240         notify.connect_confirm       = ircomm_tty_connect_confirm;
241         notify.connect_indication    = ircomm_tty_connect_indication;
242         strlcpy(notify.name, "ircomm_tty", sizeof(notify.name));
243         notify.instance = self;
244
245         if (!self->ircomm) {
246                 self->ircomm = ircomm_open(&notify, self->service_type,
247                                            self->line);
248         }
249         if (!self->ircomm)
250                 goto err;
251
252         self->slsap_sel = self->ircomm->slsap_sel;
253
254         /* Connect IrCOMM link with remote device */
255         ret = ircomm_tty_attach_cable(self);
256         if (ret < 0) {
257                 IRDA_ERROR("%s(), error attaching cable!\n", __func__);
258                 goto err;
259         }
260
261         return 0;
262 err:
263         clear_bit(ASYNCB_INITIALIZED, &self->port.flags);
264         return ret;
265 }
266
267 /*
268  * Function ircomm_block_til_ready (self, filp)
269  *
270  *
271  *
272  */
273 static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self,
274                 struct tty_struct *tty, struct file *filp)
275 {
276         struct tty_port *port = &self->port;
277         DECLARE_WAITQUEUE(wait, current);
278         int             retval;
279         int             do_clocal = 0, extra_count = 0;
280         unsigned long   flags;
281
282         IRDA_DEBUG(2, "%s()\n", __func__ );
283
284         /*
285          * If non-blocking mode is set, or the port is not enabled,
286          * then make the check up front and then exit.
287          */
288         if (filp->f_flags & O_NONBLOCK || tty->flags & (1 << TTY_IO_ERROR)){
289                 /* nonblock mode is set or port is not enabled */
290                 port->flags |= ASYNC_NORMAL_ACTIVE;
291                 IRDA_DEBUG(1, "%s(), O_NONBLOCK requested!\n", __func__ );
292                 return 0;
293         }
294
295         if (tty->termios->c_cflag & CLOCAL) {
296                 IRDA_DEBUG(1, "%s(), doing CLOCAL!\n", __func__ );
297                 do_clocal = 1;
298         }
299
300         /* Wait for carrier detect and the line to become
301          * free (i.e., not in use by the callout).  While we are in
302          * this loop, port->count is dropped by one, so that
303          * mgsl_close() knows when to free things.  We restore it upon
304          * exit, either normal or abnormal.
305          */
306
307         retval = 0;
308         add_wait_queue(&port->open_wait, &wait);
309
310         IRDA_DEBUG(2, "%s(%d):block_til_ready before block on %s open_count=%d\n",
311               __FILE__, __LINE__, tty->driver->name, port->count);
312
313         spin_lock_irqsave(&port->lock, flags);
314         if (!tty_hung_up_p(filp)) {
315                 extra_count = 1;
316                 port->count--;
317         }
318         spin_unlock_irqrestore(&port->lock, flags);
319         port->blocked_open++;
320
321         while (1) {
322                 if (tty->termios->c_cflag & CBAUD)
323                         tty_port_raise_dtr_rts(port);
324
325                 current->state = TASK_INTERRUPTIBLE;
326
327                 if (tty_hung_up_p(filp) ||
328                     !test_bit(ASYNCB_INITIALIZED, &port->flags)) {
329                         retval = (port->flags & ASYNC_HUP_NOTIFY) ?
330                                         -EAGAIN : -ERESTARTSYS;
331                         break;
332                 }
333
334                 /*
335                  * Check if link is ready now. Even if CLOCAL is
336                  * specified, we cannot return before the IrCOMM link is
337                  * ready
338                  */
339                 if (!test_bit(ASYNCB_CLOSING, &port->flags) &&
340                     (do_clocal || tty_port_carrier_raised(port)) &&
341                     self->state == IRCOMM_TTY_READY)
342                 {
343                         break;
344                 }
345
346                 if (signal_pending(current)) {
347                         retval = -ERESTARTSYS;
348                         break;
349                 }
350
351                 IRDA_DEBUG(1, "%s(%d):block_til_ready blocking on %s open_count=%d\n",
352                       __FILE__, __LINE__, tty->driver->name, port->count);
353
354                 schedule();
355         }
356
357         __set_current_state(TASK_RUNNING);
358         remove_wait_queue(&port->open_wait, &wait);
359
360         if (extra_count) {
361                 /* ++ is not atomic, so this should be protected - Jean II */
362                 spin_lock_irqsave(&port->lock, flags);
363                 port->count++;
364                 spin_unlock_irqrestore(&port->lock, flags);
365         }
366         port->blocked_open--;
367
368         IRDA_DEBUG(1, "%s(%d):block_til_ready after blocking on %s open_count=%d\n",
369               __FILE__, __LINE__, tty->driver->name, port->count);
370
371         if (!retval)
372                 port->flags |= ASYNC_NORMAL_ACTIVE;
373
374         return retval;
375 }
376
377 /*
378  * Function ircomm_tty_open (tty, filp)
379  *
380  *    This routine is called when a particular tty device is opened. This
381  *    routine is mandatory; if this routine is not filled in, the attempted
382  *    open will fail with ENODEV.
383  */
384 static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
385 {
386         struct ircomm_tty_cb *self;
387         unsigned int line = tty->index;
388         unsigned long   flags;
389         int ret;
390
391         IRDA_DEBUG(2, "%s()\n", __func__ );
392
393         /* Check if instance already exists */
394         self = hashbin_lock_find(ircomm_tty, line, NULL);
395         if (!self) {
396                 /* No, so make new instance */
397                 self = kzalloc(sizeof(struct ircomm_tty_cb), GFP_KERNEL);
398                 if (self == NULL) {
399                         IRDA_ERROR("%s(), kmalloc failed!\n", __func__);
400                         return -ENOMEM;
401                 }
402
403                 tty_port_init(&self->port);
404                 self->port.ops = &ircomm_port_ops;
405                 self->magic = IRCOMM_TTY_MAGIC;
406                 self->flow = FLOW_STOP;
407
408                 self->line = line;
409                 INIT_WORK(&self->tqueue, ircomm_tty_do_softint);
410                 self->max_header_size = IRCOMM_TTY_HDR_UNINITIALISED;
411                 self->max_data_size = IRCOMM_TTY_DATA_UNINITIALISED;
412
413                 /* Init some important stuff */
414                 init_timer(&self->watchdog_timer);
415                 spin_lock_init(&self->spinlock);
416
417                 /*
418                  * Force TTY into raw mode by default which is usually what
419                  * we want for IrCOMM and IrLPT. This way applications will
420                  * not have to twiddle with printcap etc.
421                  *
422                  * Note this is completely usafe and doesn't work properly
423                  */
424                 tty->termios->c_iflag = 0;
425                 tty->termios->c_oflag = 0;
426
427                 /* Insert into hash */
428                 /* FIXME there is a window from find to here */
429                 hashbin_insert(ircomm_tty, (irda_queue_t *) self, line, NULL);
430         }
431         /* ++ is not atomic, so this should be protected - Jean II */
432         spin_lock_irqsave(&self->port.lock, flags);
433         self->port.count++;
434
435         tty->driver_data = self;
436         spin_unlock_irqrestore(&self->port.lock, flags);
437         tty_port_tty_set(&self->port, tty);
438
439         IRDA_DEBUG(1, "%s(), %s%d, count = %d\n", __func__ , tty->driver->name,
440                    self->line, self->port.count);
441
442         /* Not really used by us, but lets do it anyway */
443         tty->low_latency = (self->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
444
445         /*
446          * If the port is the middle of closing, bail out now
447          */
448         if (tty_hung_up_p(filp) ||
449             test_bit(ASYNCB_CLOSING, &self->port.flags)) {
450
451                 /* Hm, why are we blocking on ASYNC_CLOSING if we
452                  * do return -EAGAIN/-ERESTARTSYS below anyway?
453                  * IMHO it's either not needed in the first place
454                  * or for some reason we need to make sure the async
455                  * closing has been finished - if so, wouldn't we
456                  * probably better sleep uninterruptible?
457                  */
458
459                 if (wait_event_interruptible(self->port.close_wait,
460                                 !test_bit(ASYNCB_CLOSING, &self->port.flags))) {
461                         IRDA_WARNING("%s - got signal while blocking on ASYNC_CLOSING!\n",
462                                      __func__);
463                         return -ERESTARTSYS;
464                 }
465
466 #ifdef SERIAL_DO_RESTART
467                 return (self->port.flags & ASYNC_HUP_NOTIFY) ?
468                         -EAGAIN : -ERESTARTSYS;
469 #else
470                 return -EAGAIN;
471 #endif
472         }
473
474         /* Check if this is a "normal" ircomm device, or an irlpt device */
475         if (line < 0x10) {
476                 self->service_type = IRCOMM_3_WIRE | IRCOMM_9_WIRE;
477                 self->settings.service_type = IRCOMM_9_WIRE; /* 9 wire as default */
478                 /* Jan Kiszka -> add DSR/RI -> Conform to IrCOMM spec */
479                 self->settings.dce = IRCOMM_CTS | IRCOMM_CD | IRCOMM_DSR | IRCOMM_RI; /* Default line settings */
480                 IRDA_DEBUG(2, "%s(), IrCOMM device\n", __func__ );
481         } else {
482                 IRDA_DEBUG(2, "%s(), IrLPT device\n", __func__ );
483                 self->service_type = IRCOMM_3_WIRE_RAW;
484                 self->settings.service_type = IRCOMM_3_WIRE_RAW; /* Default */
485         }
486
487         ret = ircomm_tty_startup(self);
488         if (ret)
489                 return ret;
490
491         ret = ircomm_tty_block_til_ready(self, tty, filp);
492         if (ret) {
493                 IRDA_DEBUG(2,
494                       "%s(), returning after block_til_ready with %d\n", __func__ ,
495                       ret);
496
497                 return ret;
498         }
499         return 0;
500 }
501
502 /*
503  * Function ircomm_tty_close (tty, filp)
504  *
505  *    This routine is called when a particular tty device is closed.
506  *
507  */
508 static void ircomm_tty_close(struct tty_struct *tty, struct file *filp)
509 {
510         struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
511         struct tty_port *port = &self->port;
512
513         IRDA_DEBUG(0, "%s()\n", __func__ );
514
515         IRDA_ASSERT(self != NULL, return;);
516         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
517
518         if (tty_port_close_start(port, tty, filp) == 0)
519                 return;
520
521         ircomm_tty_shutdown(self);
522
523         tty_driver_flush_buffer(tty);
524
525         tty_port_close_end(port, tty);
526         tty_port_tty_set(port, NULL);
527 }
528
529 /*
530  * Function ircomm_tty_flush_buffer (tty)
531  *
532  *
533  *
534  */
535 static void ircomm_tty_flush_buffer(struct tty_struct *tty)
536 {
537         struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
538
539         IRDA_ASSERT(self != NULL, return;);
540         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
541
542         /*
543          * Let do_softint() do this to avoid race condition with
544          * do_softint() ;-)
545          */
546         schedule_work(&self->tqueue);
547 }
548
549 /*
550  * Function ircomm_tty_do_softint (work)
551  *
552  *    We use this routine to give the write wakeup to the user at at a
553  *    safe time (as fast as possible after write have completed). This
554  *    can be compared to the Tx interrupt.
555  */
556 static void ircomm_tty_do_softint(struct work_struct *work)
557 {
558         struct ircomm_tty_cb *self =
559                 container_of(work, struct ircomm_tty_cb, tqueue);
560         struct tty_struct *tty;
561         unsigned long flags;
562         struct sk_buff *skb, *ctrl_skb;
563
564         IRDA_DEBUG(2, "%s()\n", __func__ );
565
566         if (!self || self->magic != IRCOMM_TTY_MAGIC)
567                 return;
568
569         tty = tty_port_tty_get(&self->port);
570         if (!tty)
571                 return;
572
573         /* Unlink control buffer */
574         spin_lock_irqsave(&self->spinlock, flags);
575
576         ctrl_skb = self->ctrl_skb;
577         self->ctrl_skb = NULL;
578
579         spin_unlock_irqrestore(&self->spinlock, flags);
580
581         /* Flush control buffer if any */
582         if(ctrl_skb) {
583                 if(self->flow == FLOW_START)
584                         ircomm_control_request(self->ircomm, ctrl_skb);
585                 /* Drop reference count - see ircomm_ttp_data_request(). */
586                 dev_kfree_skb(ctrl_skb);
587         }
588
589         if (tty->hw_stopped)
590                 goto put;
591
592         /* Unlink transmit buffer */
593         spin_lock_irqsave(&self->spinlock, flags);
594
595         skb = self->tx_skb;
596         self->tx_skb = NULL;
597
598         spin_unlock_irqrestore(&self->spinlock, flags);
599
600         /* Flush transmit buffer if any */
601         if (skb) {
602                 ircomm_tty_do_event(self, IRCOMM_TTY_DATA_REQUEST, skb, NULL);
603                 /* Drop reference count - see ircomm_ttp_data_request(). */
604                 dev_kfree_skb(skb);
605         }
606
607         /* Check if user (still) wants to be waken up */
608         tty_wakeup(tty);
609 put:
610         tty_kref_put(tty);
611 }
612
613 /*
614  * Function ircomm_tty_write (tty, buf, count)
615  *
616  *    This routine is called by the kernel to write a series of characters
617  *    to the tty device. The characters may come from user space or kernel
618  *    space. This routine will return the number of characters actually
619  *    accepted for writing. This routine is mandatory.
620  */
621 static int ircomm_tty_write(struct tty_struct *tty,
622                             const unsigned char *buf, int count)
623 {
624         struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
625         unsigned long flags;
626         struct sk_buff *skb;
627         int tailroom = 0;
628         int len = 0;
629         int size;
630
631         IRDA_DEBUG(2, "%s(), count=%d, hw_stopped=%d\n", __func__ , count,
632                    tty->hw_stopped);
633
634         IRDA_ASSERT(self != NULL, return -1;);
635         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
636
637         /* We may receive packets from the TTY even before we have finished
638          * our setup. Not cool.
639          * The problem is that we don't know the final header and data size
640          * to create the proper skb, so any skb we would create would have
641          * bogus header and data size, so need care.
642          * We use a bogus header size to safely detect this condition.
643          * Another problem is that hw_stopped was set to 0 way before it
644          * should be, so we would drop this skb. It should now be fixed.
645          * One option is to not accept data until we are properly setup.
646          * But, I suspect that when it happens, the ppp line discipline
647          * just "drops" the data, which might screw up connect scripts.
648          * The second option is to create a "safe skb", with large header
649          * and small size (see ircomm_tty_open() for values).
650          * We just need to make sure that when the real values get filled,
651          * we don't mess up the original "safe skb" (see tx_data_size).
652          * Jean II */
653         if (self->max_header_size == IRCOMM_TTY_HDR_UNINITIALISED) {
654                 IRDA_DEBUG(1, "%s() : not initialised\n", __func__);
655 #ifdef IRCOMM_NO_TX_BEFORE_INIT
656                 /* We didn't consume anything, TTY will retry */
657                 return 0;
658 #endif
659         }
660
661         if (count < 1)
662                 return 0;
663
664         /* Protect our manipulation of self->tx_skb and related */
665         spin_lock_irqsave(&self->spinlock, flags);
666
667         /* Fetch current transmit buffer */
668         skb = self->tx_skb;
669
670         /*
671          * Send out all the data we get, possibly as multiple fragmented
672          * frames, but this will only happen if the data is larger than the
673          * max data size. The normal case however is just the opposite, and
674          * this function may be called multiple times, and will then actually
675          * defragment the data and send it out as one packet as soon as
676          * possible, but at a safer point in time
677          */
678         while (count) {
679                 size = count;
680
681                 /* Adjust data size to the max data size */
682                 if (size > self->max_data_size)
683                         size = self->max_data_size;
684
685                 /*
686                  * Do we already have a buffer ready for transmit, or do
687                  * we need to allocate a new frame
688                  */
689                 if (skb) {
690                         /*
691                          * Any room for more data at the end of the current
692                          * transmit buffer? Cannot use skb_tailroom, since
693                          * dev_alloc_skb gives us a larger skb than we
694                          * requested
695                          * Note : use tx_data_size, because max_data_size
696                          * may have changed and we don't want to overwrite
697                          * the skb. - Jean II
698                          */
699                         if ((tailroom = (self->tx_data_size - skb->len)) > 0) {
700                                 /* Adjust data to tailroom */
701                                 if (size > tailroom)
702                                         size = tailroom;
703                         } else {
704                                 /*
705                                  * Current transmit frame is full, so break
706                                  * out, so we can send it as soon as possible
707                                  */
708                                 break;
709                         }
710                 } else {
711                         /* Prepare a full sized frame */
712                         skb = alloc_skb(self->max_data_size+
713                                         self->max_header_size,
714                                         GFP_ATOMIC);
715                         if (!skb) {
716                                 spin_unlock_irqrestore(&self->spinlock, flags);
717                                 return -ENOBUFS;
718                         }
719                         skb_reserve(skb, self->max_header_size);
720                         self->tx_skb = skb;
721                         /* Remember skb size because max_data_size may
722                          * change later on - Jean II */
723                         self->tx_data_size = self->max_data_size;
724                 }
725
726                 /* Copy data */
727                 memcpy(skb_put(skb,size), buf + len, size);
728
729                 count -= size;
730                 len += size;
731         }
732
733         spin_unlock_irqrestore(&self->spinlock, flags);
734
735         /*
736          * Schedule a new thread which will transmit the frame as soon
737          * as possible, but at a safe point in time. We do this so the
738          * "user" can give us data multiple times, as PPP does (because of
739          * its 256 byte tx buffer). We will then defragment and send out
740          * all this data as one single packet.
741          */
742         schedule_work(&self->tqueue);
743
744         return len;
745 }
746
747 /*
748  * Function ircomm_tty_write_room (tty)
749  *
750  *    This routine returns the numbers of characters the tty driver will
751  *    accept for queuing to be written. This number is subject to change as
752  *    output buffers get emptied, or if the output flow control is acted.
753  */
754 static int ircomm_tty_write_room(struct tty_struct *tty)
755 {
756         struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
757         unsigned long flags;
758         int ret;
759
760         IRDA_ASSERT(self != NULL, return -1;);
761         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
762
763 #ifdef IRCOMM_NO_TX_BEFORE_INIT
764         /* max_header_size tells us if the channel is initialised or not. */
765         if (self->max_header_size == IRCOMM_TTY_HDR_UNINITIALISED)
766                 /* Don't bother us yet */
767                 return 0;
768 #endif
769
770         /* Check if we are allowed to transmit any data.
771          * hw_stopped is the regular flow control.
772          * Jean II */
773         if (tty->hw_stopped)
774                 ret = 0;
775         else {
776                 spin_lock_irqsave(&self->spinlock, flags);
777                 if (self->tx_skb)
778                         ret = self->tx_data_size - self->tx_skb->len;
779                 else
780                         ret = self->max_data_size;
781                 spin_unlock_irqrestore(&self->spinlock, flags);
782         }
783         IRDA_DEBUG(2, "%s(), ret=%d\n", __func__ , ret);
784
785         return ret;
786 }
787
788 /*
789  * Function ircomm_tty_wait_until_sent (tty, timeout)
790  *
791  *    This routine waits until the device has written out all of the
792  *    characters in its transmitter FIFO.
793  */
794 static void ircomm_tty_wait_until_sent(struct tty_struct *tty, int timeout)
795 {
796         struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
797         unsigned long orig_jiffies, poll_time;
798         unsigned long flags;
799
800         IRDA_DEBUG(2, "%s()\n", __func__ );
801
802         IRDA_ASSERT(self != NULL, return;);
803         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
804
805         orig_jiffies = jiffies;
806
807         /* Set poll time to 200 ms */
808         poll_time = IRDA_MIN(timeout, msecs_to_jiffies(200));
809
810         spin_lock_irqsave(&self->spinlock, flags);
811         while (self->tx_skb && self->tx_skb->len) {
812                 spin_unlock_irqrestore(&self->spinlock, flags);
813                 schedule_timeout_interruptible(poll_time);
814                 spin_lock_irqsave(&self->spinlock, flags);
815                 if (signal_pending(current))
816                         break;
817                 if (timeout && time_after(jiffies, orig_jiffies + timeout))
818                         break;
819         }
820         spin_unlock_irqrestore(&self->spinlock, flags);
821         current->state = TASK_RUNNING;
822 }
823
824 /*
825  * Function ircomm_tty_throttle (tty)
826  *
827  *    This routine notifies the tty driver that input buffers for the line
828  *    discipline are close to full, and it should somehow signal that no
829  *    more characters should be sent to the tty.
830  */
831 static void ircomm_tty_throttle(struct tty_struct *tty)
832 {
833         struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
834
835         IRDA_DEBUG(2, "%s()\n", __func__ );
836
837         IRDA_ASSERT(self != NULL, return;);
838         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
839
840         /* Software flow control? */
841         if (I_IXOFF(tty))
842                 ircomm_tty_send_xchar(tty, STOP_CHAR(tty));
843
844         /* Hardware flow control? */
845         if (tty->termios->c_cflag & CRTSCTS) {
846                 self->settings.dte &= ~IRCOMM_RTS;
847                 self->settings.dte |= IRCOMM_DELTA_RTS;
848
849                 ircomm_param_request(self, IRCOMM_DTE, TRUE);
850         }
851
852         ircomm_flow_request(self->ircomm, FLOW_STOP);
853 }
854
855 /*
856  * Function ircomm_tty_unthrottle (tty)
857  *
858  *    This routine notifies the tty drivers that it should signals that
859  *    characters can now be sent to the tty without fear of overrunning the
860  *    input buffers of the line disciplines.
861  */
862 static void ircomm_tty_unthrottle(struct tty_struct *tty)
863 {
864         struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
865
866         IRDA_DEBUG(2, "%s()\n", __func__ );
867
868         IRDA_ASSERT(self != NULL, return;);
869         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
870
871         /* Using software flow control? */
872         if (I_IXOFF(tty)) {
873                 ircomm_tty_send_xchar(tty, START_CHAR(tty));
874         }
875
876         /* Using hardware flow control? */
877         if (tty->termios->c_cflag & CRTSCTS) {
878                 self->settings.dte |= (IRCOMM_RTS|IRCOMM_DELTA_RTS);
879
880                 ircomm_param_request(self, IRCOMM_DTE, TRUE);
881                 IRDA_DEBUG(1, "%s(), FLOW_START\n", __func__ );
882         }
883         ircomm_flow_request(self->ircomm, FLOW_START);
884 }
885
886 /*
887  * Function ircomm_tty_chars_in_buffer (tty)
888  *
889  *    Indicates if there are any data in the buffer
890  *
891  */
892 static int ircomm_tty_chars_in_buffer(struct tty_struct *tty)
893 {
894         struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
895         unsigned long flags;
896         int len = 0;
897
898         IRDA_ASSERT(self != NULL, return -1;);
899         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
900
901         spin_lock_irqsave(&self->spinlock, flags);
902
903         if (self->tx_skb)
904                 len = self->tx_skb->len;
905
906         spin_unlock_irqrestore(&self->spinlock, flags);
907
908         return len;
909 }
910
911 static void ircomm_tty_shutdown(struct ircomm_tty_cb *self)
912 {
913         unsigned long flags;
914
915         IRDA_ASSERT(self != NULL, return;);
916         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
917
918         IRDA_DEBUG(0, "%s()\n", __func__ );
919
920         if (!test_and_clear_bit(ASYNCB_INITIALIZED, &self->port.flags))
921                 return;
922
923         ircomm_tty_detach_cable(self);
924
925         spin_lock_irqsave(&self->spinlock, flags);
926
927         del_timer(&self->watchdog_timer);
928
929         /* Free parameter buffer */
930         if (self->ctrl_skb) {
931                 dev_kfree_skb(self->ctrl_skb);
932                 self->ctrl_skb = NULL;
933         }
934
935         /* Free transmit buffer */
936         if (self->tx_skb) {
937                 dev_kfree_skb(self->tx_skb);
938                 self->tx_skb = NULL;
939         }
940
941         if (self->ircomm) {
942                 ircomm_close(self->ircomm);
943                 self->ircomm = NULL;
944         }
945
946         spin_unlock_irqrestore(&self->spinlock, flags);
947 }
948
949 /*
950  * Function ircomm_tty_hangup (tty)
951  *
952  *    This routine notifies the tty driver that it should hangup the tty
953  *    device.
954  *
955  */
956 static void ircomm_tty_hangup(struct tty_struct *tty)
957 {
958         struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
959         struct tty_port *port = &self->port;
960         unsigned long   flags;
961
962         IRDA_DEBUG(0, "%s()\n", __func__ );
963
964         IRDA_ASSERT(self != NULL, return;);
965         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
966
967         /* ircomm_tty_flush_buffer(tty); */
968         ircomm_tty_shutdown(self);
969
970         spin_lock_irqsave(&port->lock, flags);
971         port->flags &= ~ASYNC_NORMAL_ACTIVE;
972         if (port->tty) {
973                 set_bit(TTY_IO_ERROR, &port->tty->flags);
974                 tty_kref_put(port->tty);
975         }
976         port->tty = NULL;
977         port->count = 0;
978         spin_unlock_irqrestore(&port->lock, flags);
979
980         wake_up_interruptible(&port->open_wait);
981 }
982
983 /*
984  * Function ircomm_tty_send_xchar (tty, ch)
985  *
986  *    This routine is used to send a high-priority XON/XOFF character to
987  *    the device.
988  */
989 static void ircomm_tty_send_xchar(struct tty_struct *tty, char ch)
990 {
991         IRDA_DEBUG(0, "%s(), not impl\n", __func__ );
992 }
993
994 /*
995  * Function ircomm_tty_start (tty)
996  *
997  *    This routine notifies the tty driver that it resume sending
998  *    characters to the tty device.
999  */
1000 void ircomm_tty_start(struct tty_struct *tty)
1001 {
1002         struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
1003
1004         ircomm_flow_request(self->ircomm, FLOW_START);
1005 }
1006
1007 /*
1008  * Function ircomm_tty_stop (tty)
1009  *
1010  *     This routine notifies the tty driver that it should stop outputting
1011  *     characters to the tty device.
1012  */
1013 static void ircomm_tty_stop(struct tty_struct *tty)
1014 {
1015         struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
1016
1017         IRDA_ASSERT(self != NULL, return;);
1018         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
1019
1020         ircomm_flow_request(self->ircomm, FLOW_STOP);
1021 }
1022
1023 /*
1024  * Function ircomm_check_modem_status (self)
1025  *
1026  *    Check for any changes in the DCE's line settings. This function should
1027  *    be called whenever the dce parameter settings changes, to update the
1028  *    flow control settings and other things
1029  */
1030 void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
1031 {
1032         struct tty_struct *tty;
1033         int status;
1034
1035         IRDA_DEBUG(0, "%s()\n", __func__ );
1036
1037         IRDA_ASSERT(self != NULL, return;);
1038         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
1039
1040         tty = tty_port_tty_get(&self->port);
1041
1042         status = self->settings.dce;
1043
1044         if (status & IRCOMM_DCE_DELTA_ANY) {
1045                 /*wake_up_interruptible(&self->delta_msr_wait);*/
1046         }
1047         if ((self->port.flags & ASYNC_CHECK_CD) && (status & IRCOMM_DELTA_CD)) {
1048                 IRDA_DEBUG(2,
1049                            "%s(), ircomm%d CD now %s...\n", __func__ , self->line,
1050                            (status & IRCOMM_CD) ? "on" : "off");
1051
1052                 if (status & IRCOMM_CD) {
1053                         wake_up_interruptible(&self->port.open_wait);
1054                 } else {
1055                         IRDA_DEBUG(2,
1056                                    "%s(), Doing serial hangup..\n", __func__ );
1057                         if (tty)
1058                                 tty_hangup(tty);
1059
1060                         /* Hangup will remote the tty, so better break out */
1061                         goto put;
1062                 }
1063         }
1064         if (tty && self->port.flags & ASYNC_CTS_FLOW) {
1065                 if (tty->hw_stopped) {
1066                         if (status & IRCOMM_CTS) {
1067                                 IRDA_DEBUG(2,
1068                                            "%s(), CTS tx start...\n", __func__ );
1069                                 tty->hw_stopped = 0;
1070
1071                                 /* Wake up processes blocked on open */
1072                                 wake_up_interruptible(&self->port.open_wait);
1073
1074                                 schedule_work(&self->tqueue);
1075                                 goto put;
1076                         }
1077                 } else {
1078                         if (!(status & IRCOMM_CTS)) {
1079                                 IRDA_DEBUG(2,
1080                                            "%s(), CTS tx stop...\n", __func__ );
1081                                 tty->hw_stopped = 1;
1082                         }
1083                 }
1084         }
1085 put:
1086         tty_kref_put(tty);
1087 }
1088
1089 /*
1090  * Function ircomm_tty_data_indication (instance, sap, skb)
1091  *
1092  *    Handle incoming data, and deliver it to the line discipline
1093  *
1094  */
1095 static int ircomm_tty_data_indication(void *instance, void *sap,
1096                                       struct sk_buff *skb)
1097 {
1098         struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
1099         struct tty_struct *tty;
1100
1101         IRDA_DEBUG(2, "%s()\n", __func__ );
1102
1103         IRDA_ASSERT(self != NULL, return -1;);
1104         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
1105         IRDA_ASSERT(skb != NULL, return -1;);
1106
1107         tty = tty_port_tty_get(&self->port);
1108         if (!tty) {
1109                 IRDA_DEBUG(0, "%s(), no tty!\n", __func__ );
1110                 return 0;
1111         }
1112
1113         /*
1114          * If we receive data when hardware is stopped then something is wrong.
1115          * We try to poll the peers line settings to check if we are up todate.
1116          * Devices like WinCE can do this, and since they don't send any
1117          * params, we can just as well declare the hardware for running.
1118          */
1119         if (tty->hw_stopped && (self->flow == FLOW_START)) {
1120                 IRDA_DEBUG(0, "%s(), polling for line settings!\n", __func__ );
1121                 ircomm_param_request(self, IRCOMM_POLL, TRUE);
1122
1123                 /* We can just as well declare the hardware for running */
1124                 ircomm_tty_send_initial_parameters(self);
1125                 ircomm_tty_link_established(self);
1126         }
1127
1128         /*
1129          * Use flip buffer functions since the code may be called from interrupt
1130          * context
1131          */
1132         tty_insert_flip_string(tty, skb->data, skb->len);
1133         tty_flip_buffer_push(tty);
1134         tty_kref_put(tty);
1135
1136         /* No need to kfree_skb - see ircomm_ttp_data_indication() */
1137
1138         return 0;
1139 }
1140
1141 /*
1142  * Function ircomm_tty_control_indication (instance, sap, skb)
1143  *
1144  *    Parse all incoming parameters (easy!)
1145  *
1146  */
1147 static int ircomm_tty_control_indication(void *instance, void *sap,
1148                                          struct sk_buff *skb)
1149 {
1150         struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
1151         int clen;
1152
1153         IRDA_DEBUG(4, "%s()\n", __func__ );
1154
1155         IRDA_ASSERT(self != NULL, return -1;);
1156         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
1157         IRDA_ASSERT(skb != NULL, return -1;);
1158
1159         clen = skb->data[0];
1160
1161         irda_param_extract_all(self, skb->data+1, IRDA_MIN(skb->len-1, clen),
1162                                &ircomm_param_info);
1163
1164         /* No need to kfree_skb - see ircomm_control_indication() */
1165
1166         return 0;
1167 }
1168
1169 /*
1170  * Function ircomm_tty_flow_indication (instance, sap, cmd)
1171  *
1172  *    This function is called by IrTTP when it wants us to slow down the
1173  *    transmission of data. We just mark the hardware as stopped, and wait
1174  *    for IrTTP to notify us that things are OK again.
1175  */
1176 static void ircomm_tty_flow_indication(void *instance, void *sap,
1177                                        LOCAL_FLOW cmd)
1178 {
1179         struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
1180         struct tty_struct *tty;
1181
1182         IRDA_ASSERT(self != NULL, return;);
1183         IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
1184
1185         tty = tty_port_tty_get(&self->port);
1186
1187         switch (cmd) {
1188         case FLOW_START:
1189                 IRDA_DEBUG(2, "%s(), hw start!\n", __func__ );
1190                 if (tty)
1191                         tty->hw_stopped = 0;
1192
1193                 /* ircomm_tty_do_softint will take care of the rest */
1194                 schedule_work(&self->tqueue);
1195                 break;
1196         default:  /* If we get here, something is very wrong, better stop */
1197         case FLOW_STOP:
1198                 IRDA_DEBUG(2, "%s(), hw stopped!\n", __func__ );
1199                 if (tty)
1200                         tty->hw_stopped = 1;
1201                 break;
1202         }
1203
1204         tty_kref_put(tty);
1205         self->flow = cmd;
1206 }
1207
1208 #ifdef CONFIG_PROC_FS
1209 static void ircomm_tty_line_info(struct ircomm_tty_cb *self, struct seq_file *m)
1210 {
1211         struct tty_struct *tty;
1212         char sep;
1213
1214         seq_printf(m, "State: %s\n", ircomm_tty_state[self->state]);
1215
1216         seq_puts(m, "Service type: ");
1217         if (self->service_type & IRCOMM_9_WIRE)
1218                 seq_puts(m, "9_WIRE");
1219         else if (self->service_type & IRCOMM_3_WIRE)
1220                 seq_puts(m, "3_WIRE");
1221         else if (self->service_type & IRCOMM_3_WIRE_RAW)
1222                 seq_puts(m, "3_WIRE_RAW");
1223         else
1224                 seq_puts(m, "No common service type!\n");
1225         seq_putc(m, '\n');
1226
1227         seq_printf(m, "Port name: %s\n", self->settings.port_name);
1228
1229         seq_printf(m, "DTE status:");
1230         sep = ' ';
1231         if (self->settings.dte & IRCOMM_RTS) {
1232                 seq_printf(m, "%cRTS", sep);
1233                 sep = '|';
1234         }
1235         if (self->settings.dte & IRCOMM_DTR) {
1236                 seq_printf(m, "%cDTR", sep);
1237                 sep = '|';
1238         }
1239         seq_putc(m, '\n');
1240
1241         seq_puts(m, "DCE status:");
1242         sep = ' ';
1243         if (self->settings.dce & IRCOMM_CTS) {
1244                 seq_printf(m, "%cCTS", sep);
1245                 sep = '|';
1246         }
1247         if (self->settings.dce & IRCOMM_DSR) {
1248                 seq_printf(m, "%cDSR", sep);
1249                 sep = '|';
1250         }
1251         if (self->settings.dce & IRCOMM_CD) {
1252                 seq_printf(m, "%cCD", sep);
1253                 sep = '|';
1254         }
1255         if (self->settings.dce & IRCOMM_RI) {
1256                 seq_printf(m, "%cRI", sep);
1257                 sep = '|';
1258         }
1259         seq_putc(m, '\n');
1260
1261         seq_puts(m, "Configuration: ");
1262         if (!self->settings.null_modem)
1263                 seq_puts(m, "DTE <-> DCE\n");
1264         else
1265                 seq_puts(m, "DTE <-> DTE (null modem emulation)\n");
1266
1267         seq_printf(m, "Data rate: %d\n", self->settings.data_rate);
1268
1269         seq_puts(m, "Flow control:");
1270         sep = ' ';
1271         if (self->settings.flow_control & IRCOMM_XON_XOFF_IN) {
1272                 seq_printf(m, "%cXON_XOFF_IN", sep);
1273                 sep = '|';
1274         }
1275         if (self->settings.flow_control & IRCOMM_XON_XOFF_OUT) {
1276                 seq_printf(m, "%cXON_XOFF_OUT", sep);
1277                 sep = '|';
1278         }
1279         if (self->settings.flow_control & IRCOMM_RTS_CTS_IN) {
1280                 seq_printf(m, "%cRTS_CTS_IN", sep);
1281                 sep = '|';
1282         }
1283         if (self->settings.flow_control & IRCOMM_RTS_CTS_OUT) {
1284                 seq_printf(m, "%cRTS_CTS_OUT", sep);
1285                 sep = '|';
1286         }
1287         if (self->settings.flow_control & IRCOMM_DSR_DTR_IN) {
1288                 seq_printf(m, "%cDSR_DTR_IN", sep);
1289                 sep = '|';
1290         }
1291         if (self->settings.flow_control & IRCOMM_DSR_DTR_OUT) {
1292                 seq_printf(m, "%cDSR_DTR_OUT", sep);
1293                 sep = '|';
1294         }
1295         if (self->settings.flow_control & IRCOMM_ENQ_ACK_IN) {
1296                 seq_printf(m, "%cENQ_ACK_IN", sep);
1297                 sep = '|';
1298         }
1299         if (self->settings.flow_control & IRCOMM_ENQ_ACK_OUT) {
1300                 seq_printf(m, "%cENQ_ACK_OUT", sep);
1301                 sep = '|';
1302         }
1303         seq_putc(m, '\n');
1304
1305         seq_puts(m, "Flags:");
1306         sep = ' ';
1307         if (self->port.flags & ASYNC_CTS_FLOW) {
1308                 seq_printf(m, "%cASYNC_CTS_FLOW", sep);
1309                 sep = '|';
1310         }
1311         if (self->port.flags & ASYNC_CHECK_CD) {
1312                 seq_printf(m, "%cASYNC_CHECK_CD", sep);
1313                 sep = '|';
1314         }
1315         if (self->port.flags & ASYNC_INITIALIZED) {
1316                 seq_printf(m, "%cASYNC_INITIALIZED", sep);
1317                 sep = '|';
1318         }
1319         if (self->port.flags & ASYNC_LOW_LATENCY) {
1320                 seq_printf(m, "%cASYNC_LOW_LATENCY", sep);
1321                 sep = '|';
1322         }
1323         if (self->port.flags & ASYNC_CLOSING) {
1324                 seq_printf(m, "%cASYNC_CLOSING", sep);
1325                 sep = '|';
1326         }
1327         if (self->port.flags & ASYNC_NORMAL_ACTIVE) {
1328                 seq_printf(m, "%cASYNC_NORMAL_ACTIVE", sep);
1329                 sep = '|';
1330         }
1331         seq_putc(m, '\n');
1332
1333         seq_printf(m, "Role: %s\n", self->client ? "client" : "server");
1334         seq_printf(m, "Open count: %d\n", self->port.count);
1335         seq_printf(m, "Max data size: %d\n", self->max_data_size);
1336         seq_printf(m, "Max header size: %d\n", self->max_header_size);
1337
1338         tty = tty_port_tty_get(&self->port);
1339         if (tty) {
1340                 seq_printf(m, "Hardware: %s\n",
1341                                tty->hw_stopped ? "Stopped" : "Running");
1342                 tty_kref_put(tty);
1343         }
1344 }
1345
1346 static int ircomm_tty_proc_show(struct seq_file *m, void *v)
1347 {
1348         struct ircomm_tty_cb *self;
1349         unsigned long flags;
1350
1351         spin_lock_irqsave(&ircomm_tty->hb_spinlock, flags);
1352
1353         self = (struct ircomm_tty_cb *) hashbin_get_first(ircomm_tty);
1354         while (self != NULL) {
1355                 if (self->magic != IRCOMM_TTY_MAGIC)
1356                         break;
1357
1358                 ircomm_tty_line_info(self, m);
1359                 self = (struct ircomm_tty_cb *) hashbin_get_next(ircomm_tty);
1360         }
1361         spin_unlock_irqrestore(&ircomm_tty->hb_spinlock, flags);
1362         return 0;
1363 }
1364
1365 static int ircomm_tty_proc_open(struct inode *inode, struct file *file)
1366 {
1367         return single_open(file, ircomm_tty_proc_show, NULL);
1368 }
1369
1370 static const struct file_operations ircomm_tty_proc_fops = {
1371         .owner          = THIS_MODULE,
1372         .open           = ircomm_tty_proc_open,
1373         .read           = seq_read,
1374         .llseek         = seq_lseek,
1375         .release        = single_release,
1376 };
1377 #endif /* CONFIG_PROC_FS */
1378
1379 MODULE_AUTHOR("Dag Brattli <dagb@cs.uit.no>");
1380 MODULE_DESCRIPTION("IrCOMM serial TTY driver");
1381 MODULE_LICENSE("GPL");
1382 MODULE_ALIAS_CHARDEV_MAJOR(IRCOMM_TTY_MAJOR);
1383
1384 module_init(ircomm_tty_init);
1385 module_exit(ircomm_tty_cleanup);