diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2013-04-03 06:27:29 -0400 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2013-04-03 06:27:29 -0400 |
| commit | 0ed2aef9b3bffe598045b62a31a50d912eee92d8 (patch) | |
| tree | d7dda12955c838f531727d2775d09c4e04bdf066 /net/irda/ircomm/ircomm_tty.c | |
| parent | cfea7d7e452f57682a0bb55a55e9f79c569558c2 (diff) | |
| parent | 8011657b9e63cb2e914b9a0f75233b910c1854cb (diff) | |
Merge branch 'fortglx/3.10/time' of git://git.linaro.org/people/jstultz/linux into timers/core
Diffstat (limited to 'net/irda/ircomm/ircomm_tty.c')
| -rw-r--r-- | net/irda/ircomm/ircomm_tty.c | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/net/irda/ircomm/ircomm_tty.c b/net/irda/ircomm/ircomm_tty.c index 9a5fd3c3e530..362ba47968e4 100644 --- a/net/irda/ircomm/ircomm_tty.c +++ b/net/irda/ircomm/ircomm_tty.c | |||
| @@ -280,7 +280,7 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self, | |||
| 280 | struct tty_port *port = &self->port; | 280 | struct tty_port *port = &self->port; |
| 281 | DECLARE_WAITQUEUE(wait, current); | 281 | DECLARE_WAITQUEUE(wait, current); |
| 282 | int retval; | 282 | int retval; |
| 283 | int do_clocal = 0, extra_count = 0; | 283 | int do_clocal = 0; |
| 284 | unsigned long flags; | 284 | unsigned long flags; |
| 285 | 285 | ||
| 286 | IRDA_DEBUG(2, "%s()\n", __func__ ); | 286 | IRDA_DEBUG(2, "%s()\n", __func__ ); |
| @@ -289,8 +289,15 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self, | |||
| 289 | * If non-blocking mode is set, or the port is not enabled, | 289 | * If non-blocking mode is set, or the port is not enabled, |
| 290 | * then make the check up front and then exit. | 290 | * then make the check up front and then exit. |
| 291 | */ | 291 | */ |
| 292 | if (filp->f_flags & O_NONBLOCK || tty->flags & (1 << TTY_IO_ERROR)){ | 292 | if (test_bit(TTY_IO_ERROR, &tty->flags)) { |
| 293 | /* nonblock mode is set or port is not enabled */ | 293 | port->flags |= ASYNC_NORMAL_ACTIVE; |
| 294 | return 0; | ||
| 295 | } | ||
| 296 | |||
| 297 | if (filp->f_flags & O_NONBLOCK) { | ||
| 298 | /* nonblock mode is set */ | ||
| 299 | if (tty->termios.c_cflag & CBAUD) | ||
| 300 | tty_port_raise_dtr_rts(port); | ||
| 294 | port->flags |= ASYNC_NORMAL_ACTIVE; | 301 | port->flags |= ASYNC_NORMAL_ACTIVE; |
| 295 | IRDA_DEBUG(1, "%s(), O_NONBLOCK requested!\n", __func__ ); | 302 | IRDA_DEBUG(1, "%s(), O_NONBLOCK requested!\n", __func__ ); |
| 296 | return 0; | 303 | return 0; |
| @@ -315,18 +322,16 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self, | |||
| 315 | __FILE__, __LINE__, tty->driver->name, port->count); | 322 | __FILE__, __LINE__, tty->driver->name, port->count); |
| 316 | 323 | ||
| 317 | spin_lock_irqsave(&port->lock, flags); | 324 | spin_lock_irqsave(&port->lock, flags); |
| 318 | if (!tty_hung_up_p(filp)) { | 325 | if (!tty_hung_up_p(filp)) |
| 319 | extra_count = 1; | ||
| 320 | port->count--; | 326 | port->count--; |
| 321 | } | ||
| 322 | spin_unlock_irqrestore(&port->lock, flags); | ||
| 323 | port->blocked_open++; | 327 | port->blocked_open++; |
| 328 | spin_unlock_irqrestore(&port->lock, flags); | ||
| 324 | 329 | ||
| 325 | while (1) { | 330 | while (1) { |
| 326 | if (tty->termios.c_cflag & CBAUD) | 331 | if (tty->termios.c_cflag & CBAUD) |
| 327 | tty_port_raise_dtr_rts(port); | 332 | tty_port_raise_dtr_rts(port); |
| 328 | 333 | ||
| 329 | current->state = TASK_INTERRUPTIBLE; | 334 | set_current_state(TASK_INTERRUPTIBLE); |
| 330 | 335 | ||
| 331 | if (tty_hung_up_p(filp) || | 336 | if (tty_hung_up_p(filp) || |
| 332 | !test_bit(ASYNCB_INITIALIZED, &port->flags)) { | 337 | !test_bit(ASYNCB_INITIALIZED, &port->flags)) { |
| @@ -361,13 +366,11 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self, | |||
| 361 | __set_current_state(TASK_RUNNING); | 366 | __set_current_state(TASK_RUNNING); |
| 362 | remove_wait_queue(&port->open_wait, &wait); | 367 | remove_wait_queue(&port->open_wait, &wait); |
| 363 | 368 | ||
| 364 | if (extra_count) { | 369 | spin_lock_irqsave(&port->lock, flags); |
| 365 | /* ++ is not atomic, so this should be protected - Jean II */ | 370 | if (!tty_hung_up_p(filp)) |
| 366 | spin_lock_irqsave(&port->lock, flags); | ||
| 367 | port->count++; | 371 | port->count++; |
| 368 | spin_unlock_irqrestore(&port->lock, flags); | ||
| 369 | } | ||
| 370 | port->blocked_open--; | 372 | port->blocked_open--; |
| 373 | spin_unlock_irqrestore(&port->lock, flags); | ||
| 371 | 374 | ||
| 372 | IRDA_DEBUG(1, "%s(%d):block_til_ready after blocking on %s open_count=%d\n", | 375 | IRDA_DEBUG(1, "%s(%d):block_til_ready after blocking on %s open_count=%d\n", |
| 373 | __FILE__, __LINE__, tty->driver->name, port->count); | 376 | __FILE__, __LINE__, tty->driver->name, port->count); |
