OSDN Git Service

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