static void ni_tio_acknowledge_and_confirm(struct ni_gpct *counter, int *gate_error, int *tc_error, int *perm_stale_data) { unsigned int cidx = counter->counter_index; const unsigned short gxx_status = ni_tio_read(counter, NITIO_SHARED_STATUS_REG(cidx)); const unsigned short gi_status = ni_tio_read(counter, NITIO_STATUS_REG(cidx)); unsigned int ack = 0; if (gate_error) *gate_error = 0; if (tc_error) *tc_error = 0; if (perm_stale_data) *perm_stale_data = 0; if (gxx_status & GI_GATE_ERROR(cidx)) { ack |= GI_GATE_ERROR_CONFIRM(cidx); if (gate_error) { /* * 660x don't support automatic acknowledgment * of gate interrupt via dma read/write * and report bogus gate errors */ if (counter->counter_dev->variant != ni_gpct_variant_660x) *gate_error = 1; } } if (gxx_status & GI_TC_ERROR(cidx)) { ack |= GI_TC_ERROR_CONFIRM(cidx); if (tc_error) *tc_error = 1; } if (gi_status & GI_TC) ack |= GI_TC_INTERRUPT_ACK; if (gi_status & GI_GATE_INTERRUPT) { if (should_ack_gate(counter)) ack |= GI_GATE_INTERRUPT_ACK; } if (ack) ni_tio_write(counter, ack, NITIO_INT_ACK_REG(cidx)); if (ni_tio_get_soft_copy(counter, NITIO_MODE_REG(cidx)) & GI_LOADING_ON_GATE) { if (ni_tio_read(counter, NITIO_STATUS2_REG(cidx)) & GI_PERMANENT_STALE(cidx)) { dev_info(counter->counter_dev->dev->class_dev, "%s: Gi_Permanent_Stale_Data detected.\n", __func__); if (perm_stale_data) *perm_stale_data = 1; } } }
void ni_tio_acknowledge_and_confirm(struct ni_gpct *counter, int *gate_error, int *tc_error, int *perm_stale_data, int *stale_data) { unsigned cidx = counter->counter_index; const unsigned short gxx_status = read_register(counter, NITIO_SHARED_STATUS_REG(cidx)); const unsigned short gi_status = read_register(counter, NITIO_STATUS_REG(cidx)); unsigned ack = 0; if (gate_error) *gate_error = 0; if (tc_error) *tc_error = 0; if (perm_stale_data) *perm_stale_data = 0; if (stale_data) *stale_data = 0; if (gxx_status & Gi_Gate_Error_Bit(cidx)) { ack |= Gi_Gate_Error_Confirm_Bit(cidx); if (gate_error) { /*660x don't support automatic acknowledgement of gate interrupt via dma read/write and report bogus gate errors */ if (counter->counter_dev->variant != ni_gpct_variant_660x) { *gate_error = 1; } } } if (gxx_status & Gi_TC_Error_Bit(cidx)) { ack |= Gi_TC_Error_Confirm_Bit(cidx); if (tc_error) *tc_error = 1; } if (gi_status & Gi_TC_Bit) ack |= Gi_TC_Interrupt_Ack_Bit; if (gi_status & Gi_Gate_Interrupt_Bit) { if (should_ack_gate(counter)) ack |= Gi_Gate_Interrupt_Ack_Bit; } if (ack) write_register(counter, ack, NITIO_INT_ACK_REG(cidx)); if (ni_tio_get_soft_copy(counter, NITIO_MODE_REG(cidx)) & Gi_Loading_On_Gate_Bit) { if (gxx_status & Gi_Stale_Data_Bit(cidx)) { if (stale_data) *stale_data = 1; } if (read_register(counter, NITIO_STATUS2_REG(cidx)) & Gi_Permanent_Stale_Bit(cidx)) { dev_info(counter->counter_dev->dev->class_dev, "%s: Gi_Permanent_Stale_Data detected.\n", __func__); if (perm_stale_data) *perm_stale_data = 1; } } }