|
@@ -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 */
|
|
|
}
|