Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=2090ab05fe4bc6b70e7245a9d3ea37afc49150ad
Commit:     2090ab05fe4bc6b70e7245a9d3ea37afc49150ad
Parent:     e5f717812982c7b2a20d5f2d897f7cce6db9c5e6
Author:     Alan Cox <[EMAIL PROTECTED]>
AuthorDate: Tue Oct 16 01:26:38 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Tue Oct 16 09:43:04 2007 -0700

    tty: bring the old cris driver back somewhere into the realm of new tty 
buffering
    
    Signed-off-by: Alan Cox <[EMAIL PROTECTED]>
    Cc: Mikael Starvik <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 drivers/serial/crisv10.c |   67 ++++++++-------------------------------------
 1 files changed, 12 insertions(+), 55 deletions(-)

diff --git a/drivers/serial/crisv10.c b/drivers/serial/crisv10.c
index 312bef6..7e8724d 100644
--- a/drivers/serial/crisv10.c
+++ b/drivers/serial/crisv10.c
@@ -514,6 +514,8 @@ struct tty_driver *serial_driver;
  * TTY_THRESHOLD_THROTTLE/UNTHROTTLE=128
  * BUF_SIZE can't be > 128
  */
+#define CRIS_BUF_SIZE  512
+
 /* Currently 16 descriptors x 128 bytes = 2048 bytes */
 #define SERIAL_DESCR_BUF_SIZE 256
 
@@ -2497,55 +2499,18 @@ static void flush_to_flip_buffer(struct e100_serial 
*info)
                return;
        }
 
-       length = tty->flip.count;
-       /* Don't flip more than the ldisc has room for.
-        * The return value from ldisc.receive_room(tty) - might not be up to
-        * date, the previous flip of up to TTY_FLIPBUF_SIZE might be on the
-        * processed and not accounted for yet.
-        * Since we use DMA, 1 SERIAL_DESCR_BUF_SIZE could be on the way.
-        * Lets buffer data here and let flow control take care of it.
-        * Since we normally flip large chunks, the ldisc don't react
-        * with throttle until too late if we flip to much.
-        */
-       max_flip_size = tty->ldisc.receive_room(tty);
-       if (max_flip_size < 0)
-               max_flip_size = 0;
-       if (max_flip_size <= (TTY_FLIPBUF_SIZE +         /* Maybe not accounted 
for */
-                             length + info->recv_cnt +  /* We have this queued 
*/
-                             2*SERIAL_DESCR_BUF_SIZE +    /* This could be on 
the way */
-                             TTY_THRESHOLD_THROTTLE)) { /* Some slack */
-               /* check TTY_THROTTLED first so it indicates our state */
-               if (!test_and_set_bit(TTY_THROTTLED, &tty->flags)) {
-                       DFLOW(DEBUG_LOG(info->line,"flush_to_flip throttles 
room %lu\n", max_flip_size));
-                       rs_throttle(tty);
-               }
-#if 0
-               else if (max_flip_size <= (TTY_FLIPBUF_SIZE +         /* Maybe 
not accounted for */
-                                          length + info->recv_cnt +  /* We 
have this queued */
-                                          SERIAL_DESCR_BUF_SIZE +    /* This 
could be on the way */
-                                          TTY_THRESHOLD_THROTTLE)) { /* Some 
slack */
-                       DFLOW(DEBUG_LOG(info->line,"flush_to_flip throttles 
again! %lu\n", max_flip_size));
-                       rs_throttle(tty);
-               }
-#endif
-       }
-
-       if (max_flip_size > TTY_FLIPBUF_SIZE)
-               max_flip_size = TTY_FLIPBUF_SIZE;
-
-       while ((buffer = info->first_recv_buffer) && length < max_flip_size) {
+       while ((buffer = info->first_recv_buffer) != NULL) {
                unsigned int count = buffer->length;
 
-               if (length + count > max_flip_size)
-                       count = max_flip_size - length;
+               count = tty_buffer_request_room(tty, count);
+               if (count == 0) /* Throttle ?? */
+                       break;
 
-               memcpy(tty->flip.char_buf_ptr + length, buffer->buffer, count);
-               memset(tty->flip.flag_buf_ptr + length, TTY_NORMAL, count);
-               tty->flip.flag_buf_ptr[length] = buffer->error;
+               if (count > 1)
+                       tty_insert_flip_strings(tty, buffer->buffer, count - 1);
+               tty_insert_flip_char(tty, buffer->buffer[count-1], 
buffer->error);
 
-               length += count;
                info->recv_cnt -= count;
-               DFLIP(DEBUG_LOG(info->line,"flip: %i\n", length));
 
                if (count == buffer->length) {
                        info->first_recv_buffer = buffer->next;
@@ -2560,14 +2525,6 @@ static void flush_to_flip_buffer(struct e100_serial 
*info)
        if (!info->first_recv_buffer)
                info->last_recv_buffer = NULL;
 
-       tty->flip.count = length;
-       DFLIP(if (tty->ldisc.chars_in_buffer(tty) > 3500) {
-               DEBUG_LOG(info->line, "ldisc %lu\n",
-                         tty->ldisc.chars_in_buffer(tty));
-               DEBUG_LOG(info->line, "flip.count %lu\n",
-                         tty->flip.count);
-             }
-             );
        restore_flags(flags);
 
        DFLIP(
@@ -2722,17 +2679,17 @@ struct e100_serial * 
handle_ser_rx_interrupt_no_dma(struct e100_serial *info)
                printk("!NO TTY!\n");
                return info;
        }
-       if (tty->flip.count >= TTY_FLIPBUF_SIZE - TTY_THRESHOLD_THROTTLE) {
+       if (tty->flip.count >= CRIS_BUF_SIZE - TTY_THRESHOLD_THROTTLE) {
                /* check TTY_THROTTLED first so it indicates our state */
                if (!test_and_set_bit(TTY_THROTTLED, &tty->flags)) {
                        DFLOW(DEBUG_LOG(info->line, "rs_throttle flip.count: 
%i\n", tty->flip.count));
                        rs_throttle(tty);
                }
        }
-       if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
+       if (tty->flip.count >= CRIS_BUF_SIZE) {
                DEBUG_LOG(info->line, "force FLIP! %i\n", tty->flip.count);
                tty->flip.work.func((void *) tty);
-               if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
+               if (tty->flip.count >= CRIS_BUF_SIZE) {
                        DEBUG_LOG(info->line, "FLIP FULL! %i\n", 
tty->flip.count);
                        return info;            /* if TTY_DONT_FLIP is set */
                }
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to