diff options
author | Bernd Porr <BerndPorr@f2s.com> | 2009-05-24 15:36:09 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-06-19 14:00:34 -0400 |
commit | efe8d60a923ddd00de394381cb30aab5114b71a4 (patch) | |
tree | 5579b441e220826643224e44f9e96065a996b4c9 /drivers/staging/comedi | |
parent | 0b8f754a6220158f2348bc6eae2772bc64bc98a2 (diff) |
Staging: comedi: usbdux: buffer overflow error handling
These changes guarantee that the URBs are not resubmitted in case of a
comedi buffer overflow. Otherwise this runs in the background even when
the userspace program has terminated.
From: Bernd Porr <BerndPorr@f2s.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/comedi')
-rw-r--r-- | drivers/staging/comedi/drivers/usbdux.c | 15 | ||||
-rw-r--r-- | drivers/staging/comedi/drivers/usbduxfast.c | 11 |
2 files changed, 18 insertions, 8 deletions
diff --git a/drivers/staging/comedi/drivers/usbdux.c b/drivers/staging/comedi/drivers/usbdux.c index eea7dbdde0b..171a6f2ff74 100644 --- a/drivers/staging/comedi/drivers/usbdux.c +++ b/drivers/staging/comedi/drivers/usbdux.c | |||
@@ -509,14 +509,19 @@ static void usbduxsub_ai_IsocIrq(struct urb *urb) | |||
509 | for (i = 0; i < n; i++) { | 509 | for (i = 0; i < n; i++) { |
510 | /* transfer data */ | 510 | /* transfer data */ |
511 | if (CR_RANGE(s->async->cmd.chanlist[i]) <= 1) { | 511 | if (CR_RANGE(s->async->cmd.chanlist[i]) <= 1) { |
512 | comedi_buf_put | 512 | err = comedi_buf_put |
513 | (s->async, | 513 | (s->async, |
514 | le16_to_cpu(this_usbduxsub-> | 514 | le16_to_cpu(this_usbduxsub-> |
515 | inBuffer[i]) ^ 0x800); | 515 | inBuffer[i]) ^ 0x800); |
516 | } else { | 516 | } else { |
517 | comedi_buf_put | 517 | err = comedi_buf_put |
518 | (s->async, | 518 | (s->async, |
519 | le16_to_cpu(this_usbduxsub->inBuffer[i])); | 519 | le16_to_cpu(this_usbduxsub->inBuffer[i])); |
520 | } | ||
521 | if (unlikely(err == 0)) { | ||
522 | /* buffer overflow */ | ||
523 | usbdux_ai_stop(this_usbduxsub, 0); | ||
524 | return; | ||
520 | } | 525 | } |
521 | } | 526 | } |
522 | /* tell comedi that data is there */ | 527 | /* tell comedi that data is there */ |
diff --git a/drivers/staging/comedi/drivers/usbduxfast.c b/drivers/staging/comedi/drivers/usbduxfast.c index 5862078bfbb..939b53fa569 100644 --- a/drivers/staging/comedi/drivers/usbduxfast.c +++ b/drivers/staging/comedi/drivers/usbduxfast.c | |||
@@ -406,7 +406,7 @@ static void usbduxfastsub_ai_Irq(struct urb *urb) | |||
406 | udfs->ai_sample_count | 406 | udfs->ai_sample_count |
407 | * sizeof(uint16_t)); | 407 | * sizeof(uint16_t)); |
408 | usbduxfast_ai_stop(udfs, 0); | 408 | usbduxfast_ai_stop(udfs, 0); |
409 | /* say comedi that the acquistion is over */ | 409 | /* tell comedi that the acquistion is over */ |
410 | s->async->events |= COMEDI_CB_EOA; | 410 | s->async->events |= COMEDI_CB_EOA; |
411 | comedi_event(udfs->comedidev, s); | 411 | comedi_event(udfs->comedidev, s); |
412 | return; | 412 | return; |
@@ -414,8 +414,13 @@ static void usbduxfastsub_ai_Irq(struct urb *urb) | |||
414 | udfs->ai_sample_count -= n; | 414 | udfs->ai_sample_count -= n; |
415 | } | 415 | } |
416 | /* write the full buffer to comedi */ | 416 | /* write the full buffer to comedi */ |
417 | cfc_write_array_to_buffer(s, urb->transfer_buffer, | 417 | err = cfc_write_array_to_buffer(s, urb->transfer_buffer, |
418 | urb->actual_length); | 418 | urb->actual_length); |
419 | if (unlikely(err == 0)) { | ||
420 | /* buffer overflow */ | ||
421 | usbduxfast_ai_stop(udfs, 0); | ||
422 | return; | ||
423 | } | ||
419 | 424 | ||
420 | /* tell comedi that data is there */ | 425 | /* tell comedi that data is there */ |
421 | comedi_event(udfs->comedidev, s); | 426 | comedi_event(udfs->comedidev, s); |