1. 17 4月, 2013 1 次提交
    • D
      Bluetooth: remove unneeded hci_conn_hold/put_device() · fc225c3f
      David Herrmann 提交于
      hci_conn_hold/put_device() is used to control when hci_conn->dev is no
      longer needed and can be deleted from the system. Lets first look how they
      are currently used throughout the code (excluding HIDP!).
      
      All code that uses hci_conn_hold_device() looks like this:
          ...
          hci_conn_hold_device();
          hci_conn_add_sysfs();
          ...
      On the other side, hci_conn_put_device() is exclusively used in
      hci_conn_del().
      
      So, considering that hci_conn_del() must not be called twice (which would
      fail horribly), we know that hci_conn_put_device() is only called _once_
      (which is in hci_conn_del()).
      On the other hand, hci_conn_add_sysfs() must not be called twice, either
      (it would call device_add twice, which breaks the device, see
      drivers/base/core.c). So we know that hci_conn_hold_device() is also
      called only once (it's only called directly before hci_conn_add_sysfs()).
      
      So hold and put are known to be called only once. That means we can safely
      remove them and directly call hci_conn_del_sysfs() in hci_conn_del().
      
      But there is one issue left: HIDP also uses hci_conn_hold/put_device().
      However, this case can be ignored and simply removed as it is totally
      broken. The issue is, the only thing HIDP delays with
      hci_conn_hold_device() is the removal of the hci_conn->dev from sysfs.
      But, the hci_conn device has no mechanism to get notified when its own
      parent (hci_dev) gets removed from sysfs. hci_dev_hold/put() does _not_
      control when it is removed but only when the device object is created
      and destroyed.
      And hci_dev calls hci_conn_flush_*() when it removes itself from sysfs,
      which itself causes hci_conn_del() to be called, but it does _not_ cause
      hci_conn_del_sysfs() to be called, which is wrong.
      
      Hence, we fix it to call hci_conn_del_sysfs() in hci_conn_del(). This
      guarantees that a hci_conn object is removed from sysfs _before_ its
      parent hci_dev is removed.
      
      The changes to HIDP look scary, wrong and broken. However, if you look at
      the HIDP session management, you will notice they're already broken in the
      exact _same_ way (ever tried "unplugging" HIDP devices? Breaks _all_ the
      time).
      So this patch only makes HIDP look _scary_ and _obviously broken_. It does
      not break HIDP itself, it already is!
      
      See later patches in this series which fix HIDP to use proper
      session-management.
      Signed-off-by: NDavid Herrmann <dh.herrmann@gmail.com>
      Acked-by: NMarcel Holtmann <marcel@holtmann.org>
      Signed-off-by: NGustavo Padovan <gustavo.padovan@collabora.co.uk>
      fc225c3f
  2. 12 4月, 2013 6 次提交
  3. 06 4月, 2013 2 次提交
  4. 05 4月, 2013 6 次提交
  5. 04 4月, 2013 3 次提交
    • A
      Bluetooth: Remove unneeded hci_req_cmd_status function · d4299ce6
      Andre Guedes 提交于
      This patch removes the hci_req_cmd_status function since it is not
      used anymore. The HCI request framework now considers the HCI command
      has complete once the Command Status or Command Complete Event is
      received.
      Signed-off-by: NAndre Guedes <andre.guedes@openbossa.org>
      Signed-off-by: NJohan Hedberg <johan.hedberg@intel.com>
      d4299ce6
    • A
      Bluetooth: Fix hci_inquiry ioctl usage · 3e13fa1e
      Andre Guedes 提交于
      Since the HCI request framework was properly fixed, the hci_req_sync
      call, in hci_inquiry, will return as soon as the HCI command completes
      (not the Inquiry procedure). However, in inquiry ioctl implementation,
      we want to sleep the user process until the inquiry procedure finishes.
      
      This patch changes hci_inquiry so, in case the HCI Inquiry command
      was executed successfully, it waits the HCI_INQUIRY flag to be cleared.
      This way, the user process will sleep until the inquiry procedure
      finishes.
      Signed-off-by: NAndre Guedes <andre.guedes@openbossa.org>
      Signed-off-by: NJohan Hedberg <johan.hedberg@intel.com>
      3e13fa1e
    • A
      Bluetooth: Fix HCI request framework · 33720450
      Andre Guedes 提交于
      Some HCI commands don't send a Command Complete Event once the HCI
      command has completed so they require some special handling from the
      HCI request framework. These HCI commands, however, send a Command
      Status Event to indicate that the command has been received, and
      that the controller is currently performing the task for the command.
      
      So, in order to properly handle those HCI commands, the HCI request
      framework should consider the HCI command has completed once the
      Command Status Event is received.
      
      This way, we fix some issues regarding the Inquiry command support,
      as well as add support for all those HCI commands which would require
      some special handling from the HCI request framework.
      Signed-off-by: NAndre Guedes <andre.guedes@openbossa.org>
      Signed-off-by: NJohan Hedberg <johan.hedberg@intel.com>
      33720450
  6. 21 3月, 2013 1 次提交
  7. 19 3月, 2013 21 次提交