linux/drivers/tty/tty_port.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Tty port functions
   4 */
   5
   6#include <linux/types.h>
   7#include <linux/errno.h>
   8#include <linux/tty.h>
   9#include <linux/tty_driver.h>
  10#include <linux/tty_flip.h>
  11#include <linux/serial.h>
  12#include <linux/timer.h>
  13#include <linux/string.h>
  14#include <linux/slab.h>
  15#include <linux/sched/signal.h>
  16#include <linux/wait.h>
  17#include <linux/bitops.h>
  18#include <linux/delay.h>
  19#include <linux/module.h>
  20#include <linux/serdev.h>
  21
  22static int tty_port_default_receive_buf(struct tty_port *port,
  23                                        const unsigned char *p,
  24                                        const unsigned char *f, size_t count)
  25{
  26        int ret;
  27        struct tty_struct *tty;
  28        struct tty_ldisc *disc;
  29
  30        tty = READ_ONCE(port->itty);
  31        if (!tty)
  32                return 0;
  33
  34        disc = tty_ldisc_ref(tty);
  35        if (!disc)
  36                return 0;
  37
  38        ret = tty_ldisc_receive_buf(disc, p, (char *)f, count);
  39
  40        tty_ldisc_deref(disc);
  41
  42        return ret;
  43}
  44
  45static void tty_port_default_wakeup(struct tty_port *port)
  46{
  47        struct tty_struct *tty = tty_port_tty_get(port);
  48
  49        if (tty) {
  50                tty_wakeup(tty);
  51                tty_kref_put(tty);
  52        }
  53}
  54
  55static const struct tty_port_client_operations default_client_ops = {
  56        .receive_buf = tty_port_default_receive_buf,
  57        .write_wakeup = tty_port_default_wakeup,
  58};
  59
  60void tty_port_init(struct tty_port *port)
  61{
  62        memset(port, 0, sizeof(*port));
  63        tty_buffer_init(port);
  64        init_waitqueue_head(&port->open_wait);
  65        init_waitqueue_head(&port->delta_msr_wait);
  66        mutex_init(&port->mutex);
  67        mutex_init(&port->buf_mutex);
  68        spin_lock_init(&port->lock);
  69        port->close_delay = (50 * HZ) / 100;
  70        port->closing_wait = (3000 * HZ) / 100;
  71        port->client_ops = &default_client_ops;
  72        kref_init(&port->kref);
  73}
  74EXPORT_SYMBOL(tty_port_init);
  75
  76/**
  77 * tty_port_link_device - link tty and tty_port
  78 * @port: tty_port of the device
  79 * @driver: tty_driver for this device
  80 * @index: index of the tty
  81 *
  82 * Provide the tty layer with a link from a tty (specified by @index) to a
  83 * tty_port (@port). Use this only if neither tty_port_register_device nor
  84 * tty_port_install is used in the driver. If used, this has to be called before
  85 * tty_register_driver.
  86 */
  87void tty_port_link_device(struct tty_port *port,
  88                struct tty_driver *driver, unsigned index)
  89{
  90        if (WARN_ON(index >= driver->num))
  91                return;
  92        driver->ports[index] = port;
  93}
  94EXPORT_SYMBOL_GPL(tty_port_link_device);
  95
  96/**
  97 * tty_port_register_device - register tty device
  98 * @port: tty_port of the device
  99 * @driver: tty_driver for this device
 100 * @index: index of the tty
 101 * @device: parent if exists, otherwise NULL
 102 *
 103 * It is the same as tty_register_device except the provided @port is linked to
 104 * a concrete tty specified by @index. Use this or tty_port_install (or both).
 105 * Call tty_port_link_device as a last resort.
 106 */
 107struct device *tty_port_register_device(struct tty_port *port,
 108                struct tty_driver *driver, unsigned index,
 109                struct device *device)
 110{
 111        return tty_port_register_device_attr(port, driver, index, device, NULL, NULL);
 112}
 113EXPORT_SYMBOL_GPL(tty_port_register_device);
 114
 115/**
 116 * tty_port_register_device_attr - register tty device
 117 * @port: tty_port of the device
 118 * @driver: tty_driver for this device
 119 * @index: index of the tty
 120 * @device: parent if exists, otherwise NULL
 121 * @drvdata: Driver data to be set to device.
 122 * @attr_grp: Attribute group to be set on device.
 123 *
 124 * It is the same as tty_register_device_attr except the provided @port is
 125 * linked to a concrete tty specified by @index. Use this or tty_port_install
 126 * (or both). Call tty_port_link_device as a last resort.
 127 */
 128struct device *tty_port_register_device_attr(struct tty_port *port,
 129                struct tty_driver *driver, unsigned index,
 130                struct device *device, void *drvdata,
 131                const struct attribute_group **attr_grp)
 132{
 133        tty_port_link_device(port, driver, index);
 134        return tty_register_device_attr(driver, index, device, drvdata,
 135                        attr_grp);
 136}
 137EXPORT_SYMBOL_GPL(tty_port_register_device_attr);
 138
 139/**
 140 * tty_port_register_device_attr_serdev - register tty or serdev device
 141 * @port: tty_port of the device
 142 * @driver: tty_driver for this device
 143 * @index: index of the tty
 144 * @device: parent if exists, otherwise NULL
 145 * @drvdata: driver data for the device
 146 * @attr_grp: attribute group for the device
 147 *
 148 * Register a serdev or tty device depending on if the parent device has any
 149 * defined serdev clients or not.
 150 */
 151struct device *tty_port_register_device_attr_serdev(struct tty_port *port,
 152                struct tty_driver *driver, unsigned index,
 153                struct device *device, void *drvdata,
 154                const struct attribute_group **attr_grp)
 155{
 156        struct device *dev;
 157
 158        tty_port_link_device(port, driver, index);
 159
 160        dev = serdev_tty_port_register(port, device, driver, index);
 161        if (PTR_ERR(dev) != -ENODEV) {
 162                /* Skip creating cdev if we registered a serdev device */
 163                return dev;
 164        }
 165
 166        return tty_register_device_attr(driver, index, device, drvdata,
 167                        attr_grp);
 168}
 169EXPORT_SYMBOL_GPL(tty_port_register_device_attr_serdev);
 170
 171/**
 172 * tty_port_register_device_serdev - register tty or serdev device
 173 * @port: tty_port of the device
 174 * @driver: tty_driver for this device
 175 * @index: index of the tty
 176 * @device: parent if exists, otherwise NULL
 177 *
 178 * Register a serdev or tty device depending on if the parent device has any
 179 * defined serdev clients or not.
 180 */
 181struct device *tty_port_register_device_serdev(struct tty_port *port,
 182                struct tty_driver *driver, unsigned index,
 183                struct device *device)
 184{
 185        return tty_port_register_device_attr_serdev(port, driver, index,
 186                        device, NULL, NULL);
 187}
 188EXPORT_SYMBOL_GPL(tty_port_register_device_serdev);
 189
 190/**
 191 * tty_port_unregister_device - deregister a tty or serdev device
 192 * @port: tty_port of the device
 193 * @driver: tty_driver for this device
 194 * @index: index of the tty
 195 *
 196 * If a tty or serdev device is registered with a call to
 197 * tty_port_register_device_serdev() then this function must be called when
 198 * the device is gone.
 199 */
 200void tty_port_unregister_device(struct tty_port *port,
 201                struct tty_driver *driver, unsigned index)
 202{
 203        int ret;
 204
 205        ret = serdev_tty_port_unregister(port);
 206        if (ret == 0)
 207                return;
 208
 209        tty_unregister_device(driver, index);
 210}
 211EXPORT_SYMBOL_GPL(tty_port_unregister_device);
 212
 213int tty_port_alloc_xmit_buf(struct tty_port *port)
 214{
 215        /* We may sleep in get_zeroed_page() */
 216        mutex_lock(&port->buf_mutex);
 217        if (port->xmit_buf == NULL)
 218                port->xmit_buf = (unsigned char *)get_zeroed_page(GFP_KERNEL);
 219        mutex_unlock(&port->buf_mutex);
 220        if (port->xmit_buf == NULL)
 221                return -ENOMEM;
 222        return 0;
 223}
 224EXPORT_SYMBOL(tty_port_alloc_xmit_buf);
 225
 226void tty_port_free_xmit_buf(struct tty_port *port)
 227{
 228        mutex_lock(&port->buf_mutex);
 229        if (port->xmit_buf != NULL) {
 230                free_page((unsigned long)port->xmit_buf);
 231                port->xmit_buf = NULL;
 232        }
 233        mutex_unlock(&port->buf_mutex);
 234}
 235EXPORT_SYMBOL(tty_port_free_xmit_buf);
 236
 237/**
 238 * tty_port_destroy -- destroy inited port
 239 * @port: tty port to be destroyed
 240 *
 241 * When a port was initialized using tty_port_init, one has to destroy the
 242 * port by this function. Either indirectly by using tty_port refcounting
 243 * (tty_port_put) or directly if refcounting is not used.
 244 */
 245void tty_port_destroy(struct tty_port *port)
 246{
 247        tty_buffer_cancel_work(port);
 248        tty_buffer_free_all(port);
 249}
 250EXPORT_SYMBOL(tty_port_destroy);
 251
 252static void tty_port_destructor(struct kref *kref)
 253{
 254        struct tty_port *port = container_of(kref, struct tty_port, kref);
 255
 256        /* check if last port ref was dropped before tty release */
 257        if (WARN_ON(port->itty))
 258                return;
 259        if (port->xmit_buf)
 260                free_page((unsigned long)port->xmit_buf);
 261        tty_port_destroy(port);
 262        if (port->ops && port->ops->destruct)
 263                port->ops->destruct(port);
 264        else
 265                kfree(port);
 266}
 267
 268void tty_port_put(struct tty_port *port)
 269{
 270        if (port)
 271                kref_put(&port->kref, tty_port_destructor);
 272}
 273EXPORT_SYMBOL(tty_port_put);
 274
 275/**
 276 *      tty_port_tty_get        -       get a tty reference
 277 *      @port: tty port
 278 *
 279 *      Return a refcount protected tty instance or NULL if the port is not
 280 *      associated with a tty (eg due to close or hangup)
 281 */
 282
 283struct tty_struct *tty_port_tty_get(struct tty_port *port)
 284{
 285        unsigned long flags;
 286        struct tty_struct *tty;
 287
 288        spin_lock_irqsave(&port->lock, flags);
 289        tty = tty_kref_get(port->tty);
 290        spin_unlock_irqrestore(&port->lock, flags);
 291        return tty;
 292}
 293EXPORT_SYMBOL(tty_port_tty_get);
 294
 295/**
 296 *      tty_port_tty_set        -       set the tty of a port
 297 *      @port: tty port
 298 *      @tty: the tty
 299 *
 300 *      Associate the port and tty pair. Manages any internal refcounts.
 301 *      Pass NULL to deassociate a port
 302 */
 303
 304void tty_port_tty_set(struct tty_port *port, struct tty_struct *tty)
 305{
 306        unsigned long flags;
 307
 308        spin_lock_irqsave(&port->lock, flags);
 309        tty_kref_put(port->tty);
 310        port->tty = tty_kref_get(tty);
 311        spin_unlock_irqrestore(&port->lock, flags);
 312}
 313EXPORT_SYMBOL(tty_port_tty_set);
 314
 315static void tty_port_shutdown(struct tty_port *port, struct tty_struct *tty)
 316{
 317        mutex_lock(&port->mutex);
 318        if (port->console)
 319                goto out;
 320
 321        if (tty_port_initialized(port)) {
 322                tty_port_set_initialized(port, 0);
 323                /*
 324                 * Drop DTR/RTS if HUPCL is set. This causes any attached
 325                 * modem to hang up the line.
 326                 */
 327                if (tty && C_HUPCL(tty))
 328                        tty_port_lower_dtr_rts(port);
 329
 330                if (port->ops->shutdown)
 331                        port->ops->shutdown(port);
 332        }
 333out:
 334        mutex_unlock(&port->mutex);
 335}
 336
 337/**
 338 *      tty_port_hangup         -       hangup helper
 339 *      @port: tty port
 340 *
 341 *      Perform port level tty hangup flag and count changes. Drop the tty
 342 *      reference.
 343 *
 344 *      Caller holds tty lock.
 345 */
 346
 347void tty_port_hangup(struct tty_port *port)
 348{
 349        struct tty_struct *tty;
 350        unsigned long flags;
 351
 352        spin_lock_irqsave(&port->lock, flags);
 353        port->count = 0;
 354        tty = port->tty;
 355        if (tty)
 356                set_bit(TTY_IO_ERROR, &tty->flags);
 357        port->tty = NULL;
 358        spin_unlock_irqrestore(&port->lock, flags);
 359        tty_port_set_active(port, 0);
 360        tty_port_shutdown(port, tty);
 361        tty_kref_put(tty);
 362        wake_up_interruptible(&port->open_wait);
 363        wake_up_interruptible(&port->delta_msr_wait);
 364}
 365EXPORT_SYMBOL(tty_port_hangup);
 366
 367/**
 368 * tty_port_tty_hangup - helper to hang up a tty
 369 *
 370 * @port: tty port
 371 * @check_clocal: hang only ttys with CLOCAL unset?
 372 */
 373void tty_port_tty_hangup(struct tty_port *port, bool check_clocal)
 374{
 375        struct tty_struct *tty = tty_port_tty_get(port);
 376
 377        if (tty && (!check_clocal || !C_CLOCAL(tty)))
 378                tty_hangup(tty);
 379        tty_kref_put(tty);
 380}
 381EXPORT_SYMBOL_GPL(tty_port_tty_hangup);
 382
 383/**
 384 * tty_port_tty_wakeup - helper to wake up a tty
 385 *
 386 * @port: tty port
 387 */
 388void tty_port_tty_wakeup(struct tty_port *port)
 389{
 390        port->client_ops->write_wakeup(port);
 391}
 392EXPORT_SYMBOL_GPL(tty_port_tty_wakeup);
 393
 394/**
 395 *      tty_port_carrier_raised -       carrier raised check
 396 *      @port: tty port
 397 *
 398 *      Wrapper for the carrier detect logic. For the moment this is used
 399 *      to hide some internal details. This will eventually become entirely
 400 *      internal to the tty port.
 401 */
 402
 403int tty_port_carrier_raised(struct tty_port *port)
 404{
 405        if (port->ops->carrier_raised == NULL)
 406                return 1;
 407        return port->ops->carrier_raised(port);
 408}
 409EXPORT_SYMBOL(tty_port_carrier_raised);
 410
 411/**
 412 *      tty_port_raise_dtr_rts  -       Raise DTR/RTS
 413 *      @port: tty port
 414 *
 415 *      Wrapper for the DTR/RTS raise logic. For the moment this is used
 416 *      to hide some internal details. This will eventually become entirely
 417 *      internal to the tty port.
 418 */
 419
 420void tty_port_raise_dtr_rts(struct tty_port *port)
 421{
 422        if (port->ops->dtr_rts)
 423                port->ops->dtr_rts(port, 1);
 424}
 425EXPORT_SYMBOL(tty_port_raise_dtr_rts);
 426
 427/**
 428 *      tty_port_lower_dtr_rts  -       Lower DTR/RTS
 429 *      @port: tty port
 430 *
 431 *      Wrapper for the DTR/RTS raise logic. For the moment this is used
 432 *      to hide some internal details. This will eventually become entirely
 433 *      internal to the tty port.
 434 */
 435
 436void tty_port_lower_dtr_rts(struct tty_port *port)
 437{
 438        if (port->ops->dtr_rts)
 439                port->ops->dtr_rts(port, 0);
 440}
 441EXPORT_SYMBOL(tty_port_lower_dtr_rts);
 442
 443/**
 444 *      tty_port_block_til_ready        -       Waiting logic for tty open
 445 *      @port: the tty port being opened
 446 *      @tty: the tty device being bound
 447 *      @filp: the file pointer of the opener or NULL
 448 *
 449 *      Implement the core POSIX/SuS tty behaviour when opening a tty device.
 450 *      Handles:
 451 *              - hangup (both before and during)
 452 *              - non blocking open
 453 *              - rts/dtr/dcd
 454 *              - signals
 455 *              - port flags and counts
 456 *
 457 *      The passed tty_port must implement the carrier_raised method if it can
 458 *      do carrier detect and the dtr_rts method if it supports software
 459 *      management of these lines. Note that the dtr/rts raise is done each
 460 *      iteration as a hangup may have previously dropped them while we wait.
 461 *
 462 *      Caller holds tty lock.
 463 *
 464 *      NB: May drop and reacquire tty lock when blocking, so tty and tty_port
 465 *      may have changed state (eg., may have been hung up).
 466 */
 467
 468int tty_port_block_til_ready(struct tty_port *port,
 469                                struct tty_struct *tty, struct file *filp)
 470{
 471        int do_clocal = 0, retval;
 472        unsigned long flags;
 473        DEFINE_WAIT(wait);
 474
 475        /* if non-blocking mode is set we can pass directly to open unless
 476           the port has just hung up or is in another error state */
 477        if (tty_io_error(tty)) {
 478                tty_port_set_active(port, 1);
 479                return 0;
 480        }
 481        if (filp == NULL || (filp->f_flags & O_NONBLOCK)) {
 482                /* Indicate we are open */
 483                if (C_BAUD(tty))
 484                        tty_port_raise_dtr_rts(port);
 485                tty_port_set_active(port, 1);
 486                return 0;
 487        }
 488
 489        if (C_CLOCAL(tty))
 490                do_clocal = 1;
 491
 492        /* Block waiting until we can proceed. We may need to wait for the
 493           carrier, but we must also wait for any close that is in progress
 494           before the next open may complete */
 495
 496        retval = 0;
 497
 498        /* The port lock protects the port counts */
 499        spin_lock_irqsave(&port->lock, flags);
 500        port->count--;
 501        port->blocked_open++;
 502        spin_unlock_irqrestore(&port->lock, flags);
 503
 504        while (1) {
 505                /* Indicate we are open */
 506                if (C_BAUD(tty) && tty_port_initialized(port))
 507                        tty_port_raise_dtr_rts(port);
 508
 509                prepare_to_wait(&port->open_wait, &wait, TASK_INTERRUPTIBLE);
 510                /* Check for a hangup or uninitialised port.
 511                                                        Return accordingly */
 512                if (tty_hung_up_p(filp) || !tty_port_initialized(port)) {
 513                        if (port->flags & ASYNC_HUP_NOTIFY)
 514                                retval = -EAGAIN;
 515                        else
 516                                retval = -ERESTARTSYS;
 517                        break;
 518                }
 519                /*
 520                 * Probe the carrier. For devices with no carrier detect
 521                 * tty_port_carrier_raised will always return true.
 522                 * Never ask drivers if CLOCAL is set, this causes troubles
 523                 * on some hardware.
 524                 */
 525                if (do_clocal || tty_port_carrier_raised(port))
 526                        break;
 527                if (signal_pending(current)) {
 528                        retval = -ERESTARTSYS;
 529                        break;
 530                }
 531                tty_unlock(tty);
 532                schedule();
 533                tty_lock(tty);
 534        }
 535        finish_wait(&port->open_wait, &wait);
 536
 537        /* Update counts. A parallel hangup will have set count to zero and
 538           we must not mess that up further */
 539        spin_lock_irqsave(&port->lock, flags);
 540        if (!tty_hung_up_p(filp))
 541                port->count++;
 542        port->blocked_open--;
 543        spin_unlock_irqrestore(&port->lock, flags);
 544        if (retval == 0)
 545                tty_port_set_active(port, 1);
 546        return retval;
 547}
 548EXPORT_SYMBOL(tty_port_block_til_ready);
 549
 550static void tty_port_drain_delay(struct tty_port *port, struct tty_struct *tty)
 551{
 552        unsigned int bps = tty_get_baud_rate(tty);
 553        long timeout;
 554
 555        if (bps > 1200) {
 556                timeout = (HZ * 10 * port->drain_delay) / bps;
 557                timeout = max_t(long, timeout, HZ / 10);
 558        } else {
 559                timeout = 2 * HZ;
 560        }
 561        schedule_timeout_interruptible(timeout);
 562}
 563
 564/* Caller holds tty lock. */
 565int tty_port_close_start(struct tty_port *port,
 566                                struct tty_struct *tty, struct file *filp)
 567{
 568        unsigned long flags;
 569
 570        if (tty_hung_up_p(filp))
 571                return 0;
 572
 573        spin_lock_irqsave(&port->lock, flags);
 574        if (tty->count == 1 && port->count != 1) {
 575                tty_warn(tty, "%s: tty->count = 1 port count = %d\n", __func__,
 576                         port->count);
 577                port->count = 1;
 578        }
 579        if (--port->count < 0) {
 580                tty_warn(tty, "%s: bad port count (%d)\n", __func__,
 581                         port->count);
 582                port->count = 0;
 583        }
 584
 585        if (port->count) {
 586                spin_unlock_irqrestore(&port->lock, flags);
 587                return 0;
 588        }
 589        spin_unlock_irqrestore(&port->lock, flags);
 590
 591        tty->closing = 1;
 592
 593        if (tty_port_initialized(port)) {
 594                /* Don't block on a stalled port, just pull the chain */
 595                if (tty->flow_stopped)
 596                        tty_driver_flush_buffer(tty);
 597                if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE)
 598                        tty_wait_until_sent(tty, port->closing_wait);
 599                if (port->drain_delay)
 600                        tty_port_drain_delay(port, tty);
 601        }
 602        /* Flush the ldisc buffering */
 603        tty_ldisc_flush(tty);
 604
 605        /* Report to caller this is the last port reference */
 606        return 1;
 607}
 608EXPORT_SYMBOL(tty_port_close_start);
 609
 610/* Caller holds tty lock */
 611void tty_port_close_end(struct tty_port *port, struct tty_struct *tty)
 612{
 613        unsigned long flags;
 614
 615        tty_ldisc_flush(tty);
 616        tty->closing = 0;
 617
 618        spin_lock_irqsave(&port->lock, flags);
 619
 620        if (port->blocked_open) {
 621                spin_unlock_irqrestore(&port->lock, flags);
 622                if (port->close_delay)
 623                        msleep_interruptible(jiffies_to_msecs(port->close_delay));
 624                spin_lock_irqsave(&port->lock, flags);
 625                wake_up_interruptible(&port->open_wait);
 626        }
 627        spin_unlock_irqrestore(&port->lock, flags);
 628        tty_port_set_active(port, 0);
 629}
 630EXPORT_SYMBOL(tty_port_close_end);
 631
 632/**
 633 * tty_port_close
 634 *
 635 * Caller holds tty lock
 636 */
 637void tty_port_close(struct tty_port *port, struct tty_struct *tty,
 638                                                        struct file *filp)
 639{
 640        if (tty_port_close_start(port, tty, filp) == 0)
 641                return;
 642        tty_port_shutdown(port, tty);
 643        set_bit(TTY_IO_ERROR, &tty->flags);
 644        tty_port_close_end(port, tty);
 645        tty_port_tty_set(port, NULL);
 646}
 647EXPORT_SYMBOL(tty_port_close);
 648
 649/**
 650 * tty_port_install - generic tty->ops->install handler
 651 * @port: tty_port of the device
 652 * @driver: tty_driver for this device
 653 * @tty: tty to be installed
 654 *
 655 * It is the same as tty_standard_install except the provided @port is linked
 656 * to a concrete tty specified by @tty. Use this or tty_port_register_device
 657 * (or both). Call tty_port_link_device as a last resort.
 658 */
 659int tty_port_install(struct tty_port *port, struct tty_driver *driver,
 660                struct tty_struct *tty)
 661{
 662        tty->port = port;
 663        return tty_standard_install(driver, tty);
 664}
 665EXPORT_SYMBOL_GPL(tty_port_install);
 666
 667/**
 668 * tty_port_open
 669 *
 670 * Caller holds tty lock.
 671 *
 672 * NB: may drop and reacquire tty lock (in tty_port_block_til_ready()) so
 673 * tty and tty_port may have changed state (eg., may be hung up now)
 674 */
 675int tty_port_open(struct tty_port *port, struct tty_struct *tty,
 676                                                        struct file *filp)
 677{
 678        spin_lock_irq(&port->lock);
 679        ++port->count;
 680        spin_unlock_irq(&port->lock);
 681        tty_port_tty_set(port, tty);
 682
 683        /*
 684         * Do the device-specific open only if the hardware isn't
 685         * already initialized. Serialize open and shutdown using the
 686         * port mutex.
 687         */
 688
 689        mutex_lock(&port->mutex);
 690
 691        if (!tty_port_initialized(port)) {
 692                clear_bit(TTY_IO_ERROR, &tty->flags);
 693                if (port->ops->activate) {
 694                        int retval = port->ops->activate(port, tty);
 695                        if (retval) {
 696                                mutex_unlock(&port->mutex);
 697                                return retval;
 698                        }
 699                }
 700                tty_port_set_initialized(port, 1);
 701        }
 702        mutex_unlock(&port->mutex);
 703        return tty_port_block_til_ready(port, tty, filp);
 704}
 705
 706EXPORT_SYMBOL(tty_port_open);
 707