diff options
author | Felipe Balbi <balbi@ti.com> | 2011-03-21 06:25:08 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-04-22 20:31:53 -0400 |
commit | b1c43f82c5aa265442f82dba31ce985ebb7aa71c (patch) | |
tree | 8b344d8d5355b30e8deff901180edc708a653227 /drivers/net | |
parent | e9a470f445271eb157ee860a93b062324402fc3a (diff) |
tty: make receive_buf() return the amout of bytes received
it makes it simpler to keep track of the amount of
bytes received and simplifies how flush_to_ldisc counts
the remaining bytes. It also fixes a bug of lost bytes
on n_tty when flushing too many bytes via the USB
serial gadget driver.
Tested-by: Stefan Bigler <stefan.bigler@keymile.com>
Tested-by: Toby Gray <toby.gray@realvnc.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/caif/caif_serial.c | 6 | ||||
-rw-r--r-- | drivers/net/can/slcan.c | 9 | ||||
-rw-r--r-- | drivers/net/hamradio/6pack.c | 8 | ||||
-rw-r--r-- | drivers/net/hamradio/mkiss.c | 11 | ||||
-rw-r--r-- | drivers/net/irda/irtty-sir.c | 16 | ||||
-rw-r--r-- | drivers/net/ppp_async.c | 6 | ||||
-rw-r--r-- | drivers/net/ppp_synctty.c | 6 | ||||
-rw-r--r-- | drivers/net/slip.c | 11 | ||||
-rw-r--r-- | drivers/net/wan/x25_asy.c | 7 |
9 files changed, 51 insertions, 29 deletions
diff --git a/drivers/net/caif/caif_serial.c b/drivers/net/caif/caif_serial.c index 3df0c0f8b8bf..73c7e03617ec 100644 --- a/drivers/net/caif/caif_serial.c +++ b/drivers/net/caif/caif_serial.c | |||
@@ -167,8 +167,8 @@ static inline void debugfs_tx(struct ser_device *ser, const u8 *data, int size) | |||
167 | 167 | ||
168 | #endif | 168 | #endif |
169 | 169 | ||
170 | static void ldisc_receive(struct tty_struct *tty, const u8 *data, | 170 | static unsigned int ldisc_receive(struct tty_struct *tty, |
171 | char *flags, int count) | 171 | const u8 *data, char *flags, int count) |
172 | { | 172 | { |
173 | struct sk_buff *skb = NULL; | 173 | struct sk_buff *skb = NULL; |
174 | struct ser_device *ser; | 174 | struct ser_device *ser; |
@@ -215,6 +215,8 @@ static void ldisc_receive(struct tty_struct *tty, const u8 *data, | |||
215 | } else | 215 | } else |
216 | ++ser->dev->stats.rx_dropped; | 216 | ++ser->dev->stats.rx_dropped; |
217 | update_tty_status(ser); | 217 | update_tty_status(ser); |
218 | |||
219 | return count; | ||
218 | } | 220 | } |
219 | 221 | ||
220 | static int handle_tx(struct ser_device *ser) | 222 | static int handle_tx(struct ser_device *ser) |
diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index b423965a78d1..c600954998d5 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c | |||
@@ -425,16 +425,17 @@ static void slc_setup(struct net_device *dev) | |||
425 | * in parallel | 425 | * in parallel |
426 | */ | 426 | */ |
427 | 427 | ||
428 | static void slcan_receive_buf(struct tty_struct *tty, | 428 | static unsigned int slcan_receive_buf(struct tty_struct *tty, |
429 | const unsigned char *cp, char *fp, int count) | 429 | const unsigned char *cp, char *fp, int count) |
430 | { | 430 | { |
431 | struct slcan *sl = (struct slcan *) tty->disc_data; | 431 | struct slcan *sl = (struct slcan *) tty->disc_data; |
432 | int bytes = count; | ||
432 | 433 | ||
433 | if (!sl || sl->magic != SLCAN_MAGIC || !netif_running(sl->dev)) | 434 | if (!sl || sl->magic != SLCAN_MAGIC || !netif_running(sl->dev)) |
434 | return; | 435 | return -ENODEV; |
435 | 436 | ||
436 | /* Read the characters out of the buffer */ | 437 | /* Read the characters out of the buffer */ |
437 | while (count--) { | 438 | while (bytes--) { |
438 | if (fp && *fp++) { | 439 | if (fp && *fp++) { |
439 | if (!test_and_set_bit(SLF_ERROR, &sl->flags)) | 440 | if (!test_and_set_bit(SLF_ERROR, &sl->flags)) |
440 | sl->dev->stats.rx_errors++; | 441 | sl->dev->stats.rx_errors++; |
@@ -443,6 +444,8 @@ static void slcan_receive_buf(struct tty_struct *tty, | |||
443 | } | 444 | } |
444 | slcan_unesc(sl, *cp++); | 445 | slcan_unesc(sl, *cp++); |
445 | } | 446 | } |
447 | |||
448 | return count; | ||
446 | } | 449 | } |
447 | 450 | ||
448 | /************************************ | 451 | /************************************ |
diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c index 3e5d0b6b6516..992089639ea4 100644 --- a/drivers/net/hamradio/6pack.c +++ b/drivers/net/hamradio/6pack.c | |||
@@ -456,7 +456,7 @@ out: | |||
456 | * a block of 6pack data has been received, which can now be decapsulated | 456 | * a block of 6pack data has been received, which can now be decapsulated |
457 | * and sent on to some IP layer for further processing. | 457 | * and sent on to some IP layer for further processing. |
458 | */ | 458 | */ |
459 | static void sixpack_receive_buf(struct tty_struct *tty, | 459 | static unsigned int sixpack_receive_buf(struct tty_struct *tty, |
460 | const unsigned char *cp, char *fp, int count) | 460 | const unsigned char *cp, char *fp, int count) |
461 | { | 461 | { |
462 | struct sixpack *sp; | 462 | struct sixpack *sp; |
@@ -464,11 +464,11 @@ static void sixpack_receive_buf(struct tty_struct *tty, | |||
464 | int count1; | 464 | int count1; |
465 | 465 | ||
466 | if (!count) | 466 | if (!count) |
467 | return; | 467 | return 0; |
468 | 468 | ||
469 | sp = sp_get(tty); | 469 | sp = sp_get(tty); |
470 | if (!sp) | 470 | if (!sp) |
471 | return; | 471 | return -ENODEV; |
472 | 472 | ||
473 | memcpy(buf, cp, count < sizeof(buf) ? count : sizeof(buf)); | 473 | memcpy(buf, cp, count < sizeof(buf) ? count : sizeof(buf)); |
474 | 474 | ||
@@ -487,6 +487,8 @@ static void sixpack_receive_buf(struct tty_struct *tty, | |||
487 | 487 | ||
488 | sp_put(sp); | 488 | sp_put(sp); |
489 | tty_unthrottle(tty); | 489 | tty_unthrottle(tty); |
490 | |||
491 | return count1; | ||
490 | } | 492 | } |
491 | 493 | ||
492 | /* | 494 | /* |
diff --git a/drivers/net/hamradio/mkiss.c b/drivers/net/hamradio/mkiss.c index 4c628393c8b1..0e4f23531140 100644 --- a/drivers/net/hamradio/mkiss.c +++ b/drivers/net/hamradio/mkiss.c | |||
@@ -923,13 +923,14 @@ static long mkiss_compat_ioctl(struct tty_struct *tty, struct file *file, | |||
923 | * a block of data has been received, which can now be decapsulated | 923 | * a block of data has been received, which can now be decapsulated |
924 | * and sent on to the AX.25 layer for further processing. | 924 | * and sent on to the AX.25 layer for further processing. |
925 | */ | 925 | */ |
926 | static void mkiss_receive_buf(struct tty_struct *tty, const unsigned char *cp, | 926 | static unsigned int mkiss_receive_buf(struct tty_struct *tty, |
927 | char *fp, int count) | 927 | const unsigned char *cp, char *fp, int count) |
928 | { | 928 | { |
929 | struct mkiss *ax = mkiss_get(tty); | 929 | struct mkiss *ax = mkiss_get(tty); |
930 | int bytes = count; | ||
930 | 931 | ||
931 | if (!ax) | 932 | if (!ax) |
932 | return; | 933 | return -ENODEV; |
933 | 934 | ||
934 | /* | 935 | /* |
935 | * Argh! mtu change time! - costs us the packet part received | 936 | * Argh! mtu change time! - costs us the packet part received |
@@ -939,7 +940,7 @@ static void mkiss_receive_buf(struct tty_struct *tty, const unsigned char *cp, | |||
939 | ax_changedmtu(ax); | 940 | ax_changedmtu(ax); |
940 | 941 | ||
941 | /* Read the characters out of the buffer */ | 942 | /* Read the characters out of the buffer */ |
942 | while (count--) { | 943 | while (bytes--) { |
943 | if (fp != NULL && *fp++) { | 944 | if (fp != NULL && *fp++) { |
944 | if (!test_and_set_bit(AXF_ERROR, &ax->flags)) | 945 | if (!test_and_set_bit(AXF_ERROR, &ax->flags)) |
945 | ax->dev->stats.rx_errors++; | 946 | ax->dev->stats.rx_errors++; |
@@ -952,6 +953,8 @@ static void mkiss_receive_buf(struct tty_struct *tty, const unsigned char *cp, | |||
952 | 953 | ||
953 | mkiss_put(ax); | 954 | mkiss_put(ax); |
954 | tty_unthrottle(tty); | 955 | tty_unthrottle(tty); |
956 | |||
957 | return count; | ||
955 | } | 958 | } |
956 | 959 | ||
957 | /* | 960 | /* |
diff --git a/drivers/net/irda/irtty-sir.c b/drivers/net/irda/irtty-sir.c index 3352b2443e58..035861d8acb1 100644 --- a/drivers/net/irda/irtty-sir.c +++ b/drivers/net/irda/irtty-sir.c | |||
@@ -216,23 +216,23 @@ static int irtty_do_write(struct sir_dev *dev, const unsigned char *ptr, size_t | |||
216 | * usbserial: urb-complete-interrupt / softint | 216 | * usbserial: urb-complete-interrupt / softint |
217 | */ | 217 | */ |
218 | 218 | ||
219 | static void irtty_receive_buf(struct tty_struct *tty, const unsigned char *cp, | 219 | static unsigned int irtty_receive_buf(struct tty_struct *tty, |
220 | char *fp, int count) | 220 | const unsigned char *cp, char *fp, int count) |
221 | { | 221 | { |
222 | struct sir_dev *dev; | 222 | struct sir_dev *dev; |
223 | struct sirtty_cb *priv = tty->disc_data; | 223 | struct sirtty_cb *priv = tty->disc_data; |
224 | int i; | 224 | int i; |
225 | 225 | ||
226 | IRDA_ASSERT(priv != NULL, return;); | 226 | IRDA_ASSERT(priv != NULL, return -ENODEV;); |
227 | IRDA_ASSERT(priv->magic == IRTTY_MAGIC, return;); | 227 | IRDA_ASSERT(priv->magic == IRTTY_MAGIC, return -EINVAL;); |
228 | 228 | ||
229 | if (unlikely(count==0)) /* yes, this happens */ | 229 | if (unlikely(count==0)) /* yes, this happens */ |
230 | return; | 230 | return 0; |
231 | 231 | ||
232 | dev = priv->dev; | 232 | dev = priv->dev; |
233 | if (!dev) { | 233 | if (!dev) { |
234 | IRDA_WARNING("%s(), not ready yet!\n", __func__); | 234 | IRDA_WARNING("%s(), not ready yet!\n", __func__); |
235 | return; | 235 | return -ENODEV; |
236 | } | 236 | } |
237 | 237 | ||
238 | for (i = 0; i < count; i++) { | 238 | for (i = 0; i < count; i++) { |
@@ -242,11 +242,13 @@ static void irtty_receive_buf(struct tty_struct *tty, const unsigned char *cp, | |||
242 | if (fp && *fp++) { | 242 | if (fp && *fp++) { |
243 | IRDA_DEBUG(0, "Framing or parity error!\n"); | 243 | IRDA_DEBUG(0, "Framing or parity error!\n"); |
244 | sirdev_receive(dev, NULL, 0); /* notify sir_dev (updating stats) */ | 244 | sirdev_receive(dev, NULL, 0); /* notify sir_dev (updating stats) */ |
245 | return; | 245 | return -EINVAL; |
246 | } | 246 | } |
247 | } | 247 | } |
248 | 248 | ||
249 | sirdev_receive(dev, cp, count); | 249 | sirdev_receive(dev, cp, count); |
250 | |||
251 | return count; | ||
250 | } | 252 | } |
251 | 253 | ||
252 | /* | 254 | /* |
diff --git a/drivers/net/ppp_async.c b/drivers/net/ppp_async.c index a1b82c9c67d2..53872d7d7382 100644 --- a/drivers/net/ppp_async.c +++ b/drivers/net/ppp_async.c | |||
@@ -340,7 +340,7 @@ ppp_asynctty_poll(struct tty_struct *tty, struct file *file, poll_table *wait) | |||
340 | } | 340 | } |
341 | 341 | ||
342 | /* May sleep, don't call from interrupt level or with interrupts disabled */ | 342 | /* May sleep, don't call from interrupt level or with interrupts disabled */ |
343 | static void | 343 | static unsigned int |
344 | ppp_asynctty_receive(struct tty_struct *tty, const unsigned char *buf, | 344 | ppp_asynctty_receive(struct tty_struct *tty, const unsigned char *buf, |
345 | char *cflags, int count) | 345 | char *cflags, int count) |
346 | { | 346 | { |
@@ -348,7 +348,7 @@ ppp_asynctty_receive(struct tty_struct *tty, const unsigned char *buf, | |||
348 | unsigned long flags; | 348 | unsigned long flags; |
349 | 349 | ||
350 | if (!ap) | 350 | if (!ap) |
351 | return; | 351 | return -ENODEV; |
352 | spin_lock_irqsave(&ap->recv_lock, flags); | 352 | spin_lock_irqsave(&ap->recv_lock, flags); |
353 | ppp_async_input(ap, buf, cflags, count); | 353 | ppp_async_input(ap, buf, cflags, count); |
354 | spin_unlock_irqrestore(&ap->recv_lock, flags); | 354 | spin_unlock_irqrestore(&ap->recv_lock, flags); |
@@ -356,6 +356,8 @@ ppp_asynctty_receive(struct tty_struct *tty, const unsigned char *buf, | |||
356 | tasklet_schedule(&ap->tsk); | 356 | tasklet_schedule(&ap->tsk); |
357 | ap_put(ap); | 357 | ap_put(ap); |
358 | tty_unthrottle(tty); | 358 | tty_unthrottle(tty); |
359 | |||
360 | return count; | ||
359 | } | 361 | } |
360 | 362 | ||
361 | static void | 363 | static void |
diff --git a/drivers/net/ppp_synctty.c b/drivers/net/ppp_synctty.c index 2573f525f11c..0815790a5cf9 100644 --- a/drivers/net/ppp_synctty.c +++ b/drivers/net/ppp_synctty.c | |||
@@ -381,7 +381,7 @@ ppp_sync_poll(struct tty_struct *tty, struct file *file, poll_table *wait) | |||
381 | } | 381 | } |
382 | 382 | ||
383 | /* May sleep, don't call from interrupt level or with interrupts disabled */ | 383 | /* May sleep, don't call from interrupt level or with interrupts disabled */ |
384 | static void | 384 | static unsigned int |
385 | ppp_sync_receive(struct tty_struct *tty, const unsigned char *buf, | 385 | ppp_sync_receive(struct tty_struct *tty, const unsigned char *buf, |
386 | char *cflags, int count) | 386 | char *cflags, int count) |
387 | { | 387 | { |
@@ -389,7 +389,7 @@ ppp_sync_receive(struct tty_struct *tty, const unsigned char *buf, | |||
389 | unsigned long flags; | 389 | unsigned long flags; |
390 | 390 | ||
391 | if (!ap) | 391 | if (!ap) |
392 | return; | 392 | return -ENODEV; |
393 | spin_lock_irqsave(&ap->recv_lock, flags); | 393 | spin_lock_irqsave(&ap->recv_lock, flags); |
394 | ppp_sync_input(ap, buf, cflags, count); | 394 | ppp_sync_input(ap, buf, cflags, count); |
395 | spin_unlock_irqrestore(&ap->recv_lock, flags); | 395 | spin_unlock_irqrestore(&ap->recv_lock, flags); |
@@ -397,6 +397,8 @@ ppp_sync_receive(struct tty_struct *tty, const unsigned char *buf, | |||
397 | tasklet_schedule(&ap->tsk); | 397 | tasklet_schedule(&ap->tsk); |
398 | sp_put(ap); | 398 | sp_put(ap); |
399 | tty_unthrottle(tty); | 399 | tty_unthrottle(tty); |
400 | |||
401 | return count; | ||
400 | } | 402 | } |
401 | 403 | ||
402 | static void | 404 | static void |
diff --git a/drivers/net/slip.c b/drivers/net/slip.c index 86cbb9ea2f26..86718d358395 100644 --- a/drivers/net/slip.c +++ b/drivers/net/slip.c | |||
@@ -670,16 +670,17 @@ static void sl_setup(struct net_device *dev) | |||
670 | * in parallel | 670 | * in parallel |
671 | */ | 671 | */ |
672 | 672 | ||
673 | static void slip_receive_buf(struct tty_struct *tty, const unsigned char *cp, | 673 | static unsigned int slip_receive_buf(struct tty_struct *tty, |
674 | char *fp, int count) | 674 | const unsigned char *cp, char *fp, int count) |
675 | { | 675 | { |
676 | struct slip *sl = tty->disc_data; | 676 | struct slip *sl = tty->disc_data; |
677 | int bytes = count; | ||
677 | 678 | ||
678 | if (!sl || sl->magic != SLIP_MAGIC || !netif_running(sl->dev)) | 679 | if (!sl || sl->magic != SLIP_MAGIC || !netif_running(sl->dev)) |
679 | return; | 680 | return -ENODEV; |
680 | 681 | ||
681 | /* Read the characters out of the buffer */ | 682 | /* Read the characters out of the buffer */ |
682 | while (count--) { | 683 | while (bytes--) { |
683 | if (fp && *fp++) { | 684 | if (fp && *fp++) { |
684 | if (!test_and_set_bit(SLF_ERROR, &sl->flags)) | 685 | if (!test_and_set_bit(SLF_ERROR, &sl->flags)) |
685 | sl->dev->stats.rx_errors++; | 686 | sl->dev->stats.rx_errors++; |
@@ -693,6 +694,8 @@ static void slip_receive_buf(struct tty_struct *tty, const unsigned char *cp, | |||
693 | #endif | 694 | #endif |
694 | slip_unesc(sl, *cp++); | 695 | slip_unesc(sl, *cp++); |
695 | } | 696 | } |
697 | |||
698 | return count; | ||
696 | } | 699 | } |
697 | 700 | ||
698 | /************************************ | 701 | /************************************ |
diff --git a/drivers/net/wan/x25_asy.c b/drivers/net/wan/x25_asy.c index 24297b274cd4..40398bf7d036 100644 --- a/drivers/net/wan/x25_asy.c +++ b/drivers/net/wan/x25_asy.c | |||
@@ -517,17 +517,18 @@ static int x25_asy_close(struct net_device *dev) | |||
517 | * and sent on to some IP layer for further processing. | 517 | * and sent on to some IP layer for further processing. |
518 | */ | 518 | */ |
519 | 519 | ||
520 | static void x25_asy_receive_buf(struct tty_struct *tty, | 520 | static unsigned int x25_asy_receive_buf(struct tty_struct *tty, |
521 | const unsigned char *cp, char *fp, int count) | 521 | const unsigned char *cp, char *fp, int count) |
522 | { | 522 | { |
523 | struct x25_asy *sl = tty->disc_data; | 523 | struct x25_asy *sl = tty->disc_data; |
524 | int bytes = count; | ||
524 | 525 | ||
525 | if (!sl || sl->magic != X25_ASY_MAGIC || !netif_running(sl->dev)) | 526 | if (!sl || sl->magic != X25_ASY_MAGIC || !netif_running(sl->dev)) |
526 | return; | 527 | return; |
527 | 528 | ||
528 | 529 | ||
529 | /* Read the characters out of the buffer */ | 530 | /* Read the characters out of the buffer */ |
530 | while (count--) { | 531 | while (bytes--) { |
531 | if (fp && *fp++) { | 532 | if (fp && *fp++) { |
532 | if (!test_and_set_bit(SLF_ERROR, &sl->flags)) | 533 | if (!test_and_set_bit(SLF_ERROR, &sl->flags)) |
533 | sl->dev->stats.rx_errors++; | 534 | sl->dev->stats.rx_errors++; |
@@ -536,6 +537,8 @@ static void x25_asy_receive_buf(struct tty_struct *tty, | |||
536 | } | 537 | } |
537 | x25_asy_unesc(sl, *cp++); | 538 | x25_asy_unesc(sl, *cp++); |
538 | } | 539 | } |
540 | |||
541 | return count; | ||
539 | } | 542 | } |
540 | 543 | ||
541 | /* | 544 | /* |