This driver currently allows a cmd->stop_src == TRIG_COUNT with a cmd->stop_arg
of 0. This causes the (*do_cmd) to immediately generate a COMEDI_CB_EOA event
without acquiring any data.
This "empty acquisition" async command is not really useful. Validate that the
cmd->stop_arg is >= 1 in the (*do_cmdtest) and remove the "empty acquisition"
code.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
staging: comedi: amplc_dio200_common: 'stopcount' is always 'stop_arg'
When the cmd->stop_src == TRIG_COUNT, the 'stopcount' is the cmd->stop_arg. When
the stop_src == TRIG_NONE the 'stopcount' is 0, which is also the cmd->stop_arg.
Simplify the 'stopcount' initialization.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This driver currently allows a cmd->stop_src == TRIG_COUNT with a cmd->stop_arg
of 0. This causes the (*do_cmd) to immediatelt generate a COMEDI_CB_EOA event
without acquiring any data.
This "empty acquisition" async command is not really useful. Validate that the
cmd->stop_arg is >= 1 in the (*do_cmdtest) and remove the "empty acquisition"
code.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This driver currently allows a cmd->stop_src == TRIG_COUNT with a cmd->stop_arg
of 0. This causes the (*do_cmd) to immediatelt generate a COMEDI_CB_EOA event
without acquiring any data.
This "empty acquisition" async command is not really useful. Validate that the
cmd->stop_arg is >= 1 in the (*do_cmdtest) and remove the "empty acquisition"
code.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
staging: comedi: adl_pci9118: absorb DMA and non-DMA helpers
Currently the pci9118_ai_docmd_dma() or pci9118_ai_docmd_sampl() helper
is called by the (*do_cmd) to do the final setup for the command. Most
of this invloves setting various bits in 'ai_ctrl' and 'int_ctrl' to
setup the acquisition based on the 'ai_do' mode. Most of this is the
same for the DMA and non-DMA setup. The differences are easily handled
by either checking the cmd trigger sources or if DMA is used.
Absorb the helper functions into the (*do_cmd) to clarify the code.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
The async command can start immediately (TRIG_NOW), from an internal
trigger (TRIG_INT), or from an external trigger (TRIG_EXT). Currently
the start of the command is scattered in the DMA and non-DMA helper
functions.
Consolidate the start of the async command at the end of the (*do_cmd)
function. For aesthetics, use the 'cmd->start_src' directly instead
of the 'ai12_startstop' in the private data to determine how to start
the command. This also fixes a minor bug where the external trigger
gets enabled for a start_src == TRIG_INT.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
staging: comedi: adl_pci9118: enable DMA in common code path
The pci9118_ai_docmd_dma() function enables the DMA bit in the ai control
register for all acquisition modes. For aesthetics, move the enable of
this bit into the (*do_cmd).
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
The async command can operation in 4 modes in this driver.
Modes 1 and 4 use timers 1 and 2 as a cascaded timer to trigger each conversion.
Mode 1 begins the acquisitions immediately (scan_begin_src == TRIG_FOLLOW) and
Mode 4 begins after an external trigger (scan_begin_src == TRIG_EXT). Both modes
use a convert_src == TRIG_TIMER.
Mode 2 uses timers 1 and 2 in a double timed action (scan_begin_src == TRIG_TIMER
and convert_src != TRIG_EXT (TRIG_TIMER and TRIG_NOW are valid)).
Mode 3 does not use the timers. Each acquisition is triggered by an external
signal (scan_begin_src == TRIG_FOLLOW and convert_src == TRIG_EXT.
The (*do_cmdtest) validates the scan_begin_src as TRIG_FOLLOW, TRIG_TIMER,
or TRIG_EXT. Remove the invalid check for TRIG_INT in the (*do_cmd).
Clarify the logic used to determine the mode in the (*do_cmd).
Also, simplify pci9118_calc_divisors(). Call i8253_cascade_ns_to_timer() directly
in the (*do_cmd) for the mode 1 and mode 4 cases. Call pci9118_calc_divisors()
only for mode 2 acquisitions.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This function is called by the analog input (*insn_read) and (*do_cmd)
operations. The pci9118_set_chanlist() function is also called by those
operations. Setting the range and aref logically belongs with setting
the chanlist. To clarify the code, absorb pci9118_ai_set_range_aref()
into pci9118_set_chanlist().
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
For aesthetics, merge these two helper functions and add a parameter,
'enable', to determine if the external trigger is being added (enabled)
or deleted (disabled).
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
staging: comedi: adl_pci9118: exttrg source is always EXTTRG_AI
The 'source' passed to pci9118_exttrg_{add,del}() is always EXTTRG_AI.
Remove the parameter and unnecessary sanity checking. Also, since there
is only one vaild exttrg source, remove the unnecessary 'exttrg_users'
member from the private data.
The pci9118_exttrg_{add,del}() functions always succeed. For aesthetics
change the return type to void.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This function modifies the analog input acquistion programming after the first
DMA cycle to continue a "mode4" acqusition. Part of this programs timer 0 based
on the hardware address of the next buffer. When double buffering is not used
for DMA the "next" buffer is always the first, and only, buffer.
Add a parameter to this function to indicate what the "next" buffer actually is
and fix the callers.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
staging: comedi: adl_pci9118: change type of pci9118_dmabuf 'virt' member
For aesthetics, change the type of this member to avoid the casts when allocating
and freeing the DMA buffers. This does introduce a cast in move_block_from_dma()
but that cast is cleaner.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
staging: comedi: adl_pci9118: convert private data true/false flags to bit-fields
For aesthetics convert the private data true/false flags to bit-fields. The
'usemux' member is used in the driver as a flag. Refactor the analog input
subdevice init so this member can also be a bit-field.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
staging: comedi: adl_pci9118: do cfc_handle_events() at end of interrupt
Each of the error detections currently do a cfc_handle_events() and exits
the interrupt handler if the error is detected. The DMA and non-DMA handlers
also to a cfc_handle_events().
For aesthetics, use goto to exit the interrupt handler if an error is detected
and move the cfc_handle_events() call to the end of the interrupt.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
staging: comedi: adl_pci9118: handle hardware errors in interrupt handler
Hardware errors will now always terminate an async command. For aesthetics,
absorb pci9118_decode_error_status() into the interrupt handler and use
the register map defines to remove the "magic" numbers. Refactor the code
to set the appropriate comedi event bits and handle the event.
Remove the unnecessary 'ai_maskerr' and 'ai_maskharderr' members from the
private data.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
staging: comedi: adl_pci9118: handle error detection in main interrupt handler
The DMA and non-DMA both check the analog input status value to detect
hardware errors. For aesthetics, move the this detection into the main
interrupt handler. This allows removing the unused 'int_adstat' parameter
from the DMA and non-DMA handlers. In addition, the 'int_daq' parameter
is also not used so remove it also.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
staging: comedi: adl_pci9118: handle master/target abort in main interrupt handler
For aesthetics, move the master/target abort detection from the DMA handler to the
main interrupt handler. This allows removing the unused 'int_amcc' parameter from
the DMA and non-DMA handlers.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
The legacy (*attach) currently allows the user to pass a mask of error conditions
to ignore when running async commands. Remove this support so that the async
command is always terminated if the hardware reports an error.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
staging: comedi: adl_pci9118: always try to use interrupt and DMA
This driver currently supports both the (*auto_attach) and legacy (*attach)
mechanisms. The (*auto_attach) always tries to use the interrupt and DMA to
support async commands with the analog input subdevice. The legacy (*attach)
only enables them depending on a user option that is passed to the (*attach).
The 'default' (i.e. option == 0) is to enable both the interrupt and DMA.
Simplify the attach by always trying to enable the interrupt and DMA.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
It's possible for dev_alloc_skb() to fail. Propagate the error to the caller,
so it can clean up and drop the packet. The sender should end up retransmitting
the packet, hopefully at a time we're prepared to allocate skb's again.