Bluetooth: btusb: Handle out of order firmware loading complete event
authorMarcel Holtmann <marcel@holtmann.org>
Wed, 28 Jan 2015 09:58:40 +0000 (01:58 -0800)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 28 Jan 2015 20:26:21 +0000 (21:26 +0100)
commitce6bb9297c1bab350811d5003526704b9cd79c47
tree164b444d0f5f9b00e4667e1b4a726b3b1fc4a294
parentaa5b03456500b57ab30313affa822d4cd90e2ab2
Bluetooth: btusb: Handle out of order firmware loading complete event

When loading the Intel firmware it can happen that the firmware loading
complete vendor event arrives before the command complete event for the
last firmware fragment.

< HCI Command: Vendor (0x3f|0x0009) plen 7
        01 02 fc 03 00 00 00
> HCI Event: Vendor (0xff) plen 5
        06 00 00 00 00
> HCI Event: Command Complete (0x0e) plen 4
      Vendor (0x3f|0x0009) ncmd 31
        Status: Success (0x00)

This is mainly caused by the fact that the vendor command and its
command complete event are transported over the bulk endpoints. The
firmware loading complete event however is send over the interrupt
endpoint. So with just bad timing one event arrives before the other.

Currently the code does not account for it. There are precautions for
receiving firmware loading complete event quickly, but not for receiving
it before the command complete.

Introduce an extra flag that tracks when the firmware sending has
completed from the driver point of view and track the completion of
the firmware loading procedure with a different flag. That way the
wakeup can be handled properly.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
drivers/bluetooth/btusb.c