aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/comedi
diff options
context:
space:
mode:
authorBernd Porr <BerndPorr@f2s.com>2009-05-24 15:36:09 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2009-06-19 14:00:34 -0400
commitefe8d60a923ddd00de394381cb30aab5114b71a4 (patch)
tree5579b441e220826643224e44f9e96065a996b4c9 /drivers/staging/comedi
parent0b8f754a6220158f2348bc6eae2772bc64bc98a2 (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.c15
-rw-r--r--drivers/staging/comedi/drivers/usbduxfast.c11
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);