Linux Audio

Check our new training course

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