diff options
-rw-r--r-- | drivers/tty/n_tty.c | 103 |
1 files changed, 56 insertions, 47 deletions
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index f2e6bdb319cf..8686124b1309 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c | |||
@@ -1255,57 +1255,12 @@ n_tty_receive_signal_char(struct tty_struct *tty, int signal, unsigned char c) | |||
1255 | * otherwise, publishes read_head via put_tty_queue() | 1255 | * otherwise, publishes read_head via put_tty_queue() |
1256 | */ | 1256 | */ |
1257 | 1257 | ||
1258 | static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c) | 1258 | static void |
1259 | n_tty_receive_char_special(struct tty_struct *tty, unsigned char c) | ||
1259 | { | 1260 | { |
1260 | struct n_tty_data *ldata = tty->disc_data; | 1261 | struct n_tty_data *ldata = tty->disc_data; |
1261 | int parmrk; | 1262 | int parmrk; |
1262 | 1263 | ||
1263 | if (I_ISTRIP(tty)) | ||
1264 | c &= 0x7f; | ||
1265 | if (I_IUCLC(tty) && L_IEXTEN(tty)) | ||
1266 | c = tolower(c); | ||
1267 | |||
1268 | if (L_EXTPROC(tty)) { | ||
1269 | put_tty_queue(c, ldata); | ||
1270 | return; | ||
1271 | } | ||
1272 | |||
1273 | /* | ||
1274 | * If the previous character was LNEXT, or we know that this | ||
1275 | * character is not one of the characters that we'll have to | ||
1276 | * handle specially, do shortcut processing to speed things | ||
1277 | * up. | ||
1278 | */ | ||
1279 | if (!test_bit(c, ldata->char_map) || ldata->lnext) { | ||
1280 | ldata->lnext = 0; | ||
1281 | |||
1282 | if (tty->stopped && !tty->flow_stopped && I_IXON(tty) && | ||
1283 | I_IXANY(tty)) { | ||
1284 | start_tty(tty); | ||
1285 | process_echoes(tty); | ||
1286 | } | ||
1287 | |||
1288 | parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0; | ||
1289 | if (read_cnt(ldata) >= (N_TTY_BUF_SIZE - parmrk - 1)) { | ||
1290 | /* beep if no space */ | ||
1291 | if (L_ECHO(tty)) | ||
1292 | process_output('\a', tty); | ||
1293 | return; | ||
1294 | } | ||
1295 | if (L_ECHO(tty)) { | ||
1296 | finish_erasing(ldata); | ||
1297 | /* Record the column of first canon char. */ | ||
1298 | if (ldata->canon_head == ldata->read_head) | ||
1299 | echo_set_canon_col(ldata); | ||
1300 | echo_char(c, tty); | ||
1301 | commit_echoes(tty); | ||
1302 | } | ||
1303 | if (parmrk) | ||
1304 | put_tty_queue(c, ldata); | ||
1305 | put_tty_queue(c, ldata); | ||
1306 | return; | ||
1307 | } | ||
1308 | |||
1309 | if (I_IXON(tty)) { | 1264 | if (I_IXON(tty)) { |
1310 | if (c == START_CHAR(tty)) { | 1265 | if (c == START_CHAR(tty)) { |
1311 | start_tty(tty); | 1266 | start_tty(tty); |
@@ -1458,6 +1413,60 @@ handle_newline: | |||
1458 | put_tty_queue(c, ldata); | 1413 | put_tty_queue(c, ldata); |
1459 | } | 1414 | } |
1460 | 1415 | ||
1416 | static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c) | ||
1417 | { | ||
1418 | struct n_tty_data *ldata = tty->disc_data; | ||
1419 | int parmrk; | ||
1420 | |||
1421 | if (I_ISTRIP(tty)) | ||
1422 | c &= 0x7f; | ||
1423 | if (I_IUCLC(tty) && L_IEXTEN(tty)) | ||
1424 | c = tolower(c); | ||
1425 | |||
1426 | if (L_EXTPROC(tty)) { | ||
1427 | put_tty_queue(c, ldata); | ||
1428 | return; | ||
1429 | } | ||
1430 | |||
1431 | /* | ||
1432 | * If the previous character was LNEXT, or we know that this | ||
1433 | * character is not one of the characters that we'll have to | ||
1434 | * handle specially, do shortcut processing to speed things | ||
1435 | * up. | ||
1436 | */ | ||
1437 | if (!test_bit(c, ldata->char_map) || ldata->lnext) { | ||
1438 | ldata->lnext = 0; | ||
1439 | |||
1440 | if (tty->stopped && !tty->flow_stopped && I_IXON(tty) && | ||
1441 | I_IXANY(tty)) { | ||
1442 | start_tty(tty); | ||
1443 | process_echoes(tty); | ||
1444 | } | ||
1445 | |||
1446 | parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0; | ||
1447 | if (read_cnt(ldata) >= (N_TTY_BUF_SIZE - parmrk - 1)) { | ||
1448 | /* beep if no space */ | ||
1449 | if (L_ECHO(tty)) | ||
1450 | process_output('\a', tty); | ||
1451 | return; | ||
1452 | } | ||
1453 | if (L_ECHO(tty)) { | ||
1454 | finish_erasing(ldata); | ||
1455 | /* Record the column of first canon char. */ | ||
1456 | if (ldata->canon_head == ldata->read_head) | ||
1457 | echo_set_canon_col(ldata); | ||
1458 | echo_char(c, tty); | ||
1459 | commit_echoes(tty); | ||
1460 | } | ||
1461 | if (parmrk) | ||
1462 | put_tty_queue(c, ldata); | ||
1463 | put_tty_queue(c, ldata); | ||
1464 | return; | ||
1465 | } | ||
1466 | |||
1467 | n_tty_receive_char_special(tty, c); | ||
1468 | } | ||
1469 | |||
1461 | static inline void | 1470 | static inline void |
1462 | n_tty_receive_char_closing(struct tty_struct *tty, unsigned char c) | 1471 | n_tty_receive_char_closing(struct tty_struct *tty, unsigned char c) |
1463 | { | 1472 | { |