Messages in this thread | | | Subject | Re: [PATCH] Airprime driver improvements to allow full speed EvDO transfers | From | Alan Cox <> | Date | Mon, 10 Jul 2006 12:10:55 +0100 |
| |
Ar Llu, 2006-07-10 am 14:36 +0400, ysgrifennodd Sergei Organov: > However, the problem is easily seen for USB-to-tty drivers where there > are no UARTS anywhere and speeds are rather high so that more than 4096 > bytes (the line discipline buffer size) could be received before a task > has a chance to read from the line discipline buffer, and single flip > size is not limited by the hardware.
There are no flip buffers in 2.6.17, they've gone. The tty buffering is now a proper queuing system.
> Moreover, looking into the source code I don't see how tty can take care > not to over-stuff the ldisc. ldisc`s receive_buf() routine doesn't tell > the caller how many chars it actually consumed and silently throws away
Not in the current kernel tree. The current tree does this:
spin_lock_irqsave(&tty->buf.lock, flags); head = tty->buf.head; if (head != NULL) { tty->buf.head = NULL; for (;;) { int count = head->commit - head->read; if (!count) { if (head->next == NULL) break; tbuf = head; head = head->next; tty_buffer_free(tty, tbuf); continue; } if (!tty->receive_room) { schedule_delayed_work(&tty->buf.work, 1); break; } if (count > tty->receive_room) count = tty->receive_room; char_buf = head->char_buf_ptr + head->read; flag_buf = head->flag_buf_ptr + head->read; head->read += count; spin_unlock_irqrestore(&tty->buf.lock, flags); disc->receive_buf(tty, char_buf, flag_buf, count); spin_lock_irqsave(&tty->buf.lock, flags); } tty->buf.head = head; } spin_unlock_irqrestore(&tty->buf.lock, flags);
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |