Linux Audio

Check our new training course

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