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