.aobits         = 12,
                .ao_fifo_depth  = 2048,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 1000,
                .num_p0_dio_channels = 8,
                .caldac         = { mb88341 },
                .aobits         = 12,
                .ao_fifo_depth  = 2048,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 1000,
                .num_p0_dio_channels = 8,
                .caldac         = { mb88341 },
                .n_aochan       = 2,
                .aobits         = 12,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 10000,
                .num_p0_dio_channels = 8,
                .caldac         = { ad8804_debug },
                .n_aochan       = 2,
                .aobits         = 12,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 10000,
                .num_p0_dio_channels = 8,
                .caldac         = { ad8804_debug },
                .aobits         = 12,
                .ao_fifo_depth  = 2048,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 1000,
                .num_p0_dio_channels = 8,
                .caldac         = { ad8804_debug },
                .aobits         = 16,
                .ao_fifo_depth  = 2048,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 1000,
                .num_p0_dio_channels = 8,
                .caldac         = { dac8800, dac8043, ad8522 },
 
 
        for (i = 0; i < length; i++) {
                range = CR_RANGE(cmd->chanlist[chan_index]);
-               if (board->ao_unipolar == 0 || (range & 1) == 0)
+
+               if (comedi_range_is_bipolar(s, range))
                        array[i] -= offset;
 #ifdef PCIDMA
                array[i] = cpu_to_le16(array[i]);
                range = CR_RANGE(chanspec[i]);
                conf = AO_Channel(chan);
 
-               if (board->ao_unipolar) {
-                       if ((range & 1) == 0) {
-                               conf |= AO_Bipolar;
-                               invert = (1 << (board->aobits - 1));
-                       } else {
-                               invert = 0;
-                       }
-                       if (range & 2)
-                               conf |= AO_Ext_Ref;
-               } else {
+               if (comedi_range_is_bipolar(s, range)) {
                        conf |= AO_Bipolar;
                        invert = (1 << (board->aobits - 1));
+               } else {
+                       invert = 0;
                }
+               if (comedi_range_is_external(s, range))
+                       conf |= AO_Ext_Ref;
 
                /* not all boards can deglitch, but this shouldn't hurt */
                if (chanspec[i] & CR_DEGLITCH)
 
                .aobits         = 16,
                .ao_fifo_depth  = 2048,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 10000,
                .num_p0_dio_channels = 8,
                .caldac         = { dac8800, dac8043, ad8522 },
                .aobits         = 16,
                .ao_fifo_depth  = 2048,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 10000,
                .num_p0_dio_channels = 8,
                .caldac         = { dac8800, dac8043, ad8522 },
                .aobits         = 12,
                .ao_fifo_depth  = 2048,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 1000,
                .num_p0_dio_channels = 8,
                .caldac         = { mb88341 },
                .aobits         = 12,
                .ao_fifo_depth  = 512,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 1000,
                .num_p0_dio_channels = 8,
                .caldac         = { ad8804_debug },     /* doc says mb88341 */
                .aobits         = 12,
                .ao_fifo_depth  = 512,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 1000,
                .num_p0_dio_channels = 8,
                .caldac         = { mb88341 },
                .aobits         = 16,
                .ao_fifo_depth  = 2048,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 10000,
                .num_p0_dio_channels = 8,
                .caldac         = { dac8800, dac8043, ad8522 },
                .aobits         = 12,
                .ao_fifo_depth  = 2048,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 1000,
                .num_p0_dio_channels = 8,
                .caldac         = { ad8804_debug },
                .n_aochan       = 2,
                .aobits         = 12,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 100000,
                .num_p0_dio_channels = 8,
                .caldac         = { ad8804_debug },     /* manual is wrong */
                .ai_speed       = 3000,
                .n_aochan       = 2,
                .aobits         = 16,
-               .ao_unipolar    = 1,
                .ao_fifo_depth  = 2048,
                .ao_range_table = &range_ni_E_ao_ext,
                .ao_speed       = 3000,
                .aobits         = 12,
                .ao_fifo_depth  = 2048,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 1000,
                .num_p0_dio_channels = 8,
                .caldac         = { ad8804_debug },
                .aobits         = 12,
                .ao_fifo_depth  = 2048,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 1000,
                .num_p0_dio_channels = 8,
                .caldac         = { ad8804_debug },
                .ai_speed       = 3000,
                .n_aochan       = 2,
                .aobits         = 16,
-               .ao_unipolar    = 1,
                .ao_fifo_depth  = 2048,
                .ao_range_table = &range_ni_E_ao_ext,
                .ao_speed       = 3000,
                .aobits         = 16,
                .ao_fifo_depth  = 2048,
                .ao_range_table = &range_ni_E_ao_ext,
-               .ao_unipolar    = 1,
                .ao_speed       = 10000,
                .num_p0_dio_channels = 8,
                .caldac         = { dac8800, dac8043, ad8522 },
                .ao_fifo_depth  = 8191,
                .ao_range_table = &range_ni_M_628x_ao,
                .reg_type       = ni_reg_628x,
-               .ao_unipolar    = 1,
                .ao_speed       = 350,
                .num_p0_dio_channels = 8,
                .caldac         = { caldac_none },
                .ao_fifo_depth  = 8191,
                .ao_range_table = &range_ni_M_628x_ao,
                .reg_type       = ni_reg_628x,
-               .ao_unipolar    = 1,
                .ao_speed       = 350,
                .num_p0_dio_channels = 8,
                .caldac         = { caldac_none },
                .ao_fifo_depth  = 8191,
                .ao_range_table = &range_ni_M_628x_ao,
                .reg_type       = ni_reg_628x,
-               .ao_unipolar    = 1,
                .ao_speed       = 350,
                .num_p0_dio_channels = 32,
                .caldac         = { caldac_none },