Loading drivers/serial/crisv10.c +12 −55 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading @@ -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( Loading Loading @@ -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 */ } Loading Loading
drivers/serial/crisv10.c +12 −55 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading @@ -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( Loading Loading @@ -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 */ } Loading