1. 28 8月, 2013 20 次提交
  2. 27 8月, 2013 7 次提交
  3. 26 8月, 2013 13 次提交
    • I
      staging: comedi: comedi_bond: use correct minor device numbers in name · 7322b320
      Ian Abbott 提交于
      The board name for "comedi_bond" is constructed from a space-separated
      list of items of the form "minor:subdevice" where "minor" is a minor
      device number and "subdevice" is a subdevice number.  Currently, all the
      "minor" device numbers are for the "comedi_bond" device itself and the
      "subdevice" numbers are for the bonded devices.  It makes makes more
      sense for the "minor" device numbers to come from the bonded devices as
      well so that the string is a list of bonded "minor:subdevice" pairs.
      Fix it.
      Signed-off-by: NIan Abbott <abbotti@mev.co.uk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7322b320
    • I
      staging: comedi: comedi_bond: use krealloc() and fix memory leak · a55de0f4
      Ian Abbott 提交于
      `do_dev_config()` is called from the comedi 'attach' handler,
      `bonding_attach()`.  The device private data structure contains a
      dynamically allocated array of pointers to "bonded" device structures
      which grows during the `do_dev_config()` call.  The length of this array
      is in `devpriv->ndevs`.  It currently uses a local function `realloc()`
      to allocate a new array, copy the old contents over and free the old
      array.  It should be more efficient to use `krealloc()` as it may be
      able to use slack space at the end of the previous array and avoid a
      copy.
      
      The old `realloc()` function always freed the old buffer which meant
      that if it failed to allocate the new buffer it would lose the contents
      of the old buffer.  Unfortunately, that contained pointers to more
      dynamically allocated memory, leading to a memory leak.  If `krealloc()`
      fails, keep the old buffer and avoid the memory leak.  The
      aforementioned pointers to more dynamically allocated memory will be
      cleaned up by the 'detach' handler, `bonding_detach()` which will be
      called by the comedi core as a consequence of `krealloc()` failing in
      `do_dev_config()`.
      Signed-off-by: NIan Abbott <abbotti@mev.co.uk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a55de0f4
    • I
      staging: comedi: comedi_bond: handle base channel for insn_bits · 0f3ce1a6
      Ian Abbott 提交于
      If a DIO subdevice has more than 32 channels, its 'insn_bits' handler is
      supposed to take account of the base channel from
      `CR_CHAN(insn->chanspec)`.  (The comedi core will adjust the base
      channel to 0 and shift the mask and data to compensate if the subdevice
      has less than or equal to 32 channels.)  The "comedi_bond" driver
      currently ignores the base channel and assumes it is 0.
      
      Replace `comedi_dio_bitfield()` in the "kcomedilib" module with
      `comedi_dio_bitfield2()` that takes account of the base channel, and
      rewrite the "comedi_bond" driver's 'insn_bits' handler
      (`bonding_dio_insn_bits()`) to take account of the base channel and use
      the new function.
      
      No other modules use `comedi_dio_bitfield()` so it is safe to replace it
      with `comedi_dio_bitfield2()`.  The name follows that of the equivalent
      function in the user-space comedilib.  If the base channel is non-zero
      and the subdevice has less than or equal to 32 channels it needs to
      adjust things in the same way as the comedi core (same as `parse_insn()`
      in "comedi_fops.c") due to most drivers ignoring the base channel.
      Signed-off-by: NIan Abbott <abbotti@mev.co.uk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      0f3ce1a6
    • I
      staging: comedi: comedi_bond: get INSN_CONFIG_DIO_QUERY info from horse's mouth · 16d2d3cb
      Ian Abbott 提交于
      The DIO subdevice of the "comedi_bond" device attempts to remember the
      directions of DIO channels itself in the `io_bits` member of the
      subdevice, but that is only large enough for the first 32 channels and
      it might not be accurate anyway as changing the direction of one channel
      may have affected a whole group of channels and we have no idea of the
      initial directions before the "bonded" device was linked to the the
      "comedi_bond" device.  It would be better to ask the bonded device for
      this information when handling a `INSN_CONFIG_DIO_QUERY` configuration
      instruction.  Add new function `comedi_dio_get_config()` to the
      "kcomedilib" module to allow us to get the DIO direction of a channel
      and use it.
      Signed-off-by: NIan Abbott <abbotti@mev.co.uk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      16d2d3cb
    • I
      staging: comedi: comedi_bond: just check devprivs->devs once on detach · 7b8cbe92
      Ian Abbott 提交于
      The `while` loop in `bonding_detach()` doesn't need to check
      `devpriv->devs` each time round the loop.  Move the test outside the
      loop.  The enclosing `if (devpriv)` can be changed to `if (devpriv &&
      devpriv->devs)` as everything in this `if` statement is associated with
      `devpriv->devs` anyway.
      Signed-off-by: NIan Abbott <abbotti@mev.co.uk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7b8cbe92
    • I
      staging: comedi: comedi_bond: no need to free dev->private on detach · c2af5b96
      Ian Abbott 提交于
      The comedi core will free `dev->private` if it is non-NULL after calling
      the "detach" handler (`bonding_detach()`), so don't bother freeing it in
      `bonding_detach()`.
      Signed-off-by: NIan Abbott <abbotti@mev.co.uk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      c2af5b96
    • I
      staging: comedi: comedi_bond: remove unused subdev_type · ad9f81f0
      Ian Abbott 提交于
      The `subdev_type` member of `struct bonded_device` is set but not used.
      Remove it.
      Signed-off-by: NIan Abbott <abbotti@mev.co.uk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      ad9f81f0
    • I
      staging: comedi: comedi_bond: don't map channels individually · 10b799d2
      Ian Abbott 提交于
      The private data structure (`struct comedi_bond_private`) for the
      overall "comedi_bond" device maps each channel individually to a pointer
      to the `struct bonded_device` it belongs to via array member
      `chan_id_dev_map[MAX_CHANS]`. This speeds up look-ups from channel
      number to bonded device a bit, but the length of the array used to look
      this up is currently fixed at `MAX_CHANS` (256) and there are no
      overflow checks when filling the array.
      
      In practice, there will only be a few bonded devices (actually bonded
      subdevices) and it is practical to just skip through the list until we
      reach the one containing the desired channel.
      
      The only place where the bonded device is looked up from the channel
      number is in `bonding_dio_insn_config()`.  Change it to do the look-up
      by skipping through the list of bonded devices and remove the
      `chan_id_dev_map[]` member.  The `chanid_offset` member of `struct
      bonded_device` is also no longer needed as the value can be derived
      while skipping through the list of bonded devices, so remove that member
      as well.
      Signed-off-by: NIan Abbott <abbotti@mev.co.uk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      10b799d2
    • I
      staging: comedi: comedi_bond: use bitmap to record opened/closed minors · f59ebeda
      Ian Abbott 提交于
      `do_dev_config()` currently records the comedi minor devices it has
      opened by setting `devs_opened[minor]` to the pointer returned by
      `comedi_open()`.  This is checked to avoid opening the same minor device
      twice.  The pointer values in `devs_opened[]` aren't needed; we only
      need to record which minor device numbers are being used.  Change
      `devs_opened` to a bitmap (declared with `DECLARE_BITMAP()`) of length
      `COMEDI_NUM_BOARD_MINORS` as the minor device numbers are range-checked
      to fit in a bitmap of this length.  Use `test_and_set_bit()` to record
      the minor device numbers we attempt to open with `comedi_open()`.
      
      `bonding_detach()` calls `comedi_close()` to close the comedi minor
      devices.  Since the minor device numbers may be repeated in its list of
      bonded subdevices, it currently uses a simple `unsigned long
      devs_closed` variable as a bitmap to keep track of which minor device
      numbers it has already closed to avoid closing them twice.  As a single
      `unsigned long` consists of less than `COMEDI_NUM_BOARD_MINORS` bits on
      a 32-bit machine, change `devs_closed to a bitmap of this length using
      `DECLARE_BITMAP()` and use `test_and_set_bit()` to avoid calling
      `comedi_close()` more than once for each minor device number in use.
      Signed-off-by: NIan Abbott <abbotti@mev.co.uk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f59ebeda
    • I
      staging: comedi: comedi_bond: change return value of bonding_attach() · 8fe73691
      Ian Abbott 提交于
      `bonding_attach()` is the comedi "attach" handler for the driver.  Any
      non-negative return value is treated as successful, but 0 is the
      preferred return value on success.
      Signed-off-by: NIan Abbott <abbotti@mev.co.uk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      8fe73691
    • I
      staging: comedi: comedi_bond: return error code in do_dev_config() · fcf26cff
      Ian Abbott 提交于
      Change `do_dev_config()` to return an error code on failure and 0 on
      success, instead of 0 on failure and 1 on success.
      Signed-off-by: NIan Abbott <abbotti@mev.co.uk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      fcf26cff
    • I
      staging: comedi: comedi_bond: no need to initialize file[] · a7e240a4
      Ian Abbott 提交于
      The `char file[]` variable in `do_dev_config()` doesn't need to be
      initialized as it gets overwritten with a `snprintf()`.  It just needs
      to be long enough.
      Signed-off-by: NIan Abbott <abbotti@mev.co.uk>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a7e240a4
    • I