@@ -333,7 +333,6 @@ struct pcl818_private {
333333 unsigned int usefifo :1 ;
334334 unsigned int ai_cmd_running :1 ;
335335 unsigned int irq_was_now_closed :1 ;
336- unsigned int neverending_ai :1 ;
337336};
338337
339338static const unsigned int muxonechan [] = { 0x00 , 0x11 , 0x22 , 0x33 , 0x44 , 0x55 , 0x66 , 0x77 , /* used for gain list programming */
@@ -531,11 +530,10 @@ static irqreturn_t interrupt_pcl818_ai_mode13_int(int irq, void *d)
531530 devpriv -> ai_act_scan -- ;
532531 }
533532
534- if (!devpriv -> neverending_ai ) {
535- if (devpriv -> ai_act_scan == 0 ) { /* all data sampled */
536- s -> cancel (dev , s );
537- s -> async -> events |= COMEDI_CB_EOA ;
538- }
533+ if (cmd -> stop_src == TRIG_COUNT && devpriv -> ai_act_scan == 0 ) {
534+ /* all data sampled */
535+ s -> cancel (dev , s );
536+ s -> async -> events |= COMEDI_CB_EOA ;
539537 }
540538 comedi_event (dev , s );
541539 return IRQ_HANDLED ;
@@ -553,12 +551,13 @@ static irqreturn_t interrupt_pcl818_ai_mode13_dma(int irq, void *d)
553551
554552 disable_dma (devpriv -> dma );
555553 devpriv -> next_dma_buf = 1 - devpriv -> next_dma_buf ;
556- if ((devpriv -> dma_runs_to_end ) > -1 || devpriv -> neverending_ai ) { /* switch dma bufs */
554+ if (devpriv -> dma_runs_to_end > -1 || cmd -> stop_src == TRIG_NONE ) {
555+ /* switch dma bufs */
557556 set_dma_mode (devpriv -> dma , DMA_MODE_READ );
558557 flags = claim_dma_lock ();
559558 set_dma_addr (devpriv -> dma ,
560559 devpriv -> hwdmaptr [devpriv -> next_dma_buf ]);
561- if (devpriv -> dma_runs_to_end || devpriv -> neverending_ai )
560+ if (devpriv -> dma_runs_to_end || cmd -> stop_src == TRIG_NONE )
562561 set_dma_count (devpriv -> dma , devpriv -> hwdmasize );
563562 else
564563 set_dma_count (devpriv -> dma , devpriv -> last_dma_run );
@@ -598,13 +597,13 @@ static irqreturn_t interrupt_pcl818_ai_mode13_dma(int irq, void *d)
598597 devpriv -> ai_act_scan -- ;
599598 }
600599
601- if (! devpriv -> neverending_ai )
602- if ( devpriv -> ai_act_scan == 0 ) { /* all data sampled */
603- s -> cancel (dev , s );
604- s -> async -> events |= COMEDI_CB_EOA ;
605- comedi_event (dev , s );
606- return IRQ_HANDLED ;
607- }
600+ if (cmd -> stop_src == TRIG_COUNT && devpriv -> ai_act_scan == 0 ) {
601+ /* all data sampled */
602+ s -> cancel (dev , s );
603+ s -> async -> events |= COMEDI_CB_EOA ;
604+ comedi_event (dev , s );
605+ return IRQ_HANDLED ;
606+ }
608607 }
609608
610609 if (len > 0 )
@@ -671,13 +670,13 @@ static irqreturn_t interrupt_pcl818_ai_mode13_fifo(int irq, void *d)
671670 devpriv -> ai_act_scan -- ;
672671 }
673672
674- if (! devpriv -> neverending_ai )
675- if ( devpriv -> ai_act_scan == 0 ) { /* all data sampled */
676- s -> cancel (dev , s );
677- s -> async -> events |= COMEDI_CB_EOA ;
678- comedi_event (dev , s );
679- return IRQ_HANDLED ;
680- }
673+ if (cmd -> stop_src == TRIG_COUNT && devpriv -> ai_act_scan == 0 ) {
674+ /* all data sampled */
675+ s -> cancel (dev , s );
676+ s -> async -> events |= COMEDI_CB_EOA ;
677+ comedi_event (dev , s );
678+ return IRQ_HANDLED ;
679+ }
681680 }
682681
683682 if (len > 0 )
@@ -690,15 +689,16 @@ static irqreturn_t interrupt_pcl818(int irq, void *d)
690689 struct comedi_device * dev = d ;
691690 struct pcl818_private * devpriv = dev -> private ;
692691 struct comedi_subdevice * s = dev -> read_subdev ;
692+ struct comedi_cmd * cmd = & s -> async -> cmd ;
693693
694694 if (!dev -> attached ) {
695695 comedi_error (dev , "premature interrupt" );
696696 return IRQ_HANDLED ;
697697 }
698698
699699 if (devpriv -> ai_cmd_running && devpriv -> irq_was_now_closed ) {
700- if ((devpriv -> neverending_ai || (! devpriv -> neverending_ai &&
701- devpriv -> ai_act_scan > 0 )) &&
700+ if ((cmd -> stop_src == TRIG_NONE ||
701+ ( cmd -> stop_src == TRIG_COUNT && devpriv -> ai_act_scan > 0 )) &&
702702 (devpriv -> ai_mode == INT_TYPE_AI1_DMA ||
703703 devpriv -> ai_mode == INT_TYPE_AI3_DMA )) {
704704 /* The cleanup from ai_cancel() has been delayed
@@ -707,7 +707,6 @@ static irqreturn_t interrupt_pcl818(int irq, void *d)
707707 progress.
708708 */
709709 devpriv -> ai_act_scan = 0 ;
710- devpriv -> neverending_ai = 0 ;
711710 s -> cancel (dev , s );
712711 }
713712
@@ -751,7 +750,7 @@ static void pcl818_ai_mode13dma_int(int mode, struct comedi_device *dev,
751750
752751 disable_dma (devpriv -> dma ); /* disable dma */
753752 bytes = devpriv -> hwdmasize ;
754- if (! devpriv -> neverending_ai ) {
753+ if (cmd -> stop_src == TRIG_COUNT ) {
755754 bytes = cmd -> chanlist_len * cmd -> stop_arg * sizeof (short );
756755 devpriv -> dma_runs_to_end = bytes / devpriv -> hwdmasize ;
757756 devpriv -> last_dma_run = bytes % devpriv -> hwdmasize ;
@@ -1018,11 +1017,6 @@ static int ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
10181017
10191018 devpriv -> ai_data_len = s -> async -> prealloc_bufsz ;
10201019
1021- if (cmd -> stop_src == TRIG_COUNT )
1022- devpriv -> neverending_ai = 0 ;
1023- else
1024- devpriv -> neverending_ai = 1 ;
1025-
10261020 if (cmd -> scan_begin_src == TRIG_FOLLOW ) { /* mode 1, 3 */
10271021 if (cmd -> convert_src == TRIG_TIMER ) { /* mode 1 */
10281022 retval = pcl818_ai_cmd_mode (1 , dev , s );
@@ -1040,16 +1034,16 @@ static int pcl818_ai_cancel(struct comedi_device *dev,
10401034 struct comedi_subdevice * s )
10411035{
10421036 struct pcl818_private * devpriv = dev -> private ;
1037+ struct comedi_cmd * cmd = & s -> async -> cmd ;
10431038
10441039 if (devpriv -> ai_cmd_running ) {
10451040 devpriv -> irq_was_now_closed = 1 ;
10461041
10471042 switch (devpriv -> ai_mode ) {
10481043 case INT_TYPE_AI1_DMA :
10491044 case INT_TYPE_AI3_DMA :
1050- if (devpriv -> neverending_ai ||
1051- (!devpriv -> neverending_ai &&
1052- devpriv -> ai_act_scan > 0 )) {
1045+ if (cmd -> stop_src == TRIG_NONE ||
1046+ (cmd -> stop_src == TRIG_COUNT && devpriv -> ai_act_scan > 0 )) {
10531047 /* wait for running dma transfer to end, do cleanup in interrupt */
10541048 goto end ;
10551049 }
@@ -1071,7 +1065,6 @@ static int pcl818_ai_cancel(struct comedi_device *dev,
10711065 outb (0 , dev -> iobase + PCL818_FI_ENABLE );
10721066 }
10731067 devpriv -> ai_cmd_running = 0 ;
1074- devpriv -> neverending_ai = 0 ;
10751068 devpriv -> ai_mode = 0 ;
10761069 devpriv -> irq_was_now_closed = 0 ;
10771070 break ;
0 commit comments