Lines Matching refs:ldata

132 static inline size_t read_cnt(struct n_tty_data *ldata)
134 return ldata->read_head - ldata->read_tail;
137 static inline unsigned char read_buf(struct n_tty_data *ldata, size_t i)
139 return ldata->read_buf[i & (N_TTY_BUF_SIZE - 1)];
142 static inline unsigned char *read_buf_addr(struct n_tty_data *ldata, size_t i)
144 return &ldata->read_buf[i & (N_TTY_BUF_SIZE - 1)];
147 static inline unsigned char echo_buf(struct n_tty_data *ldata, size_t i)
150 return ldata->echo_buf[i & (N_TTY_BUF_SIZE - 1)];
153 static inline unsigned char *echo_buf_addr(struct n_tty_data *ldata, size_t i)
155 return &ldata->echo_buf[i & (N_TTY_BUF_SIZE - 1)];
170 struct n_tty_data *ldata = tty->disc_data;
172 void *from = read_buf_addr(ldata, tail);
180 from = ldata->read_buf;
202 struct n_tty_data *ldata = tty->disc_data;
205 if (unlikely(ldata->no_room)) {
206 ldata->no_room = 0;
222 struct n_tty_data *ldata = tty->disc_data;
225 if (!ldata->icanon)
226 n = ldata->commit_head - ldata->read_tail;
228 n = ldata->canon_head - ldata->read_tail;
249 struct n_tty_data *ldata = tty->disc_data;
256 if (ldata->icanon && ldata->canon_head == ldata->read_tail)
262 if (N_TTY_BUF_SIZE - read_cnt(ldata) >= TTY_THRESHOLD_THROTTLE)
305 * @ldata: n_tty data
313 static inline void put_tty_queue(unsigned char c, struct n_tty_data *ldata)
315 *read_buf_addr(ldata, ldata->read_head) = c;
316 ldata->read_head++;
321 * @ldata: line disc data to reset
330 static void reset_buffer_flags(struct n_tty_data *ldata)
332 ldata->read_head = ldata->canon_head = ldata->read_tail = 0;
333 ldata->commit_head = 0;
334 ldata->line_start = 0;
336 ldata->erasing = 0;
337 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
338 ldata->push = 0;
429 struct n_tty_data *ldata = tty->disc_data;
438 ldata->column = 0;
442 ldata->canon_column = ldata->column = 0;
446 ldata->canon_column = ldata->column;
449 if (O_ONOCR(tty) && ldata->column == 0)
454 ldata->canon_column = ldata->column = 0;
457 ldata->canon_column = ldata->column = 0;
460 spaces = 8 - (ldata->column & 7);
464 ldata->column += spaces;
468 ldata->column += spaces;
471 if (ldata->column > 0)
472 ldata->column--;
479 ldata->column++;
504 struct n_tty_data *ldata = tty->disc_data;
507 mutex_lock(&ldata->output_lock);
512 mutex_unlock(&ldata->output_lock);
541 struct n_tty_data *ldata = tty->disc_data;
546 mutex_lock(&ldata->output_lock);
550 mutex_unlock(&ldata->output_lock);
562 ldata->column = 0;
565 ldata->canon_column = ldata->column;
568 if (O_ONOCR(tty) && ldata->column == 0)
572 ldata->canon_column = ldata->column = 0;
577 if (ldata->column > 0)
578 ldata->column--;
585 ldata->column++;
593 mutex_unlock(&ldata->output_lock);
624 struct n_tty_data *ldata = tty->disc_data;
631 tail = ldata->echo_tail;
632 while (MASK(ldata->echo_commit) != MASK(tail)) {
633 c = echo_buf(ldata, tail);
643 if (MASK(ldata->echo_commit) == MASK(tail + 1))
650 op = echo_buf(ldata, tail + 1);
656 if (MASK(ldata->echo_commit) == MASK(tail + 2))
658 num_chars = echo_buf(ldata, tail + 2);
671 num_chars += ldata->canon_column;
681 if (ldata->column > 0)
682 ldata->column--;
688 ldata->canon_column = ldata->column;
693 if (ldata->column > 0)
694 ldata->column--;
705 ldata->column++;
726 ldata->column += 2;
752 while (ldata->echo_commit > tail &&
753 ldata->echo_commit - tail >= ECHO_DISCARD_WATERMARK) {
754 if (echo_buf(ldata, tail) == ECHO_OP_START) {
755 if (echo_buf(ldata, tail + 1) == ECHO_OP_ERASE_TAB)
764 ldata->echo_tail = tail;
770 struct n_tty_data *ldata = tty->disc_data;
774 mutex_lock(&ldata->output_lock);
775 head = ldata->echo_head;
776 ldata->echo_mark = head;
777 old = ldata->echo_commit - ldata->echo_tail;
782 nr = head - ldata->echo_tail;
785 mutex_unlock(&ldata->output_lock);
789 ldata->echo_commit = head;
791 mutex_unlock(&ldata->output_lock);
799 struct n_tty_data *ldata = tty->disc_data;
802 if (ldata->echo_mark == ldata->echo_tail)
805 mutex_lock(&ldata->output_lock);
806 ldata->echo_commit = ldata->echo_mark;
808 mutex_unlock(&ldata->output_lock);
817 struct n_tty_data *ldata = tty->disc_data;
820 ldata->echo_commit == ldata->echo_head)
823 mutex_lock(&ldata->output_lock);
824 ldata->echo_commit = ldata->echo_head;
826 mutex_unlock(&ldata->output_lock);
832 * @ldata: n_tty data
837 static inline void add_echo_byte(unsigned char c, struct n_tty_data *ldata)
839 *echo_buf_addr(ldata, ldata->echo_head) = c;
841 ldata->echo_head++;
846 * @ldata: n_tty data
851 static void echo_move_back_col(struct n_tty_data *ldata)
853 add_echo_byte(ECHO_OP_START, ldata);
854 add_echo_byte(ECHO_OP_MOVE_BACK_COL, ldata);
859 * @ldata: n_tty data
865 static void echo_set_canon_col(struct n_tty_data *ldata)
867 add_echo_byte(ECHO_OP_START, ldata);
868 add_echo_byte(ECHO_OP_SET_CANON_COL, ldata);
875 * @ldata: n_tty data
887 struct n_tty_data *ldata)
889 add_echo_byte(ECHO_OP_START, ldata);
890 add_echo_byte(ECHO_OP_ERASE_TAB, ldata);
899 add_echo_byte(num_chars, ldata);
905 * @ldata: line disc data
913 static void echo_char_raw(unsigned char c, struct n_tty_data *ldata)
916 add_echo_byte(ECHO_OP_START, ldata);
917 add_echo_byte(ECHO_OP_START, ldata);
919 add_echo_byte(c, ldata);
937 struct n_tty_data *ldata = tty->disc_data;
940 add_echo_byte(ECHO_OP_START, ldata);
941 add_echo_byte(ECHO_OP_START, ldata);
944 add_echo_byte(ECHO_OP_START, ldata);
945 add_echo_byte(c, ldata);
951 * @ldata: n_tty data
954 static inline void finish_erasing(struct n_tty_data *ldata)
956 if (ldata->erasing) {
957 echo_char_raw('/', ldata);
958 ldata->erasing = 0;
977 struct n_tty_data *ldata = tty->disc_data;
983 if (ldata->read_head == ldata->canon_head) {
993 ldata->read_head = ldata->canon_head;
997 ldata->read_head = ldata->canon_head;
998 finish_erasing(ldata);
1002 echo_char_raw('\n', ldata);
1009 while (MASK(ldata->read_head) != MASK(ldata->canon_head)) {
1010 head = ldata->read_head;
1015 c = read_buf(ldata, head);
1017 MASK(head) != MASK(ldata->canon_head));
1030 cnt = ldata->read_head - head;
1031 ldata->read_head = head;
1034 if (!ldata->erasing) {
1035 echo_char_raw('\\', ldata);
1036 ldata->erasing = 1;
1042 echo_char_raw(read_buf(ldata, head), ldata);
1043 echo_move_back_col(ldata);
1050 size_t tail = ldata->read_head;
1059 while (MASK(tail) != MASK(ldata->canon_head)) {
1061 c = read_buf(ldata, tail);
1072 echo_erase_tab(num_chars, after_tab, ldata);
1075 echo_char_raw('\b', ldata);
1076 echo_char_raw(' ', ldata);
1077 echo_char_raw('\b', ldata);
1080 echo_char_raw('\b', ldata);
1081 echo_char_raw(' ', ldata);
1082 echo_char_raw('\b', ldata);
1089 if (ldata->read_head == ldata->canon_head && L_ECHO(tty))
1090 finish_erasing(ldata);
1119 struct n_tty_data *ldata = tty->disc_data;
1132 mutex_lock(&ldata->output_lock);
1133 ldata->echo_head = ldata->echo_tail = 0;
1134 ldata->echo_mark = ldata->echo_commit = 0;
1135 mutex_unlock(&ldata->output_lock);
1167 struct n_tty_data *ldata = tty->disc_data;
1176 put_tty_queue('\377', ldata);
1177 put_tty_queue('\0', ldata);
1179 put_tty_queue('\0', ldata);
1197 struct n_tty_data *ldata = tty->disc_data;
1199 ldata->num_overrun++;
1200 if (time_after(jiffies, ldata->overrun_time + HZ) ||
1201 time_after(ldata->overrun_time, jiffies)) {
1202 tty_warn(tty, "%d input overrun(s)\n", ldata->num_overrun);
1203 ldata->overrun_time = jiffies;
1204 ldata->num_overrun = 0;
1221 struct n_tty_data *ldata = tty->disc_data;
1227 put_tty_queue('\377', ldata);
1228 put_tty_queue('\0', ldata);
1229 put_tty_queue(c, ldata);
1231 put_tty_queue('\0', ldata);
1233 put_tty_queue(c, ldata);
1269 struct n_tty_data *ldata = tty->disc_data;
1309 if (ldata->icanon) {
1317 ldata->lnext = 1;
1319 finish_erasing(ldata);
1321 echo_char_raw('^', ldata);
1322 echo_char_raw('\b', ldata);
1329 size_t tail = ldata->canon_head;
1331 finish_erasing(ldata);
1333 echo_char_raw('\n', ldata);
1334 while (MASK(tail) != MASK(ldata->read_head)) {
1335 echo_char(read_buf(ldata, tail), tty);
1343 echo_char_raw('\n', ldata);
1359 if (ldata->canon_head == ldata->read_head)
1360 echo_set_canon_col(ldata);
1369 put_tty_queue(c, ldata);
1372 set_bit(ldata->read_head & (N_TTY_BUF_SIZE - 1), ldata->read_flags);
1373 put_tty_queue(c, ldata);
1374 smp_store_release(&ldata->canon_head, ldata->read_head);
1382 finish_erasing(ldata);
1384 echo_char_raw('\n', ldata);
1387 if (ldata->canon_head == ldata->read_head)
1388 echo_set_canon_col(ldata);
1396 put_tty_queue(c, ldata);
1398 put_tty_queue(c, ldata);
1405 struct n_tty_data *ldata = tty->disc_data;
1412 finish_erasing(ldata);
1414 if (ldata->canon_head == ldata->read_head)
1415 echo_set_canon_col(ldata);
1421 put_tty_queue(c, ldata);
1422 put_tty_queue(c, ldata);
1433 struct n_tty_data *ldata = tty->disc_data;
1440 finish_erasing(ldata);
1442 if (ldata->canon_head == ldata->read_head)
1443 echo_set_canon_col(ldata);
1447 put_tty_queue(c, ldata);
1493 struct n_tty_data *ldata = tty->disc_data;
1495 ldata->lnext = 0;
1510 struct n_tty_data *ldata = tty->disc_data;
1513 head = ldata->read_head & (N_TTY_BUF_SIZE - 1);
1515 memcpy(read_buf_addr(ldata, head), cp, n);
1516 ldata->read_head += n;
1520 head = ldata->read_head & (N_TTY_BUF_SIZE - 1);
1522 memcpy(read_buf_addr(ldata, head), cp, n);
1523 ldata->read_head += n;
1530 struct n_tty_data *ldata = tty->disc_data;
1537 put_tty_queue(*cp++, ldata);
1561 struct n_tty_data *ldata = tty->disc_data;
1575 put_tty_queue(c, ldata);
1578 if (!test_bit(c, ldata->char_map))
1595 struct n_tty_data *ldata = tty->disc_data;
1604 if (!test_bit(c, ldata->char_map))
1620 struct n_tty_data *ldata = tty->disc_data;
1623 if (ldata->real_raw)
1625 else if (ldata->raw || (L_EXTPROC(tty) && !preops))
1630 if (ldata->lnext) {
1649 if (ldata->icanon && !L_EXTPROC(tty))
1653 smp_store_release(&ldata->commit_head, ldata->read_head);
1655 if (read_cnt(ldata)) {
1698 struct n_tty_data *ldata = tty->disc_data;
1717 size_t tail = smp_load_acquire(&ldata->read_tail);
1719 room = N_TTY_BUF_SIZE - (ldata->read_head - tail);
1724 overflow = ldata->icanon && ldata->canon_head == tail;
1726 ldata->read_head--;
1728 ldata->no_room = flow && !room;
1792 struct n_tty_data *ldata = tty->disc_data;
1795 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
1796 ldata->line_start = ldata->read_tail;
1797 if (!L_ICANON(tty) || !read_cnt(ldata)) {
1798 ldata->canon_head = ldata->read_tail;
1799 ldata->push = 0;
1801 set_bit((ldata->read_head - 1) & (N_TTY_BUF_SIZE - 1),
1802 ldata->read_flags);
1803 ldata->canon_head = ldata->read_head;
1804 ldata->push = 1;
1806 ldata->commit_head = ldata->read_head;
1807 ldata->erasing = 0;
1808 ldata->lnext = 0;
1811 ldata->icanon = (L_ICANON(tty) != 0);
1817 bitmap_zero(ldata->char_map, 256);
1820 set_bit('\r', ldata->char_map);
1822 set_bit('\n', ldata->char_map);
1825 set_bit(ERASE_CHAR(tty), ldata->char_map);
1826 set_bit(KILL_CHAR(tty), ldata->char_map);
1827 set_bit(EOF_CHAR(tty), ldata->char_map);
1828 set_bit('\n', ldata->char_map);
1829 set_bit(EOL_CHAR(tty), ldata->char_map);
1831 set_bit(WERASE_CHAR(tty), ldata->char_map);
1832 set_bit(LNEXT_CHAR(tty), ldata->char_map);
1833 set_bit(EOL2_CHAR(tty), ldata->char_map);
1836 ldata->char_map);
1840 set_bit(START_CHAR(tty), ldata->char_map);
1841 set_bit(STOP_CHAR(tty), ldata->char_map);
1844 set_bit(INTR_CHAR(tty), ldata->char_map);
1845 set_bit(QUIT_CHAR(tty), ldata->char_map);
1846 set_bit(SUSP_CHAR(tty), ldata->char_map);
1848 clear_bit(__DISABLED_CHAR, ldata->char_map);
1849 ldata->raw = 0;
1850 ldata->real_raw = 0;
1852 ldata->raw = 1;
1856 ldata->real_raw = 1;
1858 ldata->real_raw = 0;
1886 struct n_tty_data *ldata = tty->disc_data;
1891 vfree(ldata);
1907 struct n_tty_data *ldata;
1910 ldata = vzalloc(sizeof(*ldata));
1911 if (!ldata)
1914 ldata->overrun_time = jiffies;
1915 mutex_init(&ldata->atomic_read_lock);
1916 mutex_init(&ldata->output_lock);
1918 tty->disc_data = ldata;
1929 struct n_tty_data *ldata = tty->disc_data;
1932 if (ldata->icanon && !L_EXTPROC(tty))
1933 return ldata->canon_head != ldata->read_tail;
1935 return ldata->commit_head - ldata->read_tail >= amt;
1947 * Called under the ldata->atomic_read_lock sem
1962 struct n_tty_data *ldata = tty->disc_data;
1965 size_t head = smp_load_acquire(&ldata->commit_head);
1966 size_t tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1);
1968 n = min(head - ldata->read_tail, N_TTY_BUF_SIZE - tail);
1971 unsigned char *from = read_buf_addr(ldata, tail);
1976 smp_store_release(&ldata->read_tail, ldata->read_tail + n);
1978 if (L_EXTPROC(tty) && ldata->icanon && is_eof &&
1979 (head == ldata->read_tail))
1985 return head != ldata->read_tail;
2017 struct n_tty_data *ldata = tty->disc_data;
2027 canon_head = smp_load_acquire(&ldata->canon_head);
2028 n = min(*nr, canon_head - ldata->read_tail);
2030 tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1);
2036 eol = find_next_bit(ldata->read_flags, size, tail);
2040 eol = find_next_bit(ldata->read_flags, more, 0);
2050 if (!found || read_buf(ldata, eol) != __DISABLED_CHAR)
2061 clear_bit(eol, ldata->read_flags);
2062 smp_store_release(&ldata->read_tail, ldata->read_tail + c);
2065 if (!ldata->push)
2066 ldata->line_start = ldata->read_tail;
2068 ldata->push = 0;
2074 return ldata->read_tail != canon_head;
2084 struct n_tty_data *ldata = tty->disc_data;
2087 canon_head = smp_load_acquire(&ldata->canon_head);
2088 tail = ldata->read_tail;
2096 if (!test_bit(tail, ldata->read_flags))
2098 if (read_buf(ldata, tail) != __DISABLED_CHAR)
2102 clear_bit(tail, ldata->read_flags);
2103 smp_store_release(&ldata->read_tail, ldata->read_tail + 1);
2157 struct n_tty_data *ldata = tty->disc_data;
2174 if (ldata->icanon && !L_EXTPROC(tty)) {
2193 mutex_unlock(&ldata->atomic_read_lock);
2206 if (!mutex_trylock(&ldata->atomic_read_lock))
2209 if (mutex_lock_interruptible(&ldata->atomic_read_lock))
2217 if (!ldata->icanon) {
2228 tail = ldata->read_tail;
2283 if (ldata->icanon && !L_EXTPROC(tty)) {
2317 if (tail != ldata->read_tail)
2322 mutex_unlock(&ldata->atomic_read_lock);
2403 struct n_tty_data *ldata = tty->disc_data;
2406 mutex_lock(&ldata->output_lock);
2408 mutex_unlock(&ldata->output_lock);
2480 static unsigned long inq_canon(struct n_tty_data *ldata)
2484 if (ldata->canon_head == ldata->read_tail)
2486 head = ldata->canon_head;
2487 tail = ldata->read_tail;
2491 if (test_bit(tail & (N_TTY_BUF_SIZE - 1), ldata->read_flags) &&
2492 read_buf(ldata, tail) == __DISABLED_CHAR)
2502 struct n_tty_data *ldata = tty->disc_data;
2511 retval = inq_canon(ldata);
2513 retval = read_cnt(ldata);