Linux bluetooth development
 help / color / mirror / Atom feed
* Re: [PATCH BlueZ 2/2] android/hid: Initial implementation for uHID
From: Johan Hedberg @ 2013-11-01  7:44 UTC (permalink / raw)
  To: Luiz Augusto von Dentz; +Cc: linux-bluetooth
In-Reply-To: <1383235026-12247-2-git-send-email-luiz.dentz@gmail.com>

Hi Luiz/Ravi,

On Thu, Oct 31, 2013, Luiz Augusto von Dentz wrote:
> From: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
> 
> This patch reads data on interrupt channel and feeds into uHID.
> Kernel will take care rest of the things and connects bt mouse
> and keyboard:
> 
> [168988.557647] input: bluez-input-device as /devices/virtual/misc/uhid/input54
> ---
>  android/hid.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 125 insertions(+), 4 deletions(-)

After applying these two patches the tree stops compiling for me (even
after rerunning ./bootstrap-configure):

src/glib-helper.o: In function `bt_modalias':
/home/jh/src/bluez/src/glib-helper.c:42: multiple definition of `bt_modalias'
src/glib-helper.o:/home/jh/src/bluez/src/glib-helper.c:42: first defined here
src/glib-helper.o: In function `bt_uuid2string':
/home/jh/src/bluez/src/glib-helper.c:55: multiple definition of `bt_uuid2string'
src/glib-helper.o:/home/jh/src/bluez/src/glib-helper.c:55: first defined here
src/glib-helper.o: In function `bt_name2string':
/home/jh/src/bluez/src/glib-helper.c:172: multiple definition of `bt_name2string'
src/glib-helper.o:/home/jh/src/bluez/src/glib-helper.c:172: first defined here
src/glib-helper.o: In function `bt_string2uuid':
/home/jh/src/bluez/src/glib-helper.c:202: multiple definition of `bt_string2uuid'
src/glib-helper.o:/home/jh/src/bluez/src/glib-helper.c:202: first defined here
collect2: error: ld returned 1 exit status
make[1]: *** [android/bluetoothd] Error 1

Johan

^ permalink raw reply

* Re: Intel 7260 bluetooth malfunction when it is connected to EHCI bus
From: Hui Wang @ 2013-11-01  2:39 UTC (permalink / raw)
  To: Marcel Holtmann
  Cc: Tedd An, Johan Hedberg, xiong.y.zhang, Gustavo F. Padovan,
	linux-bluetooth@vger.kernel.org development, Kun Yang,
	Anthony Wong
In-Reply-To: <D0B840E3-36C4-4751-A757-1ADDAC0707B9@holtmann.org>

[-- Attachment #1: Type: text/plain, Size: 68519 bytes --]

On 10/31/2013 05:49 PM, Marcel Holtmann wrote:
> Hi Hui,
>
>>>>>> The problem is:
>>>>>> On the machine which has Intel 7260 BT module, i use it to connect a bluetooth headset,
>>>>>> it can successfully scan and connect to the headset, when i play sound to the bt headset,
>>>>>> the problem comes, if the bt module is connected to the XHCI, it can work very well.
>>>>>>
>>>>>> u@u-Lenovo-B4400:~$ lsusb -t
>>>>>> 1-7:1.0: No such file or directory
>>>>>> /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
>>>>>> /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/14p, 480M
>>>>>>     |__ Port 6: Dev 8, If 0, Class=HID, Driver=usbhid, 1.5M
>>>>>>     |__ Port 7: Dev 2, If 0, Class=vend., Driver=, 12M
>>>>>>     |__ Port 11: Dev 3, If 0, Class='bInterfaceClass 0xe0 not yet handled', Driver=btusb, 12M
>>>>>>     |__ Port 11: Dev 3, If 1, Class='bInterfaceClass 0xe0 not yet handled', Driver=btusb, 12M
>>>>>>
>>>>>> But if the bt module is connected to the EHCI, it always fails to play sound.
>>>>>>
>>>>>> u@u-Lenovo-B4400:~$ lsusb -t
>>>>>> /: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
>>>>>> /: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/14p, 480M
>>>>>> /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/3p, 480M
>>>>>>     |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/8p, 480M
>>>>>> /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/3p, 480M
>>>>>>     |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/6p, 480M
>>>>>>         |__ Port 5: Dev 3, If 0, Class='bInterfaceClass 0xe0 not yet handled', Driver=btusb, 12M
>>>>>>         |__ Port 5: Dev 3, If 1, Class='bInterfaceClass 0xe0 not yet handled', Driver=btusb, 12M
>>>>>>         |__ Port 6: Dev 4, If 0, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
>>>>>>         |__ Port 6: Dev 4, If 1, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
>>>>> can you paste /sys/kernel/debug/usb/devices here.
>>>>>
>>>>> If the uvcvideo driver is also using ISOC URBs, we might have just exhausted the bandwidth of the USB bus here or these two devices just do not play nice with each other.
>>>>>
>>>>> Try to unload the uvcvideo driver and try it again.
>>>> Thanks for your reply, follow your instruction, i totally disabled the camera from the BIOS, then the usb tree like this,
>>>> u@u-Lenovo-B4400:~$ lsusb -t
>>>> 1-1.3:1.0: No such file or directory
>>>> /:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
>>>> /:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/14p, 480M
>>>> /:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/3p, 480M
>>>>     |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/8p, 480M
>>>> /:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/3p, 480M
>>>>     |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/6p, 480M
>>>>         |__ Port 2: Dev 3, If 0, Class=HID, Driver=usbhid, 1.5M
>>>>         |__ Port 3: Dev 4, If 0, Class=vend., Driver=, 12M
>>>>         |__ Port 5: Dev 5, If 0, Class='bInterfaceClass 0xe0 not yet handled', Driver=btusb, 12M
>>>>         |__ Port 5: Dev 5, If 1, Class='bInterfaceClass 0xe0 not yet handled', Driver=btusb, 12M
>>>> u@u-Lenovo-B4400:~$ uname -a
>>>> Linux u-Lenovo-B4400 3.12.0-031200rc6-generic #201310191635 SMP Sat Oct 19 20:36:43 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
>>>>
>>>> I re-did the test, the result is same as before, after the headset is connected and i play audio, no sound is heard from the headset.
>>>> And hciconfig output shows still no SCO packets received by BT driver.
>>>> u@u-Lenovo-B4400:~$ hciconfig
>>>> hci0:    Type: BR/EDR  Bus: USB
>>>>     BD Address: 00:15:00:CC:2D:D2  ACL MTU: 1021:5  SCO MTU: 96:5
>>>>     UP RUNNING PSCAN
>>>>     RX bytes:5853 acl:61 sco:0 events:298 errors:0
>>>>     TX bytes:19212 acl:68 sco:1 commands:179 errors:0
>>> this is strange. The only reason I can think of is that you do not have the firmware installed and or it is not loaded correctly. Does dmesg give any indication that something failed here.
>> I can confirm the firmware file is the /lib/firmware/intel/ibt-hw-37.7.10-fw-1.80.2.3.d.bseq, and it is in the filesystem. And from the dmesg, the firmware was successfully loaded.
>>
>> [    8.600217] Bluetooth: hci0: Intel Bluetooth firmware file: intel/ibt-hw-37.7.10-fw-1.80.2.3.d.bseq
>> [    8.653635] kvm: disabled by bios
>> [    8.672981] psmouse serio1: synaptics: Touchpad model: 1, fw: 8.1, id: 0x1e2b1, caps: 0xd00123/0x840300/0x126c00
>> [    8.707034] input: SynPS/2 Synaptics TouchPad as /devices/platform/i8042/serio1/input/input13
>> [    8.717725] Registered led device: phy0-led
>> [    8.722730] ieee80211 phy0: Selected rate control algorithm 'iwl-mvm-rs'
>> [    8.752626] Bluetooth: hci0: Intel Bluetooth firmware patch completed and activated
>>
>>> Since this is a 3.12 kernel it should have native support for Intel specific setup routing. Any chance you can run btmon -w <file> before plugging the device into the bus. Maybe something goes wrong with the setup routine on EHCI.
>> Do you mean the hcidump file i just sent in my previous email.
> I do not get this. I specifically asked to run “btmon -w <file>” before plugging in the device. I want to see the early setup process here. What would I do with a hcidump trace.
Hi Marcel,

The attachment is the logfile generated by "btmon -w <file>". And the 
logfile was generated by below steps,

1) boot up the system into the ubuntu desktop
2) open a terminal and run "sudo btmon -w ~/lenovo-m4400s-btmon.log"
3) open bluetooth applet and click adding a new device, the bluetooth 
begin to scan devices
4) power up the bt headset
5) laptop bt module find the headset and connect it successfully
6) open the sound applet, choose bt headset as output device, play 
sound, but no sound can be heard from bt headset
7) Ctrl+C to terminate the "btmon -w <file>"

In case you can't receive the attachment, i decode the logfile and paste 
the content here.

Thanks,
Hui.

=================================================================================================
Bluetooth monitor ver 5.9
= New Index (BR/EDR,USB,hci0) [hci0] 0.218046
 > HCI Event (0x04) plen 10 [hci0] 2.886816
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         Class: 0x240404
           Major class: Audio/Video (headset, speaker, stereo, video, vcr)
           Minor class: 0x01
           Rendering (Printing, Speaker)
           Audio (Speaker, Microphone, Headset)
         Link type: ACL (0x01)
< HCI Command (0x01|0x0009) plen 7 [hci0] 2.887014
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         Role: Master (0x00)
 > HCI Event (0x0f) plen 4 [hci0] 2.887807
       Accept Connection Request (0x01|0x0009) ncmd 1
         Status: Success (0x00)
 > HCI Event (0x12) plen 8 [hci0] 3.028749
         Status: Success (0x00)
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         Role: Master (0x00)
 > HCI Event (0x03) plen 11 [hci0] 3.034733
         Status: Success (0x00)
         Handle: 256
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         Link type: ACL (0x01)
         Encryption: Disabled (0x00)
< HCI Command (0x01|0x001b) plen 2 [hci0] 3.034808
         Handle: 256
 > HCI Event (0x0f) plen 4 [hci0] 3.035730
       Read Remote Supported Features (0x01|0x001b) ncmd 1
         Status: Success (0x00)
 > HCI Event (0x1b) plen 3 [hci0] 3.041745
         Handle: 256
         Max slots: 5
 > HCI Event (0x0b) plen 11 [hci0] 3.043740
         Status: Success (0x00)
         Handle: 256
         Features: 0xbf 0xfe 0x8f 0xfe 0x9b 0xff 0x79 0x87
           3 slot packets
           5 slot packets
           Encryption
           Slot offset
           Timing accuracy
           Role switch
           Sniff mode
           Power control requests
           Channel quality driven data rate (CQDDR)
           SCO link
           HV2 packets
           HV3 packets
           u-law log synchronous data
           A-law log synchronous data
           CVSD synchronous data
           Paging parameter negotiation
           Power control
           Transparent synchronous data
           Broadcast Encryption
           Enhanced Data Rate ACL 2 Mbps mode
           Enhanced Data Rate ACL 3 Mbps mode
           Enhanced inquiry scan
           Interlaced inquiry scan
           Interlaced page scan
           RSSI with inquiry results
           Extended SCO link (EV3 packets)
           EV4 packets
           EV5 packets
           AFH capable slave
           AFH classification slave
           3-slot Enhanced Data Rate ACL packets
           5-slot Enhanced Data Rate ACL packets
           Sniff subrating
           Pause encryption
           AFH capable master
           AFH classification master
           Enhanced Data Rate eSCO 2 Mbps mode
           Enhanced Data Rate eSCO 3 Mbps mode
           3-slot Enhanced Data Rate eSCO packets
           Extended Inquiry Response
           Secure Simple Pairing
           Encapsulated PDU
           Erroneous Data Reporting
           Non-flushable Packet Boundary Flag
           Link Supervision Timeout Changed Event
           Inquiry TX Power Level
           Enhanced Power Control
           Extended features
< HCI Command (0x01|0x001c) plen 3 [hci0] 3.043755
         Handle: 256
         Page: 1
 > ACL Data RX flags 0x02 dlen 12 [hci0] 3.045734
       L2CAP: Connection Request (0x02) ident 2 len 4
         PSM: 1 (0x0001)
         Source CID: 65
 > HCI Event (0x0f) plen 4 [hci0] 3.045738
       Read Remote Extended Features (0x01|0x001c) ncmd 1
         Status: Success (0x00)
< ACL Data TX flags 0x00 dlen 16 [hci0] 3.045762
       L2CAP: Connection Response (0x03) ident 2 len 8
         Destination CID: 64
         Source CID: 65
         Result: Connection pending (0x0001)
         Status: No further information available (0x0000)
< ACL Data TX flags 0x00 dlen 10 [hci0] 3.045767
       L2CAP: Information Request (0x0a) ident 1 len 2
         Type: Extended features supported (0x0002)
 > HCI Event (0x23) plen 13 [hci0] 3.049734
         Status: Success (0x00)
         Handle: 256
         Page: 1/0
         Features: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
           Secure Simple Pairing (Host Support)
< HCI Command (0x01|0x0019) plen 10 [hci0] 3.049745
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         Page scan repetition mode: R2 (0x02)
         Page scan mode: Mandatory (0x00)
         Clock offset: 0x0000
 > HCI Event (0x0f) plen 4 [hci0] 3.050721
       Remote Name Request (0x01|0x0019) ncmd 1
         Status: Success (0x00)
 > HCI Event (0x13) plen 5 [hci0] 3.051735
         Num handles: 1
         Handle: 256
         Count: 1
 > HCI Event (0x13) plen 5 [hci0] 3.056726
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 16 [hci0] 3.056969
       L2CAP: Information Response (0x0b) ident 1 len 8
         Type: Extended features supported (0x0002)
         Result: Success (0x0000)
         Features: 0x00000200
           Unicast Connectionless Data Reception
< ACL Data TX flags 0x00 dlen 10 [hci0] 3.056995
       L2CAP: Command Reject (0x01) ident 1 len 2
         Reason: Command not understood (0x0000)
 > HCI Event (0x13) plen 5 [hci0] 3.061726
         Num handles: 1
         Handle: 256
         Count: 1
 > HCI Event (0x07) plen 255 [hci0] 3.070718
         Status: Success (0x00)
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         Name: HM1700
< ACL Data TX flags 0x00 dlen 16 [hci0] 7.047684
       L2CAP: Connection Response (0x03) ident 2 len 8
         Destination CID: 64
         Source CID: 65
         Result: Connection successful (0x0000)
         Status: No further information available (0x0000)
< ACL Data TX flags 0x00 dlen 12 [hci0] 7.047708
       L2CAP: Configure Request (0x04) ident 2 len 4
         Destination CID: 65
         Flags: 0x0000
 > HCI Event (0x13) plen 5 [hci0] 7.051758
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 16 [hci0] 7.052502
       L2CAP: Configure Request (0x04) ident 3 len 8
         Destination CID: 64
         Flags: 0x0000
         Option: Maximum Transmission Unit (0x01)
           MTU: 64
< ACL Data TX flags 0x00 dlen 18 [hci0] 7.052550
       L2CAP: Configure Response (0x05) ident 3 len 10
         Source CID: 65
         Flags: 0x0000
         Result: Success (0x0000)
         Option: Maximum Transmission Unit (0x01)
           MTU: 64
 > HCI Event (0x13) plen 5 [hci0] 7.052733
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 14 [hci0] 7.053751
       L2CAP: Configure Response (0x05) ident 2 len 6
         Source CID: 64
         Flags: 0x0000
         Result: Success (0x0000)
 > HCI Event (0x13) plen 5 [hci0] 7.056754
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 31 [hci0] 7.057249
       Channel: 64 len 27 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Request (0x06) tid 0 len 22
         Search pattern: [len 5]
           Sequence (6) with 3 bytes [8 extra bits] len 5
             UUID (3) with 2 bytes [0 extra bits] len 3
               Handsfree Audio Gateway (0x111f)
         Max record count: 48
         Attribute list: [len 14]
           Sequence (6) with 12 bytes [8 extra bits] len 14
             Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
               0x0001
             Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
               0x0004
             Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
               0x0009
             Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
               0x0311
         Continuation state: 0
< ACL Data TX flags 0x00 dlen 68 [hci0] 7.057567
       Channel: 65 len 64 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Response (0x07) tid 0 len 59
         Attribute bytes: 48
         Continuation state: 8
         5b 10 73 52 30 00 00 00 [.sR0...
 > ACL Data RX flags 0x02 dlen 39 [hci0] 7.063746
       Channel: 64 len 35 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Request (0x06) tid 1 len 30
         Search pattern: [len 5]
           Sequence (6) with 3 bytes [8 extra bits] len 5
             UUID (3) with 2 bytes [0 extra bits] len 3
               Handsfree Audio Gateway (0x111f)
         Max record count: 48
         Attribute list: [len 14]
           Sequence (6) with 12 bytes [8 extra bits] len 14
             Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
               0x0001
             Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
               0x0004
             Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
               0x0009
             Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
               0x0311
         Continuation state: 8
         5b 10 73 52 30 00 00 00 [.sR0...
< ACL Data TX flags 0x00 dlen 15 [hci0] 7.063938
       Channel: 65 len 11 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Response (0x07) tid 1 len 6
         Attribute bytes: 3
         Continuation state: 0
         Combined attribute bytes: 51
           Attribute list: [len 47] {position 0}
             Attribute: Service Class ID List (0x0001) [len 2]
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Handsfree Audio Gateway (0x111f)
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Generic Audio (0x1203)
             Attribute: Protocol Descriptor List (0x0004) [len 2]
               Sequence (6) with 3 bytes [8 extra bits] len 5
                 UUID (3) with 2 bytes [0 extra bits] len 3
                   L2CAP (0x0100)
               Sequence (6) with 5 bytes [8 extra bits] len 7
                 UUID (3) with 2 bytes [0 extra bits] len 3
                   RFCOMM (0x0003)
                 Unsigned Integer (1) with 1 byte [0 extra bits] len 2
                   0x0d
             Attribute: Bluetooth Profile Descriptor List (0x0009) [len 2]
               Sequence (6) with 6 bytes [8 extra bits] len 8
                 UUID (3) with 2 bytes [0 extra bits] len 3
                   Handsfree (0x111e)
                 Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
                   0x0105
             Attribute: Unknown (0x0311) [len 2]
               0x0000
 > HCI Event (0x13) plen 5 [hci0] 7.064747
         Num handles: 1
         Handle: 256
         Count: 1
 > HCI Event (0x13) plen 5 [hci0] 7.067749
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 12 [hci0] 7.068619
       L2CAP: Disconnection Request (0x06) ident 4 len 4
         Destination CID: 64
         Source CID: 65
< ACL Data TX flags 0x00 dlen 12 [hci0] 7.068674
       L2CAP: Disconnection Response (0x07) ident 4 len 4
         Destination CID: 64
         Source CID: 65
 > HCI Event (0x13) plen 5 [hci0] 7.072746
         Num handles: 1
         Handle: 256
         Count: 1
 > HCI Event (0x17) plen 6 [hci0] 7.074742
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
< HCI Command (0x01|0x000c) plen 6 [hci0] 7.074922
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
 > HCI Event (0x0e) plen 10 [hci0] 7.075743
       Link Key Request Negative Reply (0x01|0x000c) ncmd 1
         Status: Success (0x00)
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
 > HCI Event (0x32) plen 9 [hci0] 7.080726
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         IO capability: NoInputNoOutput (0x03)
         OOB data: Authentication data not present (0x00)
         Authentication: General Bonding - MITM required (0x05)
 > HCI Event (0x31) plen 6 [hci0] 7.081716
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
< HCI Command (0x01|0x002b) plen 9 [hci0] 7.081876
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         IO capability: DisplayYesNo (0x01)
         OOB data: Authentication data not present (0x00)
         Authentication: General Bonding - MITM required (0x05)
 > HCI Event (0x0e) plen 10 [hci0] 7.082712
       IO Capability Request Reply (0x01|0x002b) ncmd 1
         Status: Success (0x00)
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
 > HCI Event (0x33) plen 10 [hci0] 7.339625
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         Passkey: 575136
< HCI Command (0x01|0x002d) plen 6 [hci0] 7.339848
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
 > HCI Event (0x0e) plen 10 [hci0] 7.340647
       User Confirmation Request Neg Reply (0x01|0x002d) ncmd 1
         Status: Success (0x00)
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
 > HCI Event (0x36) plen 7 [hci0] 7.742431
         Status: Authentication Failure (0x05)
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
 > HCI Event (0x05) plen 4 [hci0] 7.897336
         Status: Success (0x00)
         Handle: 256
         Reason: Remote User Terminated Connection (0x13)
< HCI Command (0x01|0x0001) plen 5 [hci0] 16.279595
         Access code: 0x9e8b33 (General Inquiry)
         Length: 10.24s (0x08)
         Num responses: 0
 > HCI Event (0x0f) plen 4 [hci0] 16.281119
       Inquiry (0x01|0x0001) ncmd 2
         Status: Success (0x00)
 > HCI Event (0x2f) plen 255 [hci0] 17.025785
         Num responses: 1
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         Page scan repetition mode: R1 (0x01)
         Page period mode: P0 (0x00)
         Class: 0x240404
           Major class: Audio/Video (headset, speaker, stereo, video, vcr)
           Minor class: 0x01
           Rendering (Printing, Speaker)
           Audio (Speaker, Microphone, Headset)
         Clock offset: 0x51f1
         RSSI: -44 dBm (0xd4)
         Name (complete): HM1700
         16-bit Service UUIDs (complete): 5 entries
           Headset (0x1108)
           Handsfree (0x111e)
           Audio Sink (0x110b)
           A/V Remote Control (0x110e)
           Serial Port (0x1101)
< HCI Command (0x01|0x0002) plen 0 [hci0] 25.122354
 > HCI Event (0x0e) plen 4 [hci0] 25.124712
       Inquiry Cancel (0x01|0x0002) ncmd 2
         Status: Success (0x00)
< HCI Command (0x01|0x0005) plen 13 [hci0] 25.127063
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         Packet type: 0xcc18
         Page scan repetition mode: R2 (0x02)
         Page scan mode: Mandatory (0x00)
         Clock offset: 0x0000
         Role switch: Allow slave (0x01)
 > HCI Event (0x0f) plen 4 [hci0] 25.127693
       Create Connection (0x01|0x0005) ncmd 1
         Status: Success (0x00)
 > HCI Event (0x03) plen 11 [hci0] 25.988303
         Status: Success (0x00)
         Handle: 256
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         Link type: ACL (0x01)
         Encryption: Disabled (0x00)
< HCI Command (0x01|0x001b) plen 2 [hci0] 25.988535
         Handle: 256
 > HCI Event (0x0f) plen 4 [hci0] 25.990330
       Read Remote Supported Features (0x01|0x001b) ncmd 1
         Status: Success (0x00)
 > HCI Event (0x1b) plen 3 [hci0] 25.993260
         Handle: 256
         Max slots: 5
 > HCI Event (0x0b) plen 11 [hci0] 25.996270
         Status: Success (0x00)
         Handle: 256
         Features: 0xbf 0xfe 0x8f 0xfe 0x9b 0xff 0x79 0x87
           3 slot packets
           5 slot packets
           Encryption
           Slot offset
           Timing accuracy
           Role switch
           Sniff mode
           Power control requests
           Channel quality driven data rate (CQDDR)
           SCO link
           HV2 packets
           HV3 packets
           u-law log synchronous data
           A-law log synchronous data
           CVSD synchronous data
           Paging parameter negotiation
           Power control
           Transparent synchronous data
           Broadcast Encryption
           Enhanced Data Rate ACL 2 Mbps mode
           Enhanced Data Rate ACL 3 Mbps mode
           Enhanced inquiry scan
           Interlaced inquiry scan
           Interlaced page scan
           RSSI with inquiry results
           Extended SCO link (EV3 packets)
           EV4 packets
           EV5 packets
           AFH capable slave
           AFH classification slave
           3-slot Enhanced Data Rate ACL packets
           5-slot Enhanced Data Rate ACL packets
           Sniff subrating
           Pause encryption
           AFH capable master
           AFH classification master
           Enhanced Data Rate eSCO 2 Mbps mode
           Enhanced Data Rate eSCO 3 Mbps mode
           3-slot Enhanced Data Rate eSCO packets
           Extended Inquiry Response
           Secure Simple Pairing
           Encapsulated PDU
           Erroneous Data Reporting
           Non-flushable Packet Boundary Flag
           Link Supervision Timeout Changed Event
           Inquiry TX Power Level
           Enhanced Power Control
           Extended features
< HCI Command (0x01|0x001c) plen 3 [hci0] 25.996285
         Handle: 256
         Page: 1
 > HCI Event (0x0f) plen 4 [hci0] 25.997267
       Read Remote Extended Features (0x01|0x001c) ncmd 1
         Status: Success (0x00)
 > HCI Event (0x23) plen 13 [hci0] 26.005271
         Status: Success (0x00)
         Handle: 256
         Page: 1/0
         Features: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
           Secure Simple Pairing (Host Support)
< HCI Command (0x01|0x0019) plen 10 [hci0] 26.005292
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         Page scan repetition mode: R2 (0x02)
         Page scan mode: Mandatory (0x00)
         Clock offset: 0x0000
 > HCI Event (0x0f) plen 4 [hci0] 26.006256
       Remote Name Request (0x01|0x0019) ncmd 1
         Status: Success (0x00)
 > HCI Event (0x07) plen 255 [hci0] 26.025242
         Status: Success (0x00)
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         Name: HM1700
< HCI Command (0x01|0x0011) plen 2 [hci0] 26.025266
         Handle: 256
 > HCI Event (0x0f) plen 4 [hci0] 26.026243
       Authentication Requested (0x01|0x0011) ncmd 1
         Status: Success (0x00)
 > HCI Event (0x17) plen 6 [hci0] 26.027313
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
< HCI Command (0x01|0x000c) plen 6 [hci0] 26.033110
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
 > HCI Event (0x0e) plen 10 [hci0] 26.034256
       Link Key Request Negative Reply (0x01|0x000c) ncmd 1
         Status: Success (0x00)
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
 > HCI Event (0x31) plen 6 [hci0] 26.035237
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
< HCI Command (0x01|0x002b) plen 9 [hci0] 26.035287
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         IO capability: DisplayYesNo (0x01)
         OOB data: Authentication data not present (0x00)
         Authentication: Dedicated Bonding - MITM required (0x03)
 > HCI Event (0x0e) plen 10 [hci0] 26.036270
       IO Capability Request Reply (0x01|0x002b) ncmd 1
         Status: Success (0x00)
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
 > HCI Event (0x32) plen 9 [hci0] 26.040267
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         IO capability: NoInputNoOutput (0x03)
         OOB data: Authentication data not present (0x00)
         Authentication: Dedicated Bonding - MITM not required (0x02)
 > HCI Event (0x33) plen 10 [hci0] 26.280169
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         Passkey: 270951
< HCI Command (0x01|0x002c) plen 6 [hci0] 26.285610
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
 > HCI Event (0x0e) plen 10 [hci0] 26.287160
       User Confirmation Request Reply (0x01|0x002c) ncmd 1
         Status: Success (0x00)
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
 > HCI Event (0x36) plen 7 [hci0] 26.766879
         Status: Success (0x00)
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
 > HCI Event (0x18) plen 23 [hci0] 26.782938
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         Link key: de2eb68b175d2935833022b04c121ce2
         Key type: Unauthenticated Combination key (0x04)
 > HCI Event (0x06) plen 3 [hci0] 26.783870
         Status: Success (0x00)
         Handle: 256
< HCI Command (0x01|0x0013) plen 3 [hci0] 26.783942
         Handle: 256
         Encryption: Enabled (0x01)
 > HCI Event (0x0f) plen 4 [hci0] 26.784940
       Set Connection Encryption (0x01|0x0013) ncmd 1
         Status: Success (0x00)
 > HCI Event (0x08) plen 4 [hci0] 26.826850
         Status: Success (0x00)
         Handle: 256
         Encryption: Enabled with E0 (0x01)
< ACL Data TX flags 0x00 dlen 10 [hci0] 26.826893
       L2CAP: Information Request (0x0a) ident 1 len 2
         Type: Extended features supported (0x0002)
 > HCI Event (0x13) plen 5 [hci0] 26.830847
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 16 [hci0] 26.831344
       L2CAP: Information Response (0x0b) ident 1 len 8
         Type: Extended features supported (0x0002)
         Result: Success (0x0000)
         Features: 0x00000200
           Unicast Connectionless Data Reception
< ACL Data TX flags 0x00 dlen 10 [hci0] 26.831381
       L2CAP: Command Reject (0x01) ident 1 len 2
         Reason: Command not understood (0x0000)
 > HCI Event (0x13) plen 5 [hci0] 26.835845
         Num handles: 1
         Handle: 256
         Count: 1
< ACL Data TX flags 0x00 dlen 12 [hci0] 30.831706
       L2CAP: Connection Request (0x02) ident 2 len 4
         PSM: 1 (0x0001)
         Source CID: 64
 > HCI Event (0x13) plen 5 [hci0] 30.835877
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 16 [hci0] 30.836841
       L2CAP: Connection Response (0x03) ident 2 len 8
         Destination CID: 67
         Source CID: 64
         Result: Connection successful (0x0000)
         Status: No further information available (0x0000)
< ACL Data TX flags 0x00 dlen 12 [hci0] 30.836891
       L2CAP: Configure Request (0x04) ident 3 len 4
         Destination CID: 67
         Flags: 0x0000
 > ACL Data RX flags 0x02 dlen 16 [hci0] 30.838159
       L2CAP: Configure Request (0x04) ident 2 len 8
         Destination CID: 64
         Flags: 0x0000
         Option: Maximum Transmission Unit (0x01)
           MTU: 64
< ACL Data TX flags 0x00 dlen 18 [hci0] 30.838224
       L2CAP: Configure Response (0x05) ident 2 len 10
         Source CID: 67
         Flags: 0x0000
         Result: Success (0x0000)
         Option: Maximum Transmission Unit (0x01)
           MTU: 64
 > HCI Event (0x13) plen 5 [hci0] 30.840918
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 14 [hci0] 30.841845
       L2CAP: Configure Response (0x05) ident 3 len 6
         Source CID: 64
         Flags: 0x0000
         Result: Success (0x0000)
< ACL Data TX flags 0x00 dlen 24 [hci0] 30.842014
       Channel: 67 len 20 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Request (0x06) tid 0 len 15
         Search pattern: [len 5]
           Sequence (6) with 3 bytes [8 extra bits] len 5
             UUID (3) with 2 bytes [0 extra bits] len 3
               L2CAP (0x0100)
         Max record count: 65535
         Attribute list: [len 7]
           Sequence (6) with 5 bytes [8 extra bits] len 7
             Unsigned Integer (1) with 4 bytes [0 extra bits] len 5
               0x0000ffff
         Continuation state: 0
 > HCI Event (0x13) plen 5 [hci0] 30.842845
         Num handles: 1
         Handle: 256
         Count: 1
 > HCI Event (0x13) plen 5 [hci0] 30.845847
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 68 [hci0] 30.846904
       Channel: 64 len 64 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Response (0x07) tid 0 len 59
         Attribute bytes: 54
         Continuation state: 2
         00 36 .6
< ACL Data TX flags 0x00 dlen 26 [hci0] 30.847135
       Channel: 67 len 22 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Request (0x06) tid 1 len 17
         Search pattern: [len 5]
           Sequence (6) with 3 bytes [8 extra bits] len 5
             UUID (3) with 2 bytes [0 extra bits] len 3
               L2CAP (0x0100)
         Max record count: 65535
         Attribute list: [len 7]
           Sequence (6) with 5 bytes [8 extra bits] len 7
             Unsigned Integer (1) with 4 bytes [0 extra bits] len 5
               0x0000ffff
         Continuation state: 2
         00 36 .6
 > HCI Event (0x13) plen 5 [hci0] 30.850887
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 68 [hci0] 30.851837
       Channel: 64 len 64 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Response (0x07) tid 1 len 59
         Attribute bytes: 54
         Continuation state: 2
         00 6c .l
< ACL Data TX flags 0x00 dlen 26 [hci0] 30.851969
       Channel: 67 len 22 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Request (0x06) tid 2 len 17
         Search pattern: [len 5]
           Sequence (6) with 3 bytes [8 extra bits] len 5
             UUID (3) with 2 bytes [0 extra bits] len 3
               L2CAP (0x0100)
         Max record count: 65535
         Attribute list: [len 7]
           Sequence (6) with 5 bytes [8 extra bits] len 7
             Unsigned Integer (1) with 4 bytes [0 extra bits] len 5
               0x0000ffff
         Continuation state: 2
         00 6c .l
 > HCI Event (0x13) plen 5 [hci0] 30.855867
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 68 [hci0] 30.856899
       Channel: 64 len 64 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Response (0x07) tid 2 len 59
         Attribute bytes: 54
         Continuation state: 2
         00 a2 ..
< ACL Data TX flags 0x00 dlen 26 [hci0] 30.857114
       Channel: 67 len 22 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Request (0x06) tid 3 len 17
         Search pattern: [len 5]
           Sequence (6) with 3 bytes [8 extra bits] len 5
             UUID (3) with 2 bytes [0 extra bits] len 3
               L2CAP (0x0100)
         Max record count: 65535
         Attribute list: [len 7]
           Sequence (6) with 5 bytes [8 extra bits] len 7
             Unsigned Integer (1) with 4 bytes [0 extra bits] len 5
               0x0000ffff
         Continuation state: 2
         00 a2 ..
 > HCI Event (0x13) plen 5 [hci0] 30.860833
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 68 [hci0] 30.861829
       Channel: 64 len 64 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Response (0x07) tid 3 len 59
         Attribute bytes: 54
         Continuation state: 2
         00 d8 ..
< ACL Data TX flags 0x00 dlen 26 [hci0] 30.862014
       Channel: 67 len 22 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Request (0x06) tid 4 len 17
         Search pattern: [len 5]
           Sequence (6) with 3 bytes [8 extra bits] len 5
             UUID (3) with 2 bytes [0 extra bits] len 3
               L2CAP (0x0100)
         Max record count: 65535
         Attribute list: [len 7]
           Sequence (6) with 5 bytes [8 extra bits] len 7
             Unsigned Integer (1) with 4 bytes [0 extra bits] len 5
               0x0000ffff
         Continuation state: 2
         00 d8 ..
 > HCI Event (0x13) plen 5 [hci0] 30.865838
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 62 [hci0] 30.866859
       Channel: 64 len 58 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Response (0x07) tid 4 len 53
         Attribute bytes: 50
         Continuation state: 0
         Combined attribute bytes: 266
           Attribute list: [len 82] {position 0}
             Attribute: Service Record Handle (0x0000) [len 2]
               0x00010001
             Attribute: Service Class ID List (0x0001) [len 2]
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Headset (0x1108)
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Headset HS (0x1131)
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Generic Audio (0x1203)
             Attribute: Protocol Descriptor List (0x0004) [len 2]
               Sequence (6) with 3 bytes [8 extra bits] len 5
                 UUID (3) with 2 bytes [0 extra bits] len 3
                   L2CAP (0x0100)
               Sequence (6) with 5 bytes [8 extra bits] len 7
                 UUID (3) with 2 bytes [0 extra bits] len 3
                   RFCOMM (0x0003)
                 Unsigned Integer (1) with 1 byte [0 extra bits] len 2
                   0x01
             Attribute: Browse Group List (0x0005) [len 2]
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Public Browse Root (0x1002)
             Attribute: Bluetooth Profile Descriptor List (0x0009) [len 2]
               Sequence (6) with 6 bytes [8 extra bits] len 8
                 UUID (3) with 2 bytes [0 extra bits] len 3
                   Headset (0x1108)
                 Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
                   0x0102
             Attribute: Unknown (0x0100) [len 2]
               HSP service [len 12]
             Attribute: Unknown (0x0302) [len 2]
               true
           Attribute list: [len 80] {position 1}
             Attribute: Service Record Handle (0x0000) [len 2]
               0x00010002
             Attribute: Service Class ID List (0x0001) [len 2]
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Handsfree (0x111e)
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Generic Audio (0x1203)
             Attribute: Protocol Descriptor List (0x0004) [len 2]
               Sequence (6) with 3 bytes [8 extra bits] len 5
                 UUID (3) with 2 bytes [0 extra bits] len 3
                   L2CAP (0x0100)
               Sequence (6) with 5 bytes [8 extra bits] len 7
                 UUID (3) with 2 bytes [0 extra bits] len 3
                   RFCOMM (0x0003)
                 Unsigned Integer (1) with 1 byte [0 extra bits] len 2
                   0x02
             Attribute: Browse Group List (0x0005) [len 2]
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Public Browse Root (0x1002)
             Attribute: Bluetooth Profile Descriptor List (0x0009) [len 2]
               Sequence (6) with 6 bytes [8 extra bits] len 8
                 UUID (3) with 2 bytes [0 extra bits] len 3
                   Handsfree (0x111e)
                 Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
                   0x0105
             Attribute: Unknown (0x0100) [len 2]
               HFP service [len 12]
             Attribute: Unknown (0x0311) [len 2]
               0x001b
           Attribute list: [len 92] {position 2}
             Attribute: Service Record Handle (0x0000) [len 2]
               0x00010003
             Attribute: Service Class ID List (0x0001) [len 2]
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Audio Sink (0x110b)
             Attribute: Protocol Descriptor List (0x0004) [len 2]
               Sequence (6) with 6 bytes [8 extra bits] len 8
                 UUID (3) with 2 bytes [0 extra bits] len 3
                   L2CAP (0x0100)
                 Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
                   0x0019
               Sequence (6) with 6 bytes [8 extra bits] len 8
                 UUID (3) with 2 bytes [0 extra bits] len 3
                   AVDTP (0x0019)
                 Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
                   0x0102
             Attribute: Browse Group List (0x0005) [len 2]
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Public Browse Root (0x1002)
             Attribute: Bluetooth Profile Descriptor List (0x0009) [len 2]
               Sequence (6) with 6 bytes [8 extra bits] len 8
                 UUID (3) with 2 bytes [0 extra bits] len 3
                   Advanced Audio Distribution (0x110d)
                 Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
                   0x0102
             Attribute: Unknown (0x0100) [len 2]
               Advanced audio service [len 23]
             Attribute: Unknown (0x0311) [len 2]
               0x0001
< ACL Data TX flags 0x00 dlen 24 [hci0] 30.987030
       Channel: 67 len 20 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Request (0x06) tid 5 len 15
         Search pattern: [len 5]
           Sequence (6) with 3 bytes [8 extra bits] len 5
             UUID (3) with 2 bytes [0 extra bits] len 3
               PnP Information (0x1200)
         Max record count: 65535
         Attribute list: [len 7]
           Sequence (6) with 5 bytes [8 extra bits] len 7
             Unsigned Integer (1) with 4 bytes [0 extra bits] len 5
               0x0000ffff
         Continuation state: 0
 > HCI Event (0x13) plen 5 [hci0] 30.990839
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 67 [hci0] 30.991834
       Channel: 64 len 63 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Response (0x07) tid 5 len 58
         Attribute bytes: 53
         Continuation state: 2
         00 35 .5
< ACL Data TX flags 0x00 dlen 26 [hci0] 30.992052
       Channel: 67 len 22 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Request (0x06) tid 6 len 17
         Search pattern: [len 5]
           Sequence (6) with 3 bytes [8 extra bits] len 5
             UUID (3) with 2 bytes [0 extra bits] len 3
               PnP Information (0x1200)
         Max record count: 65535
         Attribute list: [len 7]
           Sequence (6) with 5 bytes [8 extra bits] len 7
             Unsigned Integer (1) with 4 bytes [0 extra bits] len 5
               0x0000ffff
         Continuation state: 2
         00 35 .5
 > HCI Event (0x13) plen 5 [hci0] 30.995811
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 29 [hci0] 30.996518
       Channel: 64 len 25 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Response (0x07) tid 6 len 20
         Attribute bytes: 17
         Continuation state: 0
         Combined attribute bytes: 70
           Attribute list: [len 65] {position 0}
             Attribute: Service Record Handle (0x0000) [len 2]
               0x00010000
             Attribute: Service Class ID List (0x0001) [len 2]
               UUID (3) with 2 bytes [0 extra bits] len 3
                 PnP Information (0x1200)
             Attribute: Browse Group List (0x0005) [len 2]
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Public Browse Root (0x1002)
             Attribute: Unknown (0x0200) [len 2]
               0x0103
             Attribute: Unknown (0x0201) [len 2]
               0x000f
             Attribute: Unknown (0x0202) [len 2]
               0x0000
             Attribute: Unknown (0x0203) [len 2]
               0x0000
             Attribute: Unknown (0x0204) [len 2]
               true
             Attribute: Unknown (0x0205) [len 2]
               0x0001
             Attribute: Unknown (0x8001) [len 2]
               0x0001
< ACL Data TX flags 0x00 dlen 24 [hci0] 31.099275
       Channel: 67 len 20 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Request (0x06) tid 7 len 15
         Search pattern: [len 5]
           Sequence (6) with 3 bytes [8 extra bits] len 5
             UUID (3) with 2 bytes [0 extra bits] len 3
               Handsfree (0x111e)
         Max record count: 65535
         Attribute list: [len 7]
           Sequence (6) with 5 bytes [8 extra bits] len 7
             Unsigned Integer (1) with 4 bytes [0 extra bits] len 5
               0x0000ffff
         Continuation state: 0
 > HCI Event (0x13) plen 5 [hci0] 31.101722
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 67 [hci0] 31.102965
       Channel: 64 len 63 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Response (0x07) tid 7 len 58
         Attribute bytes: 53
         Continuation state: 2
         00 35 .5
< ACL Data TX flags 0x00 dlen 26 [hci0] 31.103181
       Channel: 67 len 22 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Request (0x06) tid 8 len 17
         Search pattern: [len 5]
           Sequence (6) with 3 bytes [8 extra bits] len 5
             UUID (3) with 2 bytes [0 extra bits] len 3
               Handsfree (0x111e)
         Max record count: 65535
         Attribute list: [len 7]
           Sequence (6) with 5 bytes [8 extra bits] len 7
             Unsigned Integer (1) with 4 bytes [0 extra bits] len 5
               0x0000ffff
         Continuation state: 2
         00 35 .5
 > HCI Event (0x13) plen 5 [hci0] 31.106718
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 44 [hci0] 31.107962
       Channel: 64 len 40 [PSM 1 mode 0] {chan 0}
       SDP: Service Search Attribute Response (0x07) tid 8 len 35
         Attribute bytes: 32
         Continuation state: 0
         Combined attribute bytes: 85
           Attribute list: [len 80] {position 0}
             Attribute: Service Record Handle (0x0000) [len 2]
               0x00010002
             Attribute: Service Class ID List (0x0001) [len 2]
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Handsfree (0x111e)
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Generic Audio (0x1203)
             Attribute: Protocol Descriptor List (0x0004) [len 2]
               Sequence (6) with 3 bytes [8 extra bits] len 5
                 UUID (3) with 2 bytes [0 extra bits] len 3
                   L2CAP (0x0100)
               Sequence (6) with 5 bytes [8 extra bits] len 7
                 UUID (3) with 2 bytes [0 extra bits] len 3
                   RFCOMM (0x0003)
                 Unsigned Integer (1) with 1 byte [0 extra bits] len 2
                   0x02
             Attribute: Browse Group List (0x0005) [len 2]
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Public Browse Root (0x1002)
             Attribute: Bluetooth Profile Descriptor List (0x0009) [len 2]
               Sequence (6) with 6 bytes [8 extra bits] len 8
                 UUID (3) with 2 bytes [0 extra bits] len 3
                   Handsfree (0x111e)
                 Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
                   0x0105
             Attribute: Unknown (0x0100) [len 2]
               HFP service [len 12]
             Attribute: Unknown (0x0311) [len 2]
               0x001b
< ACL Data TX flags 0x00 dlen 12 [hci0] 31.108484
       L2CAP: Connection Request (0x02) ident 4 len 4
         PSM: 3 (0x0003)
         Source CID: 65
 > HCI Event (0x13) plen 5 [hci0] 31.111705
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 16 [hci0] 31.112953
       L2CAP: Connection Response (0x03) ident 4 len 8
         Destination CID: 68
         Source CID: 65
         Result: Connection successful (0x0000)
         Status: No further information available (0x0000)
< ACL Data TX flags 0x00 dlen 16 [hci0] 31.112979
       L2CAP: Configure Request (0x04) ident 5 len 8
         Destination CID: 68
         Flags: 0x0000
         Option: Maximum Transmission Unit (0x01)
           MTU: 1013
 > ACL Data RX flags 0x02 dlen 16 [hci0] 31.116703
       L2CAP: Configure Request (0x04) ident 3 len 8
         Destination CID: 65
         Flags: 0x0000
         Option: Maximum Transmission Unit (0x01)
           MTU: 1024
 > HCI Event (0x13) plen 5 [hci0] 31.116714
         Num handles: 1
         Handle: 256
         Count: 1
< ACL Data TX flags 0x00 dlen 18 [hci0] 31.116742
       L2CAP: Configure Response (0x05) ident 3 len 10
         Source CID: 68
         Flags: 0x0000
         Result: Success (0x0000)
         Option: Maximum Transmission Unit (0x01)
           MTU: 1024
 > ACL Data RX flags 0x02 dlen 14 [hci0] 31.117950
       L2CAP: Configure Response (0x05) ident 5 len 6
         Source CID: 65
         Flags: 0x0000
         Result: Success (0x0000)
< ACL Data TX flags 0x00 dlen 8 [hci0] 31.118046
       Channel: 68 len 4 [PSM 3 mode 0] {chan 1}
         03 3f 01 1c .?..
 > HCI Event (0x13) plen 5 [hci0] 31.120702
         Num handles: 1
         Handle: 256
         Count: 1
 > HCI Event (0x13) plen 5 [hci0] 31.121697
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 8 [hci0] 31.122697
       Channel: 65 len 4 [PSM 3 mode 0] {chan 1}
         03 73 01 d7 .s..
< ACL Data TX flags 0x00 dlen 18 [hci0] 31.122799
       Channel: 68 len 14 [PSM 3 mode 0] {chan 1}
         03 ef 15 83 11 04 f0 07 00 f0 03 00 07 70 .............p
 > HCI Event (0x13) plen 5 [hci0] 31.126699
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 18 [hci0] 31.127694
       Channel: 65 len 14 [PSM 3 mode 0] {chan 1}
         01 ef 15 81 11 04 e0 07 00 ff 00 00 07 aa ..............
< ACL Data TX flags 0x00 dlen 8 [hci0] 31.127795
       Channel: 68 len 4 [PSM 3 mode 0] {chan 1}
         13 3f 01 96 .?..
 > HCI Event (0x13) plen 5 [hci0] 31.131699
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 8 [hci0] 31.132691
       Channel: 65 len 4 [PSM 3 mode 0] {chan 1}
         13 73 01 5d .s.]
< ACL Data TX flags 0x00 dlen 12 [hci0] 31.132733
       Channel: 68 len 8 [PSM 3 mode 0] {chan 1}
         03 ef 09 e3 05 13 8d 70 .......p
 > ACL Data RX flags 0x02 dlen 12 [hci0] 31.134208
       L2CAP: Connection Request (0x02) ident 4 len 4
         PSM: 1 (0x0001)
         Source CID: 69
< ACL Data TX flags 0x00 dlen 16 [hci0] 31.134238
       L2CAP: Connection Response (0x03) ident 4 len 8
         Destination CID: 66
         Source CID: 69
         Result: Connection successful (0x0000)
         Status: No further information available (0x0000)
< ACL Data TX flags 0x00 dlen 12 [hci0] 31.134242
       L2CAP: Configure Request (0x04) ident 6 len 4
         Destination CID: 69
         Flags: 0x0000
 > HCI Event (0x13) plen 5 [hci0] 31.136698
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 12 [hci0] 31.137952
       Channel: 65 len 8 [PSM 3 mode 0] {chan 1}
         01 ef 09 e1 05 13 8d aa ........
 > HCI Event (0x13) plen 5 [hci0] 31.138724
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 12 [hci0] 31.139098
       Channel: 65 len 8 [PSM 3 mode 0] {chan 1}
         01 ef 09 e3 05 13 8d aa ........
< ACL Data TX flags 0x00 dlen 12 [hci0] 31.139163
       Channel: 68 len 8 [PSM 3 mode 0] {chan 1}
         03 ef 09 e1 05 13 8d 70 .......p
< ACL Data TX flags 0x00 dlen 9 [hci0] 31.139170
       Channel: 68 len 5 [PSM 3 mode 0] {chan 1}
         13 ff 01 21 79 ...!y
 > HCI Event (0x13) plen 5 [hci0] 31.139726
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 16 [hci0] 31.140473
       L2CAP: Configure Request (0x04) ident 5 len 8
         Destination CID: 66
         Flags: 0x0000
         Option: Maximum Transmission Unit (0x01)
           MTU: 64
< ACL Data TX flags 0x00 dlen 18 [hci0] 31.140505
       L2CAP: Configure Response (0x05) ident 5 len 10
         Source CID: 69
         Flags: 0x0000
         Result: Success (0x0000)
         Option: Maximum Transmission Unit (0x01)
           MTU: 64
 > ACL Data RX flags 0x02 dlen 14 [hci0] 31.141754
       L2CAP: Configure Response (0x05) ident 6 len 6
         Source CID: 66
         Flags: 0x0000
         Result: Success (0x0000)
 > HCI Event (0x13) plen 5 [hci0] 31.143762
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 20 [hci0] 31.144187
       Channel: 65 len 16 [PSM 3 mode 0] {chan 1}
         11 ff 17 09 41 54 2b 42 52 53 46 3d 32 37 0d a3 ....AT+BRSF=27..
< ACL Data TX flags 0x00 dlen 22 [hci0] 31.144324
       Channel: 68 len 18 [PSM 3 mode 0] {chan 1}
         13 ef 1d 0d 0a 2b 42 52 53 46 3a 20 33 35 32 0d  .....+BRSF: 352.
         0a 65 .e
< ACL Data TX flags 0x00 dlen 14 [hci0] 31.144332
       Channel: 68 len 10 [PSM 3 mode 0] {chan 1}
         13 ef 0d 0d 0a 4f 4b 0d 0a 65 .....OK..e
 > HCI Event (0x13) plen 5 [hci0] 31.144605
         Num handles: 1
         Handle: 256
         Count: 1
 > HCI Event (0x13) plen 5 [hci0] 31.145757
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 28 [hci0] 31.146503
       Channel: 66 len 24 [PSM 1 mode 0] {chan 2}
       SDP: Service Search Attribute Request (0x06) tid 0 len 19
         Search pattern: [len 5]
           Sequence (6) with 3 bytes [8 extra bits] len 5
             UUID (3) with 2 bytes [0 extra bits] len 3
               Handsfree Audio Gateway (0x111f)
         Max record count: 48
         Attribute list: [len 11]
           Sequence (6) with 9 bytes [8 extra bits] len 11
             Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
               0x0001
             Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
               0x0009
             Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
               0x0311
         Continuation state: 0
< ACL Data TX flags 0x00 dlen 46 [hci0] 31.146720
       Channel: 69 len 42 [PSM 1 mode 0] {chan 2}
       SDP: Service Search Attribute Response (0x07) tid 0 len 37
         Attribute bytes: 34
           Attribute list: [len 30] {position 0}
             Attribute: Service Class ID List (0x0001) [len 2]
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Handsfree Audio Gateway (0x111f)
               UUID (3) with 2 bytes [0 extra bits] len 3
                 Generic Audio (0x1203)
             Attribute: Bluetooth Profile Descriptor List (0x0009) [len 2]
               Sequence (6) with 6 bytes [8 extra bits] len 8
                 UUID (3) with 2 bytes [0 extra bits] len 3
                   Handsfree (0x111e)
                 Unsigned Integer (1) with 2 bytes [0 extra bits] len 3
                   0x0105
             Attribute: Unknown (0x0311) [len 2]
               0x0000
         Continuation state: 0
 > HCI Event (0x13) plen 5 [hci0] 31.148755
         Num handles: 1
         Handle: 256
         Count: 1
 > HCI Event (0x13) plen 5 [hci0] 31.149755
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 19 [hci0] 31.150250
       Channel: 65 len 15 [PSM 3 mode 0] {chan 1}
         11 ff 15 02 41 54 2b 43 49 4e 44 3d 3f 0d a3 ....AT+CIND=?..
< ACL Data TX flags 0x00 dlen 141 [hci0] 31.150438
       Channel: 68 len 137 [PSM 3 mode 0] {chan 1}
         13 ef 08 01 0d 0a 2b 43 49 4e 44 3a 20 28 22 62 ......+CIND: ("b
         61 74 74 63 68 67 22 2c 28 30 2d 35 29 29 2c 28 attchg",(0-5)),(
         22 73 69 67 6e 61 6c 22 2c 28 30 2d 35 29 29 2c "signal",(0-5)),
         28 22 73 65 72 76 69 63 65 22 2c 28 30 2c 31 29 ("service",(0,1)
         29 2c 28 22 63 61 6c 6c 22 2c 28 30 2c 31 29 29 ),("call",(0,1))
         2c 28 22 63 61 6c 6c 73 65 74 75 70 22 2c 28 30 ,("callsetup",(0
         2d 33 29 29 2c 28 22 63 61 6c 6c 68 65 6c 64 22 -3)),("callheld"
         2c 28 30 2d 32 29 29 2c 28 22 72 6f 61 6d 22 2c ,(0-2)),("roam",
         28 30 2c 31 29 29 0d 0a 65 (0,1))..e
< ACL Data TX flags 0x00 dlen 14 [hci0] 31.150448
       Channel: 68 len 10 [PSM 3 mode 0] {chan 1}
         13 ef 0d 0d 0a 4f 4b 0d 0a 65 .....OK..e
 > HCI Event (0x13) plen 5 [hci0] 31.150729
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 12 [hci0] 31.151699
       L2CAP: Disconnection Request (0x06) ident 6 len 4
         Destination CID: 66
         Source CID: 69
< ACL Data TX flags 0x00 dlen 12 [hci0] 31.151732
       L2CAP: Disconnection Response (0x07) ident 6 len 4
         Destination CID: 66
         Source CID: 69
 > HCI Event (0x13) plen 5 [hci0] 31.155700
         Num handles: 1
         Handle: 256
         Count: 1
 > HCI Event (0x13) plen 5 [hci0] 31.156717
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 18 [hci0] 31.157715
       Channel: 65 len 14 [PSM 3 mode 0] {chan 1}
         11 ff 13 02 41 54 2b 43 49 4e 44 3f 0d a3 ....AT+CIND?..
< ACL Data TX flags 0x00 dlen 32 [hci0] 31.157811
       Channel: 68 len 28 [PSM 3 mode 0] {chan 1}
         13 ef 31 0d 0a 2b 43 49 4e 44 3a 20 35 2c 35 2c  ..1..+CIND: 5,5,
         31 2c 30 2c 30 2c 30 2c 30 0d 0a 65 1,0,0,0,0..e
< ACL Data TX flags 0x00 dlen 14 [hci0] 31.157820
       Channel: 68 len 10 [PSM 3 mode 0] {chan 1}
         13 ef 0d 0d 0a 4f 4b 0d 0a 65 .....OK..e
 > HCI Event (0x13) plen 5 [hci0] 31.158716
         Num handles: 1
         Handle: 256
         Count: 1
 > HCI Event (0x13) plen 5 [hci0] 31.162700
         Num handles: 1
         Handle: 256
         Count: 1
 > HCI Event (0x13) plen 5 [hci0] 31.166681
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 25 [hci0] 31.167709
       Channel: 65 len 21 [PSM 3 mode 0] {chan 1}
         11 ff 21 02 41 54 2b 43 4d 45 52 3d 33 2c 30 2c ..!.AT+CMER=3,0,
         30 2c 31 0d a3 0,1..
< ACL Data TX flags 0x00 dlen 14 [hci0] 31.167854
       Channel: 68 len 10 [PSM 3 mode 0] {chan 1}
         13 ef 0d 0d 0a 4f 4b 0d 0a 65 .....OK..e
 > HCI Event (0x13) plen 5 [hci0] 31.171687
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 19 [hci0] 31.197692
       Channel: 65 len 15 [PSM 3 mode 0] {chan 1}
         11 ff 15 01 41 54 2b 43 43 57 41 3d 31 0d a3 ....AT+CCWA=1..
< ACL Data TX flags 0x00 dlen 14 [hci0] 31.197863
       Channel: 68 len 10 [PSM 3 mode 0] {chan 1}
         13 ef 0d 0d 0a 4f 4b 0d 0a 65 .....OK..e
 > HCI Event (0x13) plen 5 [hci0] 31.201671
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 31 [hci0] 31.203939
       Channel: 65 len 27 [PSM 3 mode 0] {chan 1}
         11 ff 2d 01 41 54 2b 42 49 41 3d 30 2c 30 2c 31 ..-.AT+BIA=0,0,1
         2c 31 2c 31 2c 31 2c 30 2c 0d a3 ,1,1,1,0,..
< ACL Data TX flags 0x00 dlen 17 [hci0] 31.204263
       Channel: 68 len 13 [PSM 3 mode 0] {chan 1}
         13 ef 13 0d 0a 45 52 52 4f 52 0d 0a 65 .....ERROR..e
 > HCI Event (0x13) plen 5 [hci0] 31.208729
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 20 [hci0] 31.208907
       Channel: 65 len 16 [PSM 3 mode 0] {chan 1}
         11 ff 17 01 41 54 2b 43 42 43 3d 31 30 30 0d a3 ....AT+CBC=100..
< ACL Data TX flags 0x00 dlen 17 [hci0] 31.209194
       Channel: 68 len 13 [PSM 3 mode 0] {chan 1}
         13 ef 13 0d 0a 45 52 52 4f 52 0d 0a 65 .....ERROR..e
 > HCI Event (0x13) plen 5 [hci0] 31.213727
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 19 [hci0] 31.213935
       Channel: 65 len 15 [PSM 3 mode 0] {chan 1}
         11 ff 15 01 41 54 2b 56 47 53 3d 31 35 0d a3 ....AT+VGS=15..
< ACL Data TX flags 0x00 dlen 14 [hci0] 31.214182
       Channel: 68 len 10 [PSM 3 mode 0] {chan 1}
         13 ef 0d 0d 0a 4f 4b 0d 0a 65 .....OK..e
 > HCI Event (0x13) plen 5 [hci0] 31.218699
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 21 [hci0] 31.218903
       Channel: 65 len 17 [PSM 3 mode 0] {chan 1}
         11 ff 19 01 41 54 2b 43 4f 50 53 3d 33 2c 30 0d ....AT+COPS=3,0.
         a3 .
< ACL Data TX flags 0x00 dlen 14 [hci0] 31.219151
       Channel: 68 len 10 [PSM 3 mode 0] {chan 1}
         13 ef 0d 0d 0a 4f 4b 0d 0a 65 .....OK..e
 > HCI Event (0x13) plen 5 [hci0] 31.223655
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 19 [hci0] 31.223901
       Channel: 65 len 15 [PSM 3 mode 0] {chan 1}
         11 ff 15 01 41 54 2b 43 4d 45 45 3d 31 0d a3 ....AT+CMEE=1..
< ACL Data TX flags 0x00 dlen 14 [hci0] 31.224044
       Channel: 68 len 10 [PSM 3 mode 0] {chan 1}
         13 ef 0d 0d 0a 4f 4b 0d 0a 65 .....OK..e
 > HCI Event (0x13) plen 5 [hci0] 31.229657
         Num handles: 1
         Handle: 256
         Count: 1
< ACL Data TX flags 0x00 dlen 12 [hci0] 32.913824
       L2CAP: Disconnection Request (0x06) ident 7 len 4
         Destination CID: 67
         Source CID: 64
< ACL Data TX flags 0x00 dlen 12 [hci0] 32.913967
       L2CAP: Connection Request (0x02) ident 8 len 4
         PSM: 25 (0x0019)
         Source CID: 66
 > HCI Event (0x13) plen 5 [hci0] 32.917809
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 12 [hci0] 32.918175
       L2CAP: Disconnection Response (0x07) ident 7 len 4
         Destination CID: 67
         Source CID: 64
 > HCI Event (0x13) plen 5 [hci0] 32.918799
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 16 [hci0] 32.919548
       L2CAP: Connection Response (0x03) ident 8 len 8
         Destination CID: 70
         Source CID: 66
         Result: Connection successful (0x0000)
         Status: No further information available (0x0000)
< ACL Data TX flags 0x00 dlen 12 [hci0] 32.919590
       L2CAP: Configure Request (0x04) ident 9 len 4
         Destination CID: 70
         Flags: 0x0000
 > ACL Data RX flags 0x02 dlen 16 [hci0] 32.920800
       L2CAP: Configure Request (0x04) ident 7 len 8
         Destination CID: 66
         Flags: 0x0000
         Option: Maximum Transmission Unit (0x01)
           MTU: 672
< ACL Data TX flags 0x00 dlen 18 [hci0] 32.920846
       L2CAP: Configure Response (0x05) ident 7 len 10
         Source CID: 70
         Flags: 0x0000
         Result: Success (0x0000)
         Option: Maximum Transmission Unit (0x01)
           MTU: 672
 > HCI Event (0x13) plen 5 [hci0] 32.923795
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 14 [hci0] 32.924545
       L2CAP: Configure Response (0x05) ident 9 len 6
         Source CID: 66
         Flags: 0x0000
         Result: Success (0x0000)
< ACL Data TX flags 0x00 dlen 6 [hci0] 32.924675
       Channel: 70 len 2 [PSM 25 mode 0] {chan 2}
         00 01 ..
 > HCI Event (0x13) plen 5 [hci0] 32.924798
         Num handles: 1
         Handle: 256
         Count: 1
 > HCI Event (0x13) plen 5 [hci0] 32.928796
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 8 [hci0] 32.929291
       Channel: 66 len 4 [PSM 25 mode 0] {chan 2}
         02 01 04 08 ....
< ACL Data TX flags 0x00 dlen 7 [hci0] 32.929397
       Channel: 70 len 3 [PSM 25 mode 0] {chan 2}
         10 02 04 ...
 > HCI Event (0x13) plen 5 [hci0] 32.933791
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 16 [hci0] 32.934578
       Channel: 66 len 12 [PSM 25 mode 0] {chan 2}
         12 02 01 00 07 06 00 00 ff ff 02 59 ...........Y
< ACL Data TX flags 0x00 dlen 18 [hci0] 32.934704
       Channel: 70 len 14 [PSM 25 mode 0] {chan 2}
         20 03 04 04 01 00 07 06 00 00 21 15 02 35 .........!..5
 > HCI Event (0x13) plen 5 [hci0] 32.938861
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 6 [hci0] 32.939354
       Channel: 66 len 2 [PSM 25 mode 0] {chan 2}
         22 03 ".
< ACL Data TX flags 0x00 dlen 7 [hci0] 32.939468
       Channel: 70 len 3 [PSM 25 mode 0] {chan 2}
         30 06 04 0..
 > HCI Event (0x13) plen 5 [hci0] 32.943806
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 6 [hci0] 32.944301
       Channel: 66 len 2 [PSM 25 mode 0] {chan 2}
         32 06 2.
< ACL Data TX flags 0x00 dlen 12 [hci0] 32.944424
       L2CAP: Connection Request (0x02) ident 10 len 4
         PSM: 25 (0x0019)
         Source CID: 64
 > HCI Event (0x13) plen 5 [hci0] 32.948804
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 16 [hci0] 32.949551
       L2CAP: Connection Response (0x03) ident 10 len 8
         Destination CID: 71
         Source CID: 64
         Result: Connection successful (0x0000)
         Status: No further information available (0x0000)
< ACL Data TX flags 0x00 dlen 12 [hci0] 32.949582
       L2CAP: Configure Request (0x04) ident 11 len 4
         Destination CID: 71
         Flags: 0x0000
 > ACL Data RX flags 0x02 dlen 20 [hci0] 32.950571
       L2CAP: Configure Request (0x04) ident 8 len 12
         Destination CID: 64
         Flags: 0x0000
         Option: Maximum Transmission Unit (0x01)
           MTU: 1008
         Option: Flush Timeout (0x02)
           Flush timeout: 200
< ACL Data TX flags 0x00 dlen 18 [hci0] 32.950597
       L2CAP: Configure Response (0x05) ident 8 len 10
         Source CID: 71
         Flags: 0x0000
         Result: Success (0x0000)
         Option: Maximum Transmission Unit (0x01)
           MTU: 1008
 > HCI Event (0x13) plen 5 [hci0] 32.953824
         Num handles: 1
         Handle: 256
         Count: 1
 > ACL Data RX flags 0x02 dlen 14 [hci0] 32.954566
       L2CAP: Configure Response (0x05) ident 11 len 6
         Source CID: 64
         Flags: 0x0000
         Result: Success (0x0000)
 > HCI Event (0x13) plen 5 [hci0] 32.954798
         Num handles: 1
         Handle: 256
         Count: 1
< HCI Command (0x01|0x0028) plen 17 [hci0] 32.964171
         Handle: 256
         Transmit bandwidth: 8000
         Receive bandwidth: 8000
         Max latency: 65535
         Setting: 0x0060
         Retransmission effort: Don't care (0xff)
         Packet type: 0x003f
 > HCI Event (0x0f) plen 4 [hci0] 32.965775
       Setup Synchronous Connection (0x01|0x0028) ncmd 1
         Status: Success (0x00)
 > HCI Event (0x1b) plen 3 [hci0] 32.969774
         Handle: 256
         Max slots: 1
 > HCI Event (0x2c) plen 17 [hci0] 32.986795
         Status: Success (0x00)
         Handle: 257
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         Link type: eSCO (0x02)
         Transmission interval: 0x0c
         Retransmission window: 0x02
         RX packet length: 60
         TX packet length: 60
         Air mode: CVSD (0x02)
< ACL Data TX flags 0x00 dlen 19 [hci0] 32.987649
       Channel: 68 len 15 [PSM 3 mode 0] {chan 1}
         13 ef 17 0d 0a 2b 56 47 53 3d 31 35 0d 0a 65 .....+VGS=15..e
< ACL Data TX flags 0x00 dlen 19 [hci0] 32.987662
       Channel: 68 len 15 [PSM 3 mode 0] {chan 1}
         13 ef 17 0d 0a 2b 56 47 4d 3d 31 35 0d 0a 65 .....+VGM=15..e
 > HCI Event (0x1b) plen 3 [hci0] 32.991768
         Handle: 256
         Max slots: 5
 > HCI Event (0x13) plen 5 [hci0] 32.992762
         Num handles: 1
         Handle: 256
         Count: 1
< SCO Data TX flags 0x00 dlen 48 [hci0] 32.993934
 > HCI Event (0x13) plen 5 [hci0] 32.995762
         Num handles: 1
         Handle: 256
         Count: 1
 > HCI Event (0x14) plen 6 [hci0] 37.801432
         Status: Success (0x00)
         Handle: 256
         Mode: Sniff (0x02)
         Interval: 247.500 msec (0x018c)
< HCI Command (0x01|0x0006) plen 3 [hci0] 38.011637
         Handle: 257
         Reason: Remote User Terminated Connection (0x13)
 > HCI Event (0x0f) plen 4 [hci0] 38.012251
       Disconnect (0x01|0x0006) ncmd 1
         Status: Success (0x00)
 > HCI Event (0x05) plen 4 [hci0] 38.051233
         Status: Success (0x00)
         Handle: 257
         Reason: Connection Terminated By Local Host (0x16)
 > HCI Event (0x14) plen 6 [hci0] 38.057234
         Status: Success (0x00)
         Handle: 256
         Mode: Active (0x00)
         Interval: 0.000 msec (0x0000)
 > HCI Event (0x14) plen 6 [hci0] 42.803863
         Status: Success (0x00)
         Handle: 256
         Mode: Sniff (0x02)
         Interval: 500.000 msec (0x0320)
< HCI Command (0x02|0x0004) plen 2 [hci0] 42.927906
         Handle: 256
 > HCI Event (0x0f) plen 4 [hci0] 42.928836
       Exit Sniff Mode (0x02|0x0004) ncmd 1
         Status: Success (0x00)
 > HCI Event (0x14) plen 6 [hci0] 43.264703
         Status: Success (0x00)
         Handle: 256
         Mode: Active (0x00)
         Interval: 0.000 msec (0x0000)
< HCI Command (0x01|0x0028) plen 17 [hci0] 43.264779
         Handle: 256
         Transmit bandwidth: 8000
         Receive bandwidth: 8000
         Max latency: 65535
         Setting: 0x0060
         Retransmission effort: Don't care (0xff)
         Packet type: 0x003f
 > HCI Event (0x0f) plen 4 [hci0] 43.265703
       Setup Synchronous Connection (0x01|0x0028) ncmd 1
         Status: Success (0x00)
 > HCI Event (0x1b) plen 3 [hci0] 43.271679
         Handle: 256
         Max slots: 1
 > HCI Event (0x2c) plen 17 [hci0] 43.290665
         Status: Success (0x00)
         Handle: 257
         Address: 78:F7:BE:08:5E:DF (OUI 78-F7-BE)
         Link type: eSCO (0x02)
         Transmission interval: 0x0c
         Retransmission window: 0x02
         RX packet length: 60
         TX packet length: 60
         Air mode: CVSD (0x02)
< ACL Data TX flags 0x00 dlen 19 [hci0] 43.291490
       Channel: 68 len 15 [PSM 3 mode 0] {chan 1}
         13 ef 17 0d 0a 2b 56 47 53 3d 31 35 0d 0a 65 .....+VGS=15..e
< ACL Data TX flags 0x00 dlen 19 [hci0] 43.291512
       Channel: 68 len 15 [PSM 3 mode 0] {chan 1}
         13 ef 17 0d 0a 2b 56 47 4d 3d 31 35 0d 0a 65 .....+VGM=15..e
< SCO Data TX flags 0x00 dlen 48 [hci0] 43.295627
< SCO Data TX flags 0x00 dlen 48 [hci0] 43.295850
 > HCI Event (0x1b) plen 3 [hci0] 43.296621
         Handle: 256
         Max slots: 5
 > HCI Event (0x13) plen 5 [hci0] 43.297623
         Num handles: 1
         Handle: 256
         Count: 1
 > HCI Event (0x13) plen 5 [hci0] 43.298627
         Num handles: 1
         Handle: 256
         Count: 1
 > HCI Event (0x14) plen 6 [hci0] 47.786446
         Status: Success (0x00)
         Handle: 256
         Mode: Sniff (0x02)
         Interval: 247.500 msec (0x018c)
< HCI Command (0x01|0x0006) plen 3 [hci0] 49.907615
         Handle: 257
         Reason: Remote User Terminated Connection (0x13)
 > HCI Event (0x0f) plen 4 [hci0] 49.908340
       Disconnect (0x01|0x0006) ncmd 1
         Status: Success (0x00)
 > HCI Event (0x05) plen 4 [hci0] 50.015272
         Status: Success (0x00)
         Handle: 257
         Reason: Connection Terminated By Local Host (0x16)
 > HCI Event (0x14) plen 6 [hci0] 50.021320
         Status: Success (0x00)
         Handle: 256
         Mode: Active (0x00)
         Interval: 0.000 msec (0x0000)
 > HCI Event (0x14) plen 6 [hci0] 54.795921
         Status: Success (0x00)
         Handle: 256
         Mode: Sniff (0x02)
         Interval: 500.000 msec (0x0320)
>
> Regards
>
> Marcel
>
>
>


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: lenovo-m4400s-btmon.log --]
[-- Type: text/x-log; name="lenovo-m4400s-btmon.log", Size: 11795 bytes --]

btsnoop\0\0\0\0\x01\0\0\aÑ\0\0\0\x10\0\0\0\x10\0\0\0\0\0\0\0\0\0áÇÇK\x18¾\0\x01]Z\x06ý‹\fhci0\0\0\0\0\0\0\0\f\0\0\0\f\0\0\0\x03\0\0\0\0\0áÇÇKAI \x04
ß^\b¾÷x\x04\x04$\x01\0\0\0
\0\0\0
\0\0\0\x02\0\0\0\0\0áÇÇKAJf	\x04\aß^\b¾÷x\0\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇKAM\x7f\x0f\x04\0\x01	\x04\0\0\0
\0\0\0
\0\0\0\x03\0\0\0\0\0áÇÇKCt\r\x12\b\0ß^\b¾÷x\0\0\0\0\r\0\0\0\r\0\0\0\x03\0\0\0\0\0áÇÇKC‹m\x03\v\0\0\x01ß^\b¾÷x\x01\0\0\0\0\x05\0\0\0\x05\0\0\0\x02\0\0\0\0\0áÇÇKC‹¸^[\x04\x02\0\x01\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇKCR\x0f\x04\0\x01^[\x04\0\0\0\x05\0\0\0\x05\0\0\0\x03\0\0\0\0\0áÇÇKC¦Ñ^[\x03\0\x01\x05\0\0\0\r\0\0\0\r\0\0\0\x03\0\0\0\0\0áÇÇKC®œ\v\v\0\0\x01¿þþ›ÿy‡\0\0\0\x06\0\0\0\x06\0\0\0\x02\0\0\0\0\0áÇÇKC®«\x1c\x04\x03\0\x01\x01\0\0\0\x10\0\0\0\x10\0\0\0\x05\0\0\0\0\0áÇÇKC¶f\0!\f\0\b\0\x01\0\x02\x02\x04\0\x01\0A\0\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇKC¶j\x0f\x04\0\x01\x1c\x04\0\0\0\x14\0\0\0\x14\0\0\0\x04\0\0\0\0\0áÇÇKC¶‚\0\x01\x10\0\f\0\x01\0\x03\x02\b\0@\0A\0\x01\0\0\0\0\0\0\x0e\0\0\0\x0e\0\0\0\x04\0\0\0\0\0áÇÇKC¶‡\0\x01
\0\x06\0\x01\0
\x01\x02\0\x02\0\0\0\0\x0f\0\0\0\x0f\0\0\0\x03\0\0\0\0\0áÇÇKCÆ\x06#\r\0\0\x01\x01\0\x01\0\0\0\0\0\0\0\0\0\0\r\0\0\0\r\0\0\0\x02\0\0\0\0\0áÇÇKCÆ\x11\x19\x04
ß^\b¾÷x\x02\0\0\0\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇKCÉá\x0f\x04\0\x01\x19\x04\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇKCÍ×\x13\x05\x01\0\x01\x01\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇKCáV\x13\x05\x01\0\x01\x01\0\0\0\0\x14\0\0\0\x14\0\0\0\x05\0\0\0\0\0áÇÇKCâI\0!\x10\0\f\0\x01\0\v\x01\b\0\x02\0\0\0\0\x02\0\0\0\0\0\x0e\0\0\0\x0e\0\0\0\x04\0\0\0\0\0áÇÇKCâc\0\x01
\0\x06\0\x01\0\x01\x01\x02\0\0\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇKCôÞ\x13\x05\x01\0\x01\x01\0\0\0\x01\x01\0\0\x01\x01\0\0\0\x03\0\0\0\0\0áÇÇKD\x17þ\aÿ\0ß^\b¾÷xHM1700\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x14\0\0\0\x14\0\0\0\x04\0\0\0\0\0áÇÇK€Ç\x04\0\x01\x10\0\f\0\x01\0\x03\x02\b\0@\0A\0\0\0\0\0\0\0\0\x10\0\0\0\x10\0\0\0\x04\0\0\0\0\0áÇÇK€Ç\x1c\0\x01\f\0\b\0\x01\0\x04\x02\x04\0A\0\0\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇK€Öî\x13\x05\x01\0\x01\x01\0\0\0\0\x14\0\0\0\x14\0\0\0\x05\0\0\0\0\0áÇÇK€ÙÖ\0!\x10\0\f\0\x01\0\x04\x03\b\0@\0\0\0\x01\x02@\0\0\0\0\x16\0\0\0\x16\0\0\0\x04\0\0\0\0\0áÇÇK€Ú\x06\0\x01\x12\0\x0e\0\x01\0\x05\x03
\0A\0\0\0\0\0\x01\x02@\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇK€Ú½\x13\x05\x01\0\x01\x01\0\0\0\0\x12\0\0\0\x12\0\0\0\x05\0\0\0\0\0áÇÇK€Þ·\0!\x0e\0
\0\x01\0\x05\x02\x06\0@\0\0\0\0\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇK€êr\x13\x05\x01\0\x01\x01\0\0\0\0#\0\0\0#\0\0\0\x05\0\0\0\0\0áÇÇK€ìa\0!\x1f\0^[\0@\0\x06\0\0\0\x165\x03\x19\x11\x1f\005\f	\0\x01	\0\x04	\0		\x03\x11\0\0\0\0H\0\0\0H\0\0\0\x04\0\0\0\0\0áÇÇK€íŸ\0\x01D\0@\0A\0\a\0\0\0;\00515/	\0\x015\x06\x19\x11\x1f\x19\x12\x03	\0\x045\f5\x03\x19\x01\05\x05\x19\0\x03\b\r	\0	5\b5\x06\x19\x11\x1e	\x01\x05	\x03\x11\b[\x10sR0\0\0\0\0\0\0+\0\0\0+\0\0\0\x05\0\0\0\0\0áÇÇK\x05Â\0!'\0#\0@\0\x06\0\x01\0\x1e5\x03\x19\x11\x1f\005\f	\0\x01	\0\x04	\0		\x03\x11\b[\x10sR0\0\0\0\0\0\0\x13\0\0\0\x13\0\0\0\x04\0\0\0\0\0áÇÇK\x06‚\0\x01\x0f\0\v\0A\0\a\0\x01\0\x06\0\x03	\0\0\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇK	«\x13\x05\x01\0\x01\x01\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇK\x15e\x13\x05\x01\0\x01\x01\0\0\0\0\x10\0\0\0\x10\0\0\0\x05\0\0\0\0\0áÇÇK\x18Ë\0!\f\0\b\0\x01\0\x06\x04\x04\0@\0A\0\0\0\0\x10\0\0\0\x10\0\0\0\x04\0\0\0\0\0áÇÇK\x19\x02\0\x01\f\0\b\0\x01\0\a\x04\x04\0@\0A\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇK(ê\x13\x05\x01\0\x01\x01\0\0\0\0\b\0\0\0\b\0\0\0\x03\0\0\0\0\0áÇÇK0¶\x17\x06ß^\b¾÷x\0\0\0	\0\0\0	\0\0\0\x02\0\0\0\0\0áÇÇK1j\f\x04\x06ß^\b¾÷x\0\0\0\f\0\0\0\f\0\0\0\x03\0\0\0\0\0áÇÇK4Ÿ\x0e
\x01\f\x04\0ß^\b¾÷x\0\0\0\v\0\0\0\v\0\0\0\x03\0\0\0\0\0áÇÇKH\x162	ß^\b¾÷x\x03\0\x05\0\0\0\b\0\0\0\b\0\0\0\x03\0\0\0\0\0áÇÇKKô1\x06ß^\b¾÷x\0\0\0\f\0\0\0\f\0\0\0\x02\0\0\0\0\0áÇÇKL”+\x04	ß^\b¾÷x\x01\0\x05\0\0\0\f\0\0\0\f\0\0\0\x03\0\0\0\0\0áÇÇKOØ\x0e
\x01+\x04\0ß^\b¾÷x\0\0\0\f\0\0\0\f\0\0\0\x03\0\0\0\0\0áÇÇK…;i3
ß^\b¾÷x Æ\b\0\0\0\0	\0\0\0	\0\0\0\x02\0\0\0\0\0áÇÇK…<H-\x04\x06ß^\b¾÷x\0\0\0\f\0\0\0\f\0\0\0\x03\0\0\0\0\0áÇÇK…?g\x0e
\x01-\x04\0ß^\b¾÷x\0\0\0	\0\0\0	\0\0\0\x03\0\0\0\0\0áÇÇK‹`ß6\a\x05ß^\b¾÷x\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇK½ø\x05\x04\0\0\x01\x13\0\0\0\b\0\0\0\b\0\0\0\x02\0\0\0\0\0áÇÇL\r¥+\x01\x04\x053‹ž\b\0\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇL\r«\x1f\x0f\x04\0\x02\x01\x04\0\0\x01\x01\0\0\x01\x01\0\0\0\x03\0\0\0\0\0áÇÇL\x19\aù/ÿ\x01ß^\b¾÷x\x01\0\x04\x04$ñQÔ\a	HM1700\v\x03\b\x11\x1e\x11\v\x11\x0e\x11\x01\x11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\x03\0\0\0\x02\0\0\0\0\0áÇÇL”“2\x02\x04\0\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇL”œh\x0e\x04\x02\x02\x04\0\0\0\0\x10\0\0\0\x10\0\0\0\x02\0\0\0\0\0áÇÇL”¥—\x05\x04\rß^\b¾÷x\x18Ì\x02\0\0\0\x01\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇL”¨\r\x0f\x04\0\x01\x05\x04\0\0\0\r\0\0\0\r\0\0\0\x03\0\0\0\0\0áÇÇL¡ÉÏ\x03\v\0\0\x01ß^\b¾÷x\x01\0\0\0\0\x05\0\0\0\x05\0\0\0\x02\0\0\0\0\0áÇÇL¡Ê·^[\x04\x02\0\x01\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇL¡Ñº\x0f\x04\0\x01^[\x04\0\0\0\x05\0\0\0\x05\0\0\0\x03\0\0\0\0\0áÇÇL¡Ý,^[\x03\0\x01\x05\0\0\0\r\0\0\0\r\0\0\0\x03\0\0\0\0\0áÇÇL¡èî\v\v\0\0\x01¿þþ›ÿy‡\0\0\0\x06\0\0\0\x06\0\0\0\x02\0\0\0\0\0áÇÇL¡èý\x1c\x04\x03\0\x01\x01\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇL¡ìÓ\x0f\x04\0\x01\x1c\x04\0\0\0\x0f\0\0\0\x0f\0\0\0\x03\0\0\0\0\0áÇÇL¢\f\x17#\r\0\0\x01\x01\0\x01\0\0\0\0\0\0\0\0\0\0\r\0\0\0\r\0\0\0\x02\0\0\0\0\0áÇÇL¢\f,\x19\x04
ß^\b¾÷x\x02\0\0\0\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇL¢\x0fð\x0f\x04\0\x01\x19\x04\0\0\x01\x01\0\0\x01\x01\0\0\0\x03\0\0\0\0\0áÇÇL¢Z\x1a\aÿ\0ß^\b¾÷xHM1700\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x05\0\0\0\x05\0\0\0\x02\0\0\0\0\0áÇÇL¢Z2\x11\x04\x02\0\x01\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇL¢^\x03\x0f\x04\0\x01\x11\x04\0\0\0\b\0\0\0\b\0\0\0\x03\0\0\0\0\0áÇÇL¢b1\x17\x06ß^\b¾÷x\0\0\0	\0\0\0	\0\0\0\x02\0\0\0\0\0áÇÇL¢xÖ\f\x04\x06ß^\b¾÷x\0\0\0\f\0\0\0\f\0\0\0\x03\0\0\0\0\0áÇÇL¢}P\x0e
\x01\f\x04\0ß^\b¾÷x\0\0\0\b\0\0\0\b\0\0\0\x03\0\0\0\0\0áÇÇL¢%1\x06ß^\b¾÷x\0\0\0\f\0\0\0\f\0\0\0\x02\0\0\0\0\0áÇÇL¢W+\x04	ß^\b¾÷x\x01\0\x03\0\0\0\f\0\0\0\f\0\0\0\x03\0\0\0\0\0áÇÇL¢….\x0e
\x01+\x04\0ß^\b¾÷x\0\0\0\v\0\0\0\v\0\0\0\x03\0\0\0\0\0áÇÇL¢”Ë2	ß^\b¾÷x\x03\0\x02\0\0\0\f\0\0\0\f\0\0\0\x03\0\0\0\0\0áÇÇL¦=é3
ß^\b¾÷xg"\x04\0\0\0\0	\0\0\0	\0\0\0\x02\0\0\0\0\0áÇÇL¦S*,\x04\x06ß^\b¾÷x\0\0\0\f\0\0\0\f\0\0\0\x03\0\0\0\0\0áÇÇL¦Y8\x0e
\x01,\x04\0ß^\b¾÷x\0\0\0	\0\0\0	\0\0\0\x03\0\0\0\0\0áÇÇL­«\x1f6\a\0ß^\b¾÷x\0\0\0\x19\0\0\0\x19\0\0\0\x03\0\0\0\0\0áÇÇL­éÚ\x18\x17ß^\b¾÷xÞ.¶‹\x17])5ƒ0"°L\x12\x1câ\x04\0\0\0\x05\0\0\0\x05\0\0\0\x03\0\0\0\0\0áÇÇL­í~\x06\x03\0\0\x01\0\0\0\x06\0\0\0\x06\0\0\0\x02\0\0\0\0\0áÇÇL­íÆ\x13\x04\x03\0\x01\x01\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇL­ñ¬\x0f\x04\0\x01\x13\x04\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇL®•b\b\x04\0\0\x01\x01\0\0\0\x0e\0\0\0\x0e\0\0\0\x04\0\0\0\0\0áÇÇL®•\0\x01
\0\x06\0\x01\0
\x01\x02\0\x02\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇL®¤ÿ\x13\x05\x01\0\x01\x01\0\0\0\0\x14\0\0\0\x14\0\0\0\x05\0\0\0\0\0áÇÇL®¦ð\0!\x10\0\f\0\x01\0\v\x01\b\0\x02\0\0\0\0\x02\0\0\0\0\0\x0e\0\0\0\x0e\0\0\0\x04\0\0\0\0\0áÇÇL®§\x15\0\x01
\0\x06\0\x01\0\x01\x01\x02\0\0\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇL®¸…\x13\x05\x01\0\x01\x01\0\0\0\0\x10\0\0\0\x10\0\0\0\x04\0\0\0\0\0áÇÇLë±Z\0\x01\f\0\b\0\x01\0\x02\x02\x04\0\x01\0@\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLëÁ¥\x13\x05\x01\0\x01\x01\0\0\0\0\x14\0\0\0\x14\0\0\0\x05\0\0\0\0\0áÇÇLëÅi\0!\x10\0\f\0\x01\0\x03\x02\b\0C\0@\0\0\0\0\0\0\0\0\x10\0\0\0\x10\0\0\0\x04\0\0\0\0\0áÇÇLëÅ›\0\x01\f\0\b\0\x01\0\x04\x03\x04\0C\0\0\0\0\0\0\x14\0\0\0\x14\0\0\0\x05\0\0\0\0\0áÇÇLëʏ\0!\x10\0\f\0\x01\0\x04\x02\b\0@\0\0\0\x01\x02@\0\0\0\0\x16\0\0\0\x16\0\0\0\x04\0\0\0\0\0áÇÇLëÊÐ\0\x01\x12\0\x0e\0\x01\0\x05\x02
\0C\0\0\0\0\0\x01\x02@\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLëÕV\x13\x05\x01\0\x01\x01\0\0\0\0\x12\0\0\0\x12\0\0\0\x05\0\0\0\0\0áÇÇLëØõ\0!\x0e\0
\0\x01\0\x05\x03\x06\0@\0\0\0\0\0\0\0\0\x1c\0\0\0\x1c\0\0\0\x04\0\0\0\0\0áÇÇLëÙž\0\x01\x18\0\x14\0C\0\x06\0\0\0\x0f5\x03\x19\x01\0ÿÿ5\x05
\0\0ÿÿ\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLëÜÝ\x13\x05\x01\0\x01\x01\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLëè—\x13\x05\x01\0\x01\x01\0\0\0\0H\0\0\0H\0\0\0\x05\0\0\0\0\0áÇÇLëì¸\0!D\0@\0@\0\a\0\0\0;\066\x01\a6\0R	\0\0
\0\x01\0\x01	\0\x015	\x19\x11\b\x19\x111\x19\x12\x03	\0\x045\f5\x03\x19\x01\05\x05\x19\0\x03\b\x01	\0\x055\x03\x19\x10\x02	\x02\06\0\0\0\x1e\0\0\0\x1e\0\0\0\x04\0\0\0\0\0áÇÇLëíŸ\0\x01\x1a\0\x16\0C\0\x06\0\x01\0\x115\x03\x19\x01\0ÿÿ5\x05
\0\0ÿÿ\x02\06\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLëüG\x13\x05\x01\0\x01\x01\0\0\0\0H\0\0\0H\0\0\0\x05\0\0\0\0\0áÇÇLëÿý\0!D\0@\0@\0\a\0\x01\0;\06\0	5\b5\x06\x19\x11\b	\x01\x02	\x01\0%\fHSP service\0	\x03\x02(\x016\0P	\0\0
\0\x01\0\x02	\0\x015\x06\x19\x11\x1e\x19\x02\0l\0\0\0\x1e\0\0\0\x1e\0\0\0\x04\0\0\0\0\0áÇÇLì\0\0\x01\x1a\0\x16\0C\0\x06\0\x02\0\x115\x03\x19\x01\0ÿÿ5\x05
\0\0ÿÿ\x02\0l\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLì\x0f»\x13\x05\x01\0\x01\x01\0\0\0\0H\0\0\0H\0\0\0\x05\0\0\0\0\0áÇÇLì\x13Ã\0!D\0@\0@\0\a\0\x02\0;\06\x12\x03	\0\x045\f5\x03\x19\x01\05\x05\x19\0\x03\b\x02	\0\x055\x03\x19\x10\x02	\0	5\b5\x06\x19\x11\x1e	\x01\x05	\x01\0%\fHFP servi\x02\0¢\0\0\0\x1e\0\0\0\x1e\0\0\0\x04\0\0\0\0\0áÇÇLì\x14š\0\x01\x1a\0\x16\0C\0\x06\0\x03\0\x115\x03\x19\x01\0ÿÿ5\x05
\0\0ÿÿ\x02\0¢\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLì#!\x13\x05\x01\0\x01\x01\0\0\0\0H\0\0\0H\0\0\0\x05\0\0\0\0\0áÇÇLì'\x05\0!D\0@\0@\0\a\0\x03\0;\06ce\0	\x03\x11	\0^[6\0\	\0\0
\0\x01\0\x03	\0\x015\x03\x19\x11\v	\0\x045\x105\x06\x19\x01\0	\0\x195\x06\x19\0\x19	\x01\x02	\0\x055\x03\x02\0Ø\0\0\0\x1e\0\0\0\x1e\0\0\0\x04\0\0\0\0\0áÇÇLì'¾\0\x01\x1a\0\x16\0C\0\x06\0\x04\0\x115\x03\x19\x01\0ÿÿ5\x05
\0\0ÿÿ\x02\0Ø\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLì6®\x13\x05\x01\0\x01\x01\0\0\0\0B\0\0\0B\0\0\0\x05\0\0\0\0\0áÇÇLì:«\0!>\0:\0@\0\a\0\x04\05\02\x19\x10\x02	\0	5\b5\x06\x19\x11\r	\x01\x02	\x01\0%\x17Advanced audio service\0	\x03\x11	\0\x01\0\0\0\0\x1c\0\0\0\x1c\0\0\0\x04\0\0\0\0\0áÇÇLî\x10\x16\0\x01\x18\0\x14\0C\0\x06\0\x05\0\x0f5\x03\x19\x12\0ÿÿ5\x05
\0\0ÿÿ\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLî\x1e÷\x13\x05\x01\0\x01\x01\0\0\0\0G\0\0\0G\0\0\0\x05\0\0\0\0\0áÇÇLî"Ú\0!C\0?\0@\0\a\0\x05\0:\055D6\0A	\0\0
\0\x01\0\0	\0\x015\x03\x19\x12\0	\0\x055\x03\x19\x10\x02	\x02\0	\x01\x03	\x02\x01	\0\x0f	\x02\x02	\0\0	\x02\x03	\0\0\x02\05\0\0\0\x1e\0\0\0\x1e\0\0\0\x04\0\0\0\0\0áÇÇLî#´\0\x01\x1a\0\x16\0C\0\x06\0\x06\0\x115\x03\x19\x12\0ÿÿ5\x05
\0\0ÿÿ\x02\05\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLî2c\x13\x05\x01\0\x01\x01\0\0\0\0!\0\0\0!\0\0\0\x05\0\0\0\0\0áÇÇLî5&\0!\x1d\0\x19\0@\0\a\0\x06\0\x14\0\x11	\x02\x04(\x01	\x02\x05	\0\x01	€\x01	\0\x01\0\0\0\0\x1c\0\0\0\x1c\0\0\0\x04\0\0\0\0\0áÇÇLïÆ‹\0\x01\x18\0\x14\0C\0\x06\0\a\0\x0f5\x03\x19\x11\x1eÿÿ5\x05
\0\0ÿÿ\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLïÐ\x1a\x13\x05\x01\0\x01\x01\0\0\0\0G\0\0\0G\0\0\0\x05\0\0\0\0\0áÇÇLïÔõ\0!C\0?\0@\0\a\0\a\0:\055S6\0P	\0\0
\0\x01\0\x02	\0\x015\x06\x19\x11\x1e\x19\x12\x03	\0\x045\f5\x03\x19\x01\05\x05\x19\0\x03\b\x02	\0\x055\x03\x19\x10\x02	\0	5\x02\05\0\0\0\x1e\0\0\0\x1e\0\0\0\x04\0\0\0\0\0áÇÇLïÕÍ\0\x01\x1a\0\x16\0C\0\x06\0\b\0\x115\x03\x19\x11\x1eÿÿ5\x05
\0\0ÿÿ\x02\05\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLïãž\x13\x05\x01\0\x01\x01\0\0\0\00\0\0\00\0\0\0\x05\0\0\0\0\0áÇÇLïèz\0!,\0(\0@\0\a\0\b\0#\0 \b5\x06\x19\x11\x1e	\x01\x05	\x01\0%\fHFP service\0	\x03\x11	\0^[\0\0\0\0\x10\0\0\0\x10\0\0\0\x04\0\0\0\0\0áÇÇLïê„\0\x01\f\0\b\0\x01\0\x02\x04\x04\0\x03\0A\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLï÷\x19\x13\x05\x01\0\x01\x01\0\0\0\0\x14\0\0\0\x14\0\0\0\x05\0\0\0\0\0áÇÇLïûù\0!\x10\0\f\0\x01\0\x03\x04\b\0D\0A\0\0\0\0\0\0\0\0\x14\0\0\0\x14\0\0\0\x04\0\0\0\0\0áÇÇLïü\x13\0\x01\x10\0\f\0\x01\0\x04\x05\b\0D\0\0\0\x01\x02õ\x03\0\0\0\x14\0\0\0\x14\0\0\0\x05\0\0\0\0\0áÇÇLð
Ÿ\0!\x10\0\f\0\x01\0\x04\x03\b\0A\0\0\0\x01\x02\0\x04\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLð
ª\x13\x05\x01\0\x01\x01\0\0\0\0\x16\0\0\0\x16\0\0\0\x04\0\0\0\0\0áÇÇLð
Æ\0\x01\x12\0\x0e\0\x01\0\x05\x03
\0D\0\0\0\0\0\x01\x02\0\x04\0\0\0\x12\0\0\0\x12\0\0\0\x05\0\0\0\0\0áÇÇLð\x0f~\0!\x0e\0
\0\x01\0\x05\x05\x06\0A\0\0\0\0\0\0\0\0\f\0\0\0\f\0\0\0\x04\0\0\0\0\0áÇÇLð\x0fÞ\0\x01\b\0\x04\0D\0\x03?\x01\x1c\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLð\x1a>\x13\x05\x01\0\x01\x01\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLð\x1e!\x13\x05\x01\0\x01\x01\0\0\0\0\f\0\0\0\f\0\0\0\x05\0\0\0\0\0áÇÇLð"	\0!\b\0\x04\0A\0\x03s\x01×\0\0\0\x16\0\0\0\x16\0\0\0\x04\0\0\0\0\0áÇÇLð"o\0\x01\x12\0\x0e\0D\0\x03ï\x15ƒ\x11\x04ð\a\0ð\x03\0\ap\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLð1«\x13\x05\x01\0\x01\x01\0\0\0\0\x16\0\0\0\x16\0\0\0\x05\0\0\0\0\0áÇÇLð5Ž\0!\x12\0\x0e\0A\0\x01ï\x15\x11\x04à\a\0ÿ\0\0\aª\0\0\0\f\0\0\0\f\0\0\0\x04\0\0\0\0\0áÇÇLð5ó\0\x01\b\0\x04\0D\0\x13?\x01–\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLðE3\x13\x05\x01\0\x01\x01\0\0\0\0\f\0\0\0\f\0\0\0\x05\0\0\0\0\0áÇÇLðI\x13\0!\b\0\x04\0A\0\x13s\x01]\0\0\0\x10\0\0\0\x10\0\0\0\x04\0\0\0\0\0áÇÇLðI=\0\x01\f\0\b\0D\0\x03ï	ã\x05\x13p\0\0\0\x10\0\0\0\x10\0\0\0\x05\0\0\0\0\0áÇÇLðO\0\0!\f\0\b\0\x01\0\x02\x04\x04\0\x01\0E\0\0\0\0\x14\0\0\0\x14\0\0\0\x04\0\0\0\0\0áÇÇLðO\x1e\0\x01\x10\0\f\0\x01\0\x03\x04\b\0B\0E\0\0\0\0\0\0\0\0\x10\0\0\0\x10\0\0\0\x04\0\0\0\0\0áÇÇLðO"\0\x01\f\0\b\0\x01\0\x04\x06\x04\0E\0\0\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLðXº\x13\x05\x01\0\x01\x01\0\0\0\0\x10\0\0\0\x10\0\0\0\x05\0\0\0\0\0áÇÇLð] \0!\f\0\b\0A\0\x01ï	á\x05\x13ª\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLð`¤\x13\x05\x01\0\x01\x01\0\0\0\0\x10\0\0\0\x10\0\0\0\x05\0\0\0\0\0áÇÇLðb\x1a\0!\f\0\b\0A\0\x01ï	ã\x05\x13ª\0\0\0\x10\0\0\0\x10\0\0\0\x04\0\0\0\0\0áÇÇLðb[\0\x01\f\0\b\0D\0\x03ï	á\x05\x13p\0\0\0\r\0\0\0\r\0\0\0\x04\0\0\0\0\0áÇÇLðbb\0\x01	\0\x05\0D\0\x13ÿ\x01!y\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLðdŽ\x13\x05\x01\0\x01\x01\0\0\0\0\x14\0\0\0\x14\0\0\0\x05\0\0\0\0\0áÇÇLðgy\0!\x10\0\f\0\x01\0\x04\x05\b\0B\0\0\0\x01\x02@\0\0\0\0\x16\0\0\0\x16\0\0\0\x04\0\0\0\0\0áÇÇLðg™\0\x01\x12\0\x0e\0\x01\0\x05\x05
\0E\0\0\0\0\0\x01\x02@\0\0\0\0\x12\0\0\0\x12\0\0\0\x05\0\0\0\0\0áÇÇLðlz\0!\x0e\0
\0\x01\0\x05\x06\x06\0B\0\0\0\0\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLðtR\x13\x05\x01\0\x01\x01\0\0\0\0\x18\0\0\0\x18\0\0\0\x05\0\0\0\0\0áÇÇLðuû\0!\x14\0\x10\0A\0\x11ÿ\x17	AT+BRSF=27\r£\0\0\0\x1a\0\0\0\x1a\0\0\0\x04\0\0\0\0\0áÇÇLðv„\0\x01\x16\0\x12\0D\0\x13ï\x1d
+BRSF: 352
e\0\0\0\x12\0\0\0\x12\0\0\0\x04\0\0\0\0\0áÇÇLðvŒ\0\x01\x0e\0
\0D\0\x13ï
OK
e\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLðw\x13\x05\x01\0\x01\x01\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLð|\x1d\x13\x05\x01\0\x01\x01\0\0\0\0 \0\0\0 \0\0\0\x05\0\0\0\0\0áÇÇLð\x7f\a\0!\x1c\0\x18\0B\0\x06\0\0\0\x135\x03\x19\x11\x1f\005		\0\x01	\0		\x03\x11\0\0\0\02\0\0\02\0\0\0\x04\0\0\0\0\0áÇÇLð\x7fà\0\x01.\0*\0E\0\a\0\0\0%\0"5 5\x1e	\0\x015\x06\x19\x11\x1f\x19\x12\x03	\0	5\b5\x06\x19\x11\x1e	\x01\x05	\x03\x11	\0\0\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLð‡Ó\x13\x05\x01\0\x01\x01\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLð‹»\x13\x05\x01\0\x01\x01\0\0\0\0\x17\0\0\0\x17\0\0\0\x05\0\0\0\0\0áÇÇLðª\0!\x13\0\x0f\0A\0\x11ÿ\x15\x02AT+CIND=?\r£\0\0\0‘\0\0\0‘\0\0\0\x04\0\0\0\0\0áÇÇLðŽf\0\x01\0‰\0D\0\x13ï\b\x01
+CIND: ("battchg",(0-5)),("signal",(0-5)),("service",(0,1)),("call",(0,1)),("callsetup",(0-3)),("callheld",(0-2)),("roam",(0,1))
e\0\0\0\x12\0\0\0\x12\0\0\0\x04\0\0\0\0\0áÇÇLðŽp\0\x01\x0e\0
\0D\0\x13ï
OK
e\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLð‰\x13\x05\x01\0\x01\x01\0\0\0\0\x10\0\0\0\x10\0\0\0\x05\0\0\0\0\0áÇÇLð“S\0!\f\0\b\0\x01\0\x06\x06\x04\0B\0E\0\0\0\0\x10\0\0\0\x10\0\0\0\x04\0\0\0\0\0áÇÇLð“t\0\x01\f\0\b\0\x01\0\a\x06\x04\0B\0E\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLð¢ô\x13\x05\x01\0\x01\x01\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLð¦í\x13\x05\x01\0\x01\x01\0\0\0\0\x16\0\0\0\x16\0\0\0\x05\0\0\0\0\0áÇÇLðªÓ\0!\x12\0\x0e\0A\0\x11ÿ\x13\x02AT+CIND?\r£\0\0\0$\0\0\0$\0\0\0\x04\0\0\0\0\0áÇÇLð«3\0\x01 \0\x1c\0D\0\x13ï1
+CIND: 5,5,1,0,0,0,0
e\0\0\0\x12\0\0\0\x12\0\0\0\x04\0\0\0\0\0áÇÇLð«<\0\x01\x0e\0
\0D\0\x13ï
OK
e\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLð®¼\x13\x05\x01\0\x01\x01\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLð¾L\x13\x05\x01\0\x01\x01\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLðÍÙ\x13\x05\x01\0\x01\x01\0\0\0\0\x1d\0\0\0\x1d\0\0\0\x05\0\0\0\0\0áÇÇLðÑÝ\0!\x19\0\x15\0A\0\x11ÿ!\x02AT+CMER=3,0,0,1\r£\0\0\0\x12\0\0\0\x12\0\0\0\x04\0\0\0\0\0áÇÇLðÒn\0\x01\x0e\0
\0D\0\x13ï
OK
e\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLðág\x13\x05\x01\0\x01\x01\0\0\0\0\x17\0\0\0\x17\0\0\0\x05\0\0\0\0\0áÇÇLñFü\0!\x13\0\x0f\0A\0\x11ÿ\x15\x01AT+CCWA=1\r£\0\0\0\x12\0\0\0\x12\0\0\0\x04\0\0\0\0\0áÇÇLñG§\0\x01\x0e\0
\0D\0\x13ï
OK
e\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLñV‡\x13\x05\x01\0\x01\x01\0\0\0\0#\0\0\0#\0\0\0\x05\0\0\0\0\0áÇÇLñ_c\0!\x1f\0^[\0A\0\x11ÿ-\x01AT+BIA=0,0,1,1,1,1,0,\r£\0\0\0\x15\0\0\0\x15\0\0\0\x04\0\0\0\0\0áÇÇLñ`§\0\x01\x11\0\r\0D\0\x13ï\x13
ERROR
e\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLñr\x19\x13\x05\x01\0\x01\x01\0\0\0\0\x18\0\0\0\x18\0\0\0\x05\0\0\0\0\0áÇÇLñrË\0!\x14\0\x10\0A\0\x11ÿ\x17\x01AT+CBC=100\r£\0\0\0\x15\0\0\0\x15\0\0\0\x04\0\0\0\0\0áÇÇLñsê\0\x01\x11\0\r\0D\0\x13ï\x13
ERROR
e\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLñ…Ÿ\x13\x05\x01\0\x01\x01\0\0\0\0\x17\0\0\0\x17\0\0\0\x05\0\0\0\0\0áÇÇLñ†o\0!\x13\0\x0f\0A\0\x11ÿ\x15\x01AT+VGS=15\r£\0\0\0\x12\0\0\0\x12\0\0\0\x04\0\0\0\0\0áÇÇLñ‡f\0\x01\x0e\0
\0D\0\x13ï
OK
e\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLñ™\v\x13\x05\x01\0\x01\x01\0\0\0\0\x19\0\0\0\x19\0\0\0\x05\0\0\0\0\0áÇÇLñ™×\0!\x15\0\x11\0A\0\x11ÿ\x19\x01AT+COPS=3,0\r£\0\0\0\x12\0\0\0\x12\0\0\0\x04\0\0\0\0\0áÇÇLñšÏ\0\x01\x0e\0
\0D\0\x13ï
OK
e\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLñ¬g\x13\x05\x01\0\x01\x01\0\0\0\0\x17\0\0\0\x17\0\0\0\x05\0\0\0\0\0áÇÇLñ­]\0!\x13\0\x0f\0A\0\x11ÿ\x15\x01AT+CMEE=1\r£\0\0\0\x12\0\0\0\x12\0\0\0\x04\0\0\0\0\0áÇÇLñ­ì\0\x01\x0e\0
\0D\0\x13ï
OK
e\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇLñÃÙ\x13\x05\x01\0\x01\x01\0\0\0\0\x10\0\0\0\x10\0\0\0\x04\0\0\0\0\0áÇÇM\vv \0\x01\f\0\b\0\x01\0\x06\a\x04\0C\0@\0\0\0\0\x10\0\0\0\x10\0\0\0\x04\0\0\0\0\0áÇÇM\vw/\0\x01\f\0\b\0\x01\0\x02\b\x04\0\x19\0B\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇM\v†1\x13\x05\x01\0\x01\x01\0\0\0\0\x10\0\0\0\x10\0\0\0\x05\0\0\0\0\0áÇÇM\v‡Ÿ\0!\f\0\b\0\x01\0\a\a\x04\0C\0@\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇM\vŠ\x0f\x13\x05\x01\0\x01\x01\0\0\0\0\x14\0\0\0\x14\0\0\0\x05\0\0\0\0\0áÇÇM\vŒü\0!\x10\0\f\0\x01\0\x03\b\b\0F\0B\0\0\0\0\0\0\0\0\x10\0\0\0\x10\0\0\0\x04\0\0\0\0\0áÇÇM\v&\0\x01\f\0\b\0\x01\0\x04	\x04\0F\0\0\0\0\0\0\x14\0\0\0\x14\0\0\0\x05\0\0\0\0\0áÇÇM\v‘à\0!\x10\0\f\0\x01\0\x04\a\b\0B\0\0\0\x01\x02 \x02\0\0\0\x16\0\0\0\x16\0\0\0\x04\0\0\0\0\0áÇÇM\v’\x0e\0\x01\x12\0\x0e\0\x01\0\x05\a
\0F\0\0\0\0\0\x01\x02 \x02\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇM\v“\x13\x05\x01\0\x01\x01\0\0\0\0\x12\0\0\0\x12\0\0\0\x05\0\0\0\0\0áÇÇM\v \0!\x0e\0
\0\x01\0\x05	\x06\0B\0\0\0\0\0\0\0\0
\0\0\0
\0\0\0\x04\0\0\0\0\0áÇÇM\v¡\x03\0\x01\x06\0\x02\0F\0\0\x01\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇM\v¡~\x13\x05\x01\0\x01\x01\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇM\v±\x1c\x13\x05\x01\0\x01\x01\0\0\0\0\f\0\0\0\f\0\0\0\x05\0\0\0\0\0áÇÇM\v³\v\0!\b\0\x04\0B\0\x02\x01\x04\b\0\0\0\v\0\0\0\v\0\0\0\x04\0\0\0\0\0áÇÇM\v³u\0\x01\a\0\x03\0F\0\x10\x02\x04\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇM\vÄŸ\x13\x05\x01\0\x01\x01\0\0\0\0\x14\0\0\0\x14\0\0\0\x05\0\0\0\0\0áÇÇM\vDz\0!\x10\0\f\0B\0\x12\x02\x01\0\a\x06\0\0ÿÿ\x02Y\0\0\0\x16\0\0\0\x16\0\0\0\x04\0\0\0\0\0áÇÇM\vÈ0\0\x01\x12\0\x0e\0F\0 \x03\x04\x04\x01\0\a\x06\0\0!\x15\x025\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇM\vØm\x13\x05\x01\0\x01\x01\0\0\0\0
\0\0\0
\0\0\0\x05\0\0\0\0\0áÇÇM\vÚZ\0!\x06\0\x02\0B\0"\x03\0\0\0\v\0\0\0\v\0\0\0\x04\0\0\0\0\0áÇÇM\vÚÌ\0\x01\a\0\x03\0F\00\x06\x04\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇM\vë¾\x13\x05\x01\0\x01\x01\0\0\0\0
\0\0\0
\0\0\0\x05\0\0\0\0\0áÇÇM\ví­\0!\x06\0\x02\0B\02\x06\0\0\0\x10\0\0\0\x10\0\0\0\x04\0\0\0\0\0áÇÇM\vî(\0\x01\f\0\b\0\x01\0\x02
\x04\0\x19\0@\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇM\vÿD\x13\x05\x01\0\x01\x01\0\0\0\0\x14\0\0\0\x14\0\0\0\x05\0\0\0\0\0áÇÇM\f\x02/\0!\x10\0\f\0\x01\0\x03
\b\0G\0@\0\0\0\0\0\0\0\0\x10\0\0\0\x10\0\0\0\x04\0\0\0\0\0áÇÇM\f\x02N\0\x01\f\0\b\0\x01\0\x04\v\x04\0G\0\0\0\0\0\0\x18\0\0\0\x18\0\0\0\x05\0\0\0\0\0áÇÇM\f\x06+\0!\x14\0\x10\0\x01\0\x04\b\f\0@\0\0\0\x01\x02ð\x03\x02\x02È\0\0\0\0\x16\0\0\0\x16\0\0\0\x04\0\0\0\0\0áÇÇM\f\x06E\0\x01\x12\0\x0e\0\x01\0\x05\b
\0G\0\0\0\0\0\x01\x02ð\x03\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇM\f\x12à\x13\x05\x01\0\x01\x01\0\0\0\0\x12\0\0\0\x12\0\0\0\x05\0\0\0\0\0áÇÇM\f\x15Æ\0!\x0e\0
\0\x01\0\x05\v\x06\0@\0\0\0\0\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇM\f\x16®\x13\x05\x01\0\x01\x01\0\0\0\0\x14\0\0\0\x14\0\0\0\x02\0\0\0\0\0áÇÇM\f;K(\x04\x11\0\x01@\x1f\0\0@\x1f\0\0ÿÿ`\0ÿ?\0\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇM\fA\x0f\x04\0\x01(\x04\0\0\0\x05\0\0\0\x05\0\0\0\x03\0\0\0\0\0áÇÇM\fQ.^[\x03\0\x01\x01\0\0\0\x13\0\0\0\x13\0\0\0\x03\0\0\0\0\0áÇÇM\f“«,\x11\0\x01\x01ß^\b¾÷x\x02\f\x02<\0<\0\x02\0\0\0\x17\0\0\0\x17\0\0\0\x04\0\0\0\0\0áÇÇM\f—\x01\0\x01\x13\0\x0f\0D\0\x13ï\x17
+VGS=15
e\0\0\0\x17\0\0\0\x17\0\0\0\x04\0\0\0\0\0áÇÇM\f—\x0e\0\x01\x13\0\x0f\0D\0\x13ï\x17
+VGM=15
e\0\0\0\x05\0\0\0\x05\0\0\0\x03\0\0\0\0\0áÇÇM\f§\x18^[\x03\0\x01\x05\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇM\fªú\x13\x05\x01\0\x01\x01\0\0\0\03\0\0\03\0\0\0\x06\0\0\0\0\0áÇÇM\f¯Ž\x01\x010\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇM\f¶²\x13\x05\x01\0\x01\x01\0\0\0\0\b\0\0\0\b\0\0\0\x03\0\0\0\0\0áÇÇMV
Ø\x14\x06\0\0\x01\x02Œ\x01\0\0\0\x06\0\0\0\x06\0\0\0\x02\0\0\0\0\0áÇÇMY?õ\x06\x04\x03\x01\x01\x13\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇMYB[\x0f\x04\0\x01\x06\x04\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇMYÚ¡\x05\x04\0\x01\x01\x16\0\0\0\b\0\0\0\b\0\0\0\x03\0\0\0\0\0áÇÇMYò\x12\x14\x06\0\0\x01\0\0\0\0\0\0\b\0\0\0\b\0\0\0\x03\0\0\0\0\0áÇÇM¢_—\x14\x06\0\0\x01\x02 \x03\0\0\0\x05\0\0\0\x05\0\0\0\x02\0\0\0\0\0áÇÇM¤D"\x04\b\x02\0\x01\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇM¤GÄ\x0f\x04\0\x01\x04\b\0\0\0\b\0\0\0\b\0\0\0\x03\0\0\0\0\0áÇÇM©g¿\x14\x06\0\0\x01\0\0\0\0\0\0\x14\0\0\0\x14\0\0\0\x02\0\0\0\0\0áÇÇM©h\v(\x04\x11\0\x01@\x1f\0\0@\x1f\0\0ÿÿ`\0ÿ?\0\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇM©k§\x0f\x04\0\x01(\x04\0\0\0\x05\0\0\0\x05\0\0\0\x03\0\0\0\0\0áÇÇM©‚ÿ^[\x03\0\x01\x01\0\0\0\x13\0\0\0\x13\0\0\0\x03\0\0\0\0\0áÇÇM©Í),\x11\0\x01\x01ß^\b¾÷x\x02\f\x02<\0<\0\x02\0\0\0\x17\0\0\0\x17\0\0\0\x04\0\0\0\0\0áÇÇM©Ðb\0\x01\x13\0\x0f\0D\0\x13ï\x17
+VGS=15
e\0\0\0\x17\0\0\0\x17\0\0\0\x04\0\0\0\0\0áÇÇM©Ðx\0\x01\x13\0\x0f\0D\0\x13ï\x17
+VGM=15
e\0\0\03\0\0\03\0\0\0\x06\0\0\0\0\0áÇÇM©à‹\x01\x010\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\03\0\0\03\0\0\0\x06\0\0\0\0\0áÇÇM©áj\x01\x010\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x05\0\0\0\x05\0\0\0\x03\0\0\0\0\0áÇÇM©äm^[\x03\0\x01\x05\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇM©èW\x13\x05\x01\0\x01\x01\0\0\0\0\a\0\0\0\a\0\0\0\x03\0\0\0\0\0áÇÇM©ìC\x13\x05\x01\0\x01\x01\0\0\0\0\b\0\0\0\b\0\0\0\x03\0\0\0\0\0áÇÇMîfÎ\x14\x06\0\0\x01\x02Œ\x01\0\0\0\x06\0\0\0\x06\0\0\0\x02\0\0\0\0\0áÇÇN\x0eÄŸ\x06\x04\x03\x01\x01\x13\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇN\x0eÇt\x0f\x04\0\x01\x06\x04\0\0\0\x06\0\0\0\x06\0\0\0\x03\0\0\0\0\0áÇÇN\x10i(\x05\x04\0\x01\x01\x16\0\0\0\b\0\0\0\b\0\0\0\x03\0\0\0\0\0áÇÇN\x10€È\x14\x06\0\0\x01\0\0\0\0\0\0\b\0\0\0\b\0\0\0\x03\0\0\0\0\0áÇÇNY[‘\x14\x06\0\0\x01\x02 \x03

^ permalink raw reply

* [PATCH 3/3] Bluetooth: btmrvl: operate on 16-bit opcodes instead of ogf/ocf
From: Bing Zhao @ 2013-10-31 22:08 UTC (permalink / raw)
  To: linux-bluetooth
  Cc: Marcel Holtmann, Gustavo Padovan, Johan Hedberg, Mike Frysinger,
	Amitkumar Karwar, Bing Zhao
In-Reply-To: <1383257311-1430-1-git-send-email-bzhao@marvell.com>

Replace ogf/ocf and its packing with 16-bit opcodes.

Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
---
 drivers/bluetooth/btmrvl_drv.h  | 19 +++++++++++--------
 drivers/bluetooth/btmrvl_main.c | 21 +++++++++------------
 2 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/drivers/bluetooth/btmrvl_drv.h b/drivers/bluetooth/btmrvl_drv.h
index ffac0e4..7399303 100644
--- a/drivers/bluetooth/btmrvl_drv.h
+++ b/drivers/bluetooth/btmrvl_drv.h
@@ -86,12 +86,12 @@ struct btmrvl_private {
 
 #define MRVL_VENDOR_PKT			0xFE
 
-/* Bluetooth commands  */
-#define BT_CMD_AUTO_SLEEP_MODE		0x23
-#define BT_CMD_HOST_SLEEP_CONFIG	0x59
-#define BT_CMD_HOST_SLEEP_ENABLE	0x5A
-#define BT_CMD_MODULE_CFG_REQ		0x5B
-#define BT_CMD_LOAD_CONFIG_DATA		0x61
+/* Vendor specific Bluetooth commands */
+#define BT_CMD_AUTO_SLEEP_MODE		0xFC23
+#define BT_CMD_HOST_SLEEP_CONFIG	0xFC59
+#define BT_CMD_HOST_SLEEP_ENABLE	0xFC5A
+#define BT_CMD_MODULE_CFG_REQ		0xFC5B
+#define BT_CMD_LOAD_CONFIG_DATA		0xFC61
 
 /* Sub-commands: Module Bringup/Shutdown Request/Response */
 #define MODULE_BRINGUP_REQ		0xF1
@@ -100,6 +100,11 @@ struct btmrvl_private {
 
 #define MODULE_SHUTDOWN_REQ		0xF2
 
+/* Vendor specific Bluetooth events */
+#define BT_EVENT_AUTO_SLEEP_MODE	0x23
+#define BT_EVENT_HOST_SLEEP_CONFIG	0x59
+#define BT_EVENT_HOST_SLEEP_ENABLE	0x5A
+#define BT_EVENT_MODULE_CFG_REQ		0x5B
 #define BT_EVENT_POWER_STATE		0x20
 
 /* Bluetooth Power States */
@@ -107,8 +112,6 @@ struct btmrvl_private {
 #define BT_PS_DISABLE			0x03
 #define BT_PS_SLEEP			0x01
 
-#define OGF				0x3F
-
 /* Host Sleep states */
 #define HS_ACTIVATED			0x01
 #define HS_DEACTIVATED			0x00
diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_main.c
index f13bef8..1e0320a 100644
--- a/drivers/bluetooth/btmrvl_main.c
+++ b/drivers/bluetooth/btmrvl_main.c
@@ -50,12 +50,10 @@ bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb)
 
 	if (hdr->evt == HCI_EV_CMD_COMPLETE) {
 		struct hci_ev_cmd_complete *ec;
-		u16 opcode, ocf, ogf;
+		u16 opcode;
 
 		ec = (void *) (skb->data + HCI_EVENT_HDR_SIZE);
 		opcode = __le16_to_cpu(ec->opcode);
-		ocf = hci_opcode_ocf(opcode);
-		ogf = hci_opcode_ogf(opcode);
 
 		if (priv->btmrvl_dev.sendcmdflag) {
 			priv->btmrvl_dev.sendcmdflag = false;
@@ -63,9 +61,8 @@ bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb)
 			wake_up_interruptible(&priv->adapter->cmd_wait_q);
 		}
 
-		if (ogf == OGF) {
-			BT_DBG("vendor event skipped: ogf 0x%4.4x ocf 0x%4.4x",
-			       ogf, ocf);
+		if (hci_opcode_ogf(opcode) == 0x3F) {
+			BT_DBG("vendor event skipped: opcode=%#4.4x", opcode);
 			kfree_skb(skb);
 			return false;
 		}
@@ -89,7 +86,7 @@ int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb)
 	}
 
 	switch (event->data[0]) {
-	case BT_CMD_AUTO_SLEEP_MODE:
+	case BT_EVENT_AUTO_SLEEP_MODE:
 		if (!event->data[2]) {
 			if (event->data[1] == BT_PS_ENABLE)
 				adapter->psmode = 1;
@@ -102,7 +99,7 @@ int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb)
 		}
 		break;
 
-	case BT_CMD_HOST_SLEEP_CONFIG:
+	case BT_EVENT_HOST_SLEEP_CONFIG:
 		if (!event->data[3])
 			BT_DBG("gpio=%x, gap=%x", event->data[1],
 							event->data[2]);
@@ -110,7 +107,7 @@ int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb)
 			BT_DBG("HSCFG command failed");
 		break;
 
-	case BT_CMD_HOST_SLEEP_ENABLE:
+	case BT_EVENT_HOST_SLEEP_ENABLE:
 		if (!event->data[1]) {
 			adapter->hs_state = HS_ACTIVATED;
 			if (adapter->psmode)
@@ -121,7 +118,7 @@ int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb)
 		}
 		break;
 
-	case BT_CMD_MODULE_CFG_REQ:
+	case BT_EVENT_MODULE_CFG_REQ:
 		if (priv->btmrvl_dev.sendcmdflag &&
 				event->data[1] == MODULE_BRINGUP_REQ) {
 			BT_DBG("EVENT:%s",
@@ -166,7 +163,7 @@ exit:
 }
 EXPORT_SYMBOL_GPL(btmrvl_process_event);
 
-static int btmrvl_send_sync_cmd(struct btmrvl_private *priv, u16 cmd_no,
+static int btmrvl_send_sync_cmd(struct btmrvl_private *priv, u16 opcode,
 				const void *param, u8 len)
 {
 	struct sk_buff *skb;
@@ -179,7 +176,7 @@ static int btmrvl_send_sync_cmd(struct btmrvl_private *priv, u16 cmd_no,
 	}
 
 	hdr = (struct hci_command_hdr *)skb_put(skb, HCI_COMMAND_HDR_SIZE);
-	hdr->opcode = cpu_to_le16(hci_opcode_pack(OGF, cmd_no));
+	hdr->opcode = cpu_to_le16(opcode);
 	hdr->plen = len;
 
 	if (len)
-- 
1.8.0

^ permalink raw reply related

* [PATCH 2/3] Bluetooth: btmrvl: remove cal-data byte swapping and redundant mem copy
From: Bing Zhao @ 2013-10-31 22:08 UTC (permalink / raw)
  To: linux-bluetooth
  Cc: Marcel Holtmann, Gustavo Padovan, Johan Hedberg, Mike Frysinger,
	Amitkumar Karwar, Bing Zhao
In-Reply-To: <1383257311-1430-1-git-send-email-bzhao@marvell.com>

The device tree property can define the cal-data in proper order.
There is no need to swap the bytes in driver.
Also remove the redundant cal-data memory copy after removing the
byte swapping.

Cc: Mike Frysinger <vapier@chromium.org>
Cc: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: Hyuckjoo Lee <hyuckjoo.lee@samsung.com>
---
 drivers/bluetooth/btmrvl_drv.h  |  2 +-
 drivers/bluetooth/btmrvl_main.c | 27 ++++++++++-----------------
 2 files changed, 11 insertions(+), 18 deletions(-)

diff --git a/drivers/bluetooth/btmrvl_drv.h b/drivers/bluetooth/btmrvl_drv.h
index be76851..ffac0e4 100644
--- a/drivers/bluetooth/btmrvl_drv.h
+++ b/drivers/bluetooth/btmrvl_drv.h
@@ -117,7 +117,7 @@ struct btmrvl_private {
 #define PS_SLEEP			0x01
 #define PS_AWAKE			0x00
 
-#define BT_CMD_DATA_SIZE		32
+#define BT_CAL_HDR_LEN			4
 #define BT_CAL_DATA_SIZE		28
 
 struct btmrvl_event {
diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_main.c
index a17812d..f13bef8 100644
--- a/drivers/bluetooth/btmrvl_main.c
+++ b/drivers/bluetooth/btmrvl_main.c
@@ -418,28 +418,20 @@ static int btmrvl_open(struct hci_dev *hdev)
 }
 
 static int btmrvl_download_cal_data(struct btmrvl_private *priv,
-				    u8 *config_data)
+				    u8 *data, int len)
 {
-	int i, ret;
-	u8 data[BT_CMD_DATA_SIZE];
+	int ret;
 
 	data[0] = 0x00;
 	data[1] = 0x00;
 	data[2] = 0x00;
-	data[3] = BT_CMD_DATA_SIZE - 4;
-
-	/* Swap cal-data bytes. Each four bytes are swapped. Considering 4
-	 * byte SDIO header offset, mapping of input and output bytes will be
-	 * {3, 2, 1, 0} -> {0+4, 1+4, 2+4, 3+4},
-	 * {7, 6, 5, 4} -> {4+4, 5+4, 6+4, 7+4} */
-	for (i = 4; i < BT_CMD_DATA_SIZE; i++)
-		data[i] = config_data[(i / 4) * 8 - 1 - i];
+	data[3] = len;
 
 	print_hex_dump_bytes("Calibration data: ",
-			     DUMP_PREFIX_OFFSET, data, BT_CMD_DATA_SIZE);
+			     DUMP_PREFIX_OFFSET, data, BT_CAL_HDR_LEN + len);
 
 	ret = btmrvl_send_sync_cmd(priv, BT_CMD_LOAD_CONFIG_DATA, data,
-				   BT_CMD_DATA_SIZE);
+				   BT_CAL_HDR_LEN + len);
 	if (ret)
 		BT_ERR("Failed to download caibration data\n");
 
@@ -449,7 +441,7 @@ static int btmrvl_download_cal_data(struct btmrvl_private *priv,
 static int btmrvl_cal_data_dt(struct btmrvl_private *priv)
 {
 	struct device_node *dt_node;
-	u8 cal_data[BT_CAL_DATA_SIZE];
+	u8 cal_data[BT_CAL_HDR_LEN + BT_CAL_DATA_SIZE];
 	const char name[] = "btmrvl_caldata";
 	const char property[] = "btmrvl,caldata";
 	int ret;
@@ -458,13 +450,14 @@ static int btmrvl_cal_data_dt(struct btmrvl_private *priv)
 	if (!dt_node)
 		return -ENODEV;
 
-	ret = of_property_read_u8_array(dt_node, property, cal_data,
-					sizeof(cal_data));
+	ret = of_property_read_u8_array(dt_node, property,
+					cal_data + BT_CAL_HDR_LEN,
+					BT_CAL_DATA_SIZE);
 	if (ret)
 		return ret;
 
 	BT_DBG("Use cal data from device tree");
-	ret = btmrvl_download_cal_data(priv, cal_data);
+	ret = btmrvl_download_cal_data(priv, cal_data, BT_CAL_DATA_SIZE);
 	if (ret) {
 		BT_ERR("Fail to download calibrate data");
 		return ret;
-- 
1.8.0

^ permalink raw reply related

* [PATCH 1/3] Bluetooth: btmrvl: use cal-data from device-tree instead of conf file
From: Bing Zhao @ 2013-10-31 22:08 UTC (permalink / raw)
  To: linux-bluetooth
  Cc: Marcel Holtmann, Gustavo Padovan, Johan Hedberg, Mike Frysinger,
	Amitkumar Karwar, Bing Zhao

The cal-data is platform dependent. It's simpler and more feasible
to use device tree based cal-data instead of configuration file
based cal-data.

This patch remove configuration file based cal-data downloading
and replace it using cal-data from device tree.

Cc: Mike Frysinger <vapier@chromium.org>
Cc: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: Hyuckjoo Lee <hyuckjoo.lee@samsung.com>
---
 drivers/bluetooth/btmrvl_drv.h  |  4 --
 drivers/bluetooth/btmrvl_main.c | 92 ++++++++---------------------------------
 drivers/bluetooth/btmrvl_sdio.c |  9 +---
 drivers/bluetooth/btmrvl_sdio.h |  2 -
 4 files changed, 18 insertions(+), 89 deletions(-)

diff --git a/drivers/bluetooth/btmrvl_drv.h b/drivers/bluetooth/btmrvl_drv.h
index f9d1833..be76851 100644
--- a/drivers/bluetooth/btmrvl_drv.h
+++ b/drivers/bluetooth/btmrvl_drv.h
@@ -23,8 +23,6 @@
 #include <linux/bitops.h>
 #include <linux/slab.h>
 #include <net/bluetooth/bluetooth.h>
-#include <linux/ctype.h>
-#include <linux/firmware.h>
 
 #define BTM_HEADER_LEN			4
 #define BTM_UPLD_SIZE			2312
@@ -43,8 +41,6 @@ struct btmrvl_thread {
 struct btmrvl_device {
 	void *card;
 	struct hci_dev *hcidev;
-	struct device *dev;
-	const char *cal_data;
 
 	u8 dev_type;
 
diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_main.c
index 5cf31c4..a17812d 100644
--- a/drivers/bluetooth/btmrvl_main.c
+++ b/drivers/bluetooth/btmrvl_main.c
@@ -19,7 +19,7 @@
  **/
 
 #include <linux/module.h>
-
+#include <linux/of.h>
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/hci_core.h>
 
@@ -417,52 +417,8 @@ static int btmrvl_open(struct hci_dev *hdev)
 	return 0;
 }
 
-/*
- * This function parses provided calibration data input. It should contain
- * hex bytes separated by space or new line character. Here is an example.
- * 00 1C 01 37 FF FF FF FF 02 04 7F 01
- * CE BA 00 00 00 2D C6 C0 00 00 00 00
- * 00 F0 00 00
- */
-static int btmrvl_parse_cal_cfg(const u8 *src, u32 len, u8 *dst, u32 dst_size)
-{
-	const u8 *s = src;
-	u8 *d = dst;
-	int ret;
-	u8 tmp[3];
-
-	tmp[2] = '\0';
-	while ((s - src) <= len - 2) {
-		if (isspace(*s)) {
-			s++;
-			continue;
-		}
-
-		if (isxdigit(*s)) {
-			if ((d - dst) >= dst_size) {
-				BT_ERR("calibration data file too big!!!");
-				return -EINVAL;
-			}
-
-			memcpy(tmp, s, 2);
-
-			ret = kstrtou8(tmp, 16, d++);
-			if (ret < 0)
-				return ret;
-
-			s += 2;
-		} else {
-			return -EINVAL;
-		}
-	}
-	if (d == dst)
-		return -EINVAL;
-
-	return 0;
-}
-
-static int btmrvl_load_cal_data(struct btmrvl_private *priv,
-				u8 *config_data)
+static int btmrvl_download_cal_data(struct btmrvl_private *priv,
+				    u8 *config_data)
 {
 	int i, ret;
 	u8 data[BT_CMD_DATA_SIZE];
@@ -490,54 +446,40 @@ static int btmrvl_load_cal_data(struct btmrvl_private *priv,
 	return 0;
 }
 
-static int
-btmrvl_process_cal_cfg(struct btmrvl_private *priv, u8 *data, u32 size)
+static int btmrvl_cal_data_dt(struct btmrvl_private *priv)
 {
+	struct device_node *dt_node;
 	u8 cal_data[BT_CAL_DATA_SIZE];
+	const char name[] = "btmrvl_caldata";
+	const char property[] = "btmrvl,caldata";
 	int ret;
 
-	ret = btmrvl_parse_cal_cfg(data, size, cal_data, sizeof(cal_data));
+	dt_node = of_find_node_by_name(NULL, name);
+	if (!dt_node)
+		return -ENODEV;
+
+	ret = of_property_read_u8_array(dt_node, property, cal_data,
+					sizeof(cal_data));
 	if (ret)
 		return ret;
 
-	ret = btmrvl_load_cal_data(priv, cal_data);
+	BT_DBG("Use cal data from device tree");
+	ret = btmrvl_download_cal_data(priv, cal_data);
 	if (ret) {
-		BT_ERR("Fail to load calibrate data");
+		BT_ERR("Fail to download calibrate data");
 		return ret;
 	}
 
 	return 0;
 }
 
-static int btmrvl_cal_data_config(struct btmrvl_private *priv)
-{
-	const struct firmware *cfg;
-	int ret;
-	const char *cal_data = priv->btmrvl_dev.cal_data;
-
-	if (!cal_data)
-		return 0;
-
-	ret = request_firmware(&cfg, cal_data, priv->btmrvl_dev.dev);
-	if (ret < 0) {
-		BT_DBG("Failed to get %s file, skipping cal data download",
-		       cal_data);
-		return 0;
-	}
-
-	ret = btmrvl_process_cal_cfg(priv, (u8 *)cfg->data, cfg->size);
-	release_firmware(cfg);
-	return ret;
-}
-
 static int btmrvl_setup(struct hci_dev *hdev)
 {
 	struct btmrvl_private *priv = hci_get_drvdata(hdev);
 
 	btmrvl_send_module_cfg_cmd(priv, MODULE_BRINGUP_REQ);
 
-	if (btmrvl_cal_data_config(priv))
-		BT_ERR("Set cal data failed");
+	btmrvl_cal_data_dt(priv);
 
 	priv->btmrvl_dev.psmode = 1;
 	btmrvl_enable_ps(priv);
diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
index fabcf5b..1b52c9f 100644
--- a/drivers/bluetooth/btmrvl_sdio.c
+++ b/drivers/bluetooth/btmrvl_sdio.c
@@ -18,6 +18,7 @@
  * this warranty disclaimer.
  **/
 
+#include <linux/firmware.h>
 #include <linux/slab.h>
 
 #include <linux/mmc/sdio_ids.h>
@@ -101,7 +102,6 @@ static const struct btmrvl_sdio_card_reg btmrvl_reg_88xx = {
 static const struct btmrvl_sdio_device btmrvl_sdio_sd8688 = {
 	.helper		= "mrvl/sd8688_helper.bin",
 	.firmware	= "mrvl/sd8688.bin",
-	.cal_data	= NULL,
 	.reg		= &btmrvl_reg_8688,
 	.sd_blksz_fw_dl	= 64,
 };
@@ -109,7 +109,6 @@ static const struct btmrvl_sdio_device btmrvl_sdio_sd8688 = {
 static const struct btmrvl_sdio_device btmrvl_sdio_sd8787 = {
 	.helper		= NULL,
 	.firmware	= "mrvl/sd8787_uapsta.bin",
-	.cal_data	= NULL,
 	.reg		= &btmrvl_reg_87xx,
 	.sd_blksz_fw_dl	= 256,
 };
@@ -117,7 +116,6 @@ static const struct btmrvl_sdio_device btmrvl_sdio_sd8787 = {
 static const struct btmrvl_sdio_device btmrvl_sdio_sd8797 = {
 	.helper		= NULL,
 	.firmware	= "mrvl/sd8797_uapsta.bin",
-	.cal_data	= "mrvl/sd8797_caldata.conf",
 	.reg		= &btmrvl_reg_87xx,
 	.sd_blksz_fw_dl	= 256,
 };
@@ -125,7 +123,6 @@ static const struct btmrvl_sdio_device btmrvl_sdio_sd8797 = {
 static const struct btmrvl_sdio_device btmrvl_sdio_sd8897 = {
 	.helper		= NULL,
 	.firmware	= "mrvl/sd8897_uapsta.bin",
-	.cal_data	= NULL,
 	.reg		= &btmrvl_reg_88xx,
 	.sd_blksz_fw_dl	= 256,
 };
@@ -1007,7 +1004,6 @@ static int btmrvl_sdio_probe(struct sdio_func *func,
 		struct btmrvl_sdio_device *data = (void *) id->driver_data;
 		card->helper = data->helper;
 		card->firmware = data->firmware;
-		card->cal_data = data->cal_data;
 		card->reg = data->reg;
 		card->sd_blksz_fw_dl = data->sd_blksz_fw_dl;
 	}
@@ -1036,8 +1032,6 @@ static int btmrvl_sdio_probe(struct sdio_func *func,
 	}
 
 	card->priv = priv;
-	priv->btmrvl_dev.dev = &card->func->dev;
-	priv->btmrvl_dev.cal_data = card->cal_data;
 
 	/* Initialize the interface specific function pointers */
 	priv->hw_host_to_card = btmrvl_sdio_host_to_card;
@@ -1220,5 +1214,4 @@ MODULE_FIRMWARE("mrvl/sd8688_helper.bin");
 MODULE_FIRMWARE("mrvl/sd8688.bin");
 MODULE_FIRMWARE("mrvl/sd8787_uapsta.bin");
 MODULE_FIRMWARE("mrvl/sd8797_uapsta.bin");
-MODULE_FIRMWARE("mrvl/sd8797_caldata.conf");
 MODULE_FIRMWARE("mrvl/sd8897_uapsta.bin");
diff --git a/drivers/bluetooth/btmrvl_sdio.h b/drivers/bluetooth/btmrvl_sdio.h
index 6872d9e..43d35a6 100644
--- a/drivers/bluetooth/btmrvl_sdio.h
+++ b/drivers/bluetooth/btmrvl_sdio.h
@@ -85,7 +85,6 @@ struct btmrvl_sdio_card {
 	u32 ioport;
 	const char *helper;
 	const char *firmware;
-	const char *cal_data;
 	const struct btmrvl_sdio_card_reg *reg;
 	u16 sd_blksz_fw_dl;
 	u8 rx_unit;
@@ -95,7 +94,6 @@ struct btmrvl_sdio_card {
 struct btmrvl_sdio_device {
 	const char *helper;
 	const char *firmware;
-	const char *cal_data;
 	const struct btmrvl_sdio_card_reg *reg;
 	u16 sd_blksz_fw_dl;
 };
-- 
1.8.0

^ permalink raw reply related

* Re: [PATCH] android: Add support for setting adapters name
From: Johan Hedberg @ 2013-10-31 19:32 UTC (permalink / raw)
  To: Grzegorz Kolodziejczyk; +Cc: linux-bluetooth
In-Reply-To: <1383233182-7188-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

Hi Grzegorz,

On Thu, Oct 31, 2013, Grzegorz Kolodziejczyk wrote:
> ---
>  android/adapter.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 53 insertions(+)

Applied. Thanks.

Johan

^ permalink raw reply

* Re: [PATCH 5/5] android: Pass found uuids to remote_device_properties_cb
From: Luiz Augusto von Dentz @ 2013-10-31 18:27 UTC (permalink / raw)
  To: Szymon Janc; +Cc: linux-bluetooth@vger.kernel.org, Marcin Kraglak
In-Reply-To: <1383233152-15040-5-git-send-email-szymon.janc@tieto.com>

Hi Marcin,

On Thu, Oct 31, 2013 at 5:25 PM, Szymon Janc <szymon.janc@tieto.com> wrote:
> From: Marcin Kraglak <marcin.kraglak@tieto.com>
>
> Change-Id: I21221033cf3510113b4014bdacb64e25b7d16ba9

Im not sure where this came from but it probably doesn't mean anything to us.

> ---
>  android/adapter.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 82 insertions(+), 1 deletion(-)
>
> diff --git a/android/adapter.c b/android/adapter.c
> index 48e5e95..3d3cd72 100644
> --- a/android/adapter.c
> +++ b/android/adapter.c
> @@ -1242,9 +1242,89 @@ static void browse_req_free(struct browse_req *req)
>         g_free(req);
>  }
>
> +static void fill_uuids(GSList *list, void *buf)
> +{
> +       int i, len = g_slist_length(list);
> +
> +       for (i = 0; i < len; i++) {
> +               memcpy(buf, g_slist_nth_data(list, i), sizeof(uint128_t));

Ok, this is highly inefficient since afaik g_slist_nth_data will
iterate in the list for every index, please use g_slist_foreach or
iterate with g_slist_next or ->next.



-- 
Luiz Augusto von Dentz

^ permalink raw reply

* [PATCH BlueZ 2/2] android/hid: Initial implementation for uHID
From: Luiz Augusto von Dentz @ 2013-10-31 15:57 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1383235026-12247-1-git-send-email-luiz.dentz@gmail.com>

From: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>

This patch reads data on interrupt channel and feeds into uHID.
Kernel will take care rest of the things and connects bt mouse
and keyboard:

[168988.557647] input: bluez-input-device as /devices/virtual/misc/uhid/input54
---
 android/hid.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 125 insertions(+), 4 deletions(-)

diff --git a/android/hid.c b/android/hid.c
index 6b3b1f7..68dcec7 100644
--- a/android/hid.c
+++ b/android/hid.c
@@ -37,6 +37,7 @@
 #include "src/shared/mgmt.h"
 #include "src/sdp-client.h"
 #include "src/glib-helper.h"
+#include "profiles/input/uhid_copy.h"
 
 #include "log.h"
 #include "hal-msg.h"
@@ -47,7 +48,7 @@
 
 #define L2CAP_PSM_HIDP_CTRL	0x11
 #define L2CAP_PSM_HIDP_INTR	0x13
-#define MAX_READ_BUFFER		4096
+#define UHID_DEVICE_FILE	"/dev/uhid"
 
 static GIOChannel *notification_io = NULL;
 static GIOChannel *ctrl_io = NULL;
@@ -67,6 +68,8 @@ struct hid_device {
 	GIOChannel	*intr_io;
 	guint		ctrl_watch;
 	guint		intr_watch;
+	int		uhid_fd;
+	guint		uhid_watch_id;
 };
 
 static int device_cmp(gconstpointer s, gconstpointer user_data)
@@ -77,6 +80,21 @@ static int device_cmp(gconstpointer s, gconstpointer user_data)
 	return bacmp(&hdev->dst, dst);
 }
 
+static void uhid_destroy(int fd)
+{
+	struct uhid_event ev;
+
+	/* destroy uHID device */
+	memset(&ev, 0, sizeof(ev));
+	ev.type = UHID_DESTROY;
+
+	if (write(fd, &ev, sizeof(ev)) < 0)
+		error("Failed to destroy uHID device: %s (%d)",
+						strerror(errno), errno);
+
+	close(fd);
+}
+
 static void hid_device_free(struct hid_device *hdev)
 {
 	if (hdev->ctrl_watch > 0)
@@ -91,17 +109,63 @@ static void hid_device_free(struct hid_device *hdev)
 	if (hdev->ctrl_io)
 		g_io_channel_unref(hdev->ctrl_io);
 
+	if (hdev->uhid_watch_id) {
+		g_source_remove(hdev->uhid_watch_id);
+		hdev->uhid_watch_id = 0;
+	}
+
+	if (hdev->uhid_fd > 0)
+		uhid_destroy(hdev->uhid_fd);
+
 	g_free(hdev->rd_data);
 
 	devices = g_slist_remove(devices, hdev);
 	g_free(hdev);
 }
 
+static gboolean uhid_event_cb(GIOChannel *io, GIOCondition cond,
+							gpointer user_data)
+{
+	struct hid_device *hdev = user_data;
+	struct uhid_event ev;
+	ssize_t bread;
+	int fd;
+
+	DBG("");
+
+	if (cond & (G_IO_ERR | G_IO_NVAL))
+		goto failed;
+
+	fd = g_io_channel_unix_get_fd(io);
+	memset(&ev, 0, sizeof(ev));
+
+	bread = read(fd, &ev, sizeof(ev));
+	if (bread < 0) {
+		DBG("read: %s (%d)", strerror(errno), errno);
+		goto failed;
+	}
+
+	DBG("uHID event type %d received", ev.type);
+	/* TODO Handle events */
+
+	return TRUE;
+
+failed:
+	hdev->uhid_watch_id = 0;
+	return FALSE;
+}
+
 static gboolean intr_io_watch_cb(GIOChannel *chan, gpointer data)
 {
-	char buf[MAX_READ_BUFFER];
+	struct hid_device *hdev = data;
+	uint8_t buf[UHID_DATA_MAX];
+	struct uhid_event ev;
 	int fd, bread;
 
+	/* Wait uHID if not ready */
+	if (hdev->uhid_fd < 0)
+		return TRUE;
+
 	fd = g_io_channel_unix_get_fd(chan);
 	bread = read(fd, buf, sizeof(buf));
 	if (bread < 0) {
@@ -109,7 +173,18 @@ static gboolean intr_io_watch_cb(GIOChannel *chan, gpointer data)
 		return TRUE;
 	}
 
-	DBG("bytes read %d", bread);
+	/* Discard non-data packets */
+	if (bread == 0 || buf[0] != 0xA1)
+		return TRUE;
+
+	/* send data to uHID device skipping HIDP header byte */
+	memset(&ev, 0, sizeof(ev));
+	ev.type = UHID_INPUT;
+	ev.u.input.size = bread - 1;
+	memcpy(ev.u.input.data, &buf[1], ev.u.input.size);
+
+	if (write(hdev->uhid_fd, &ev, sizeof(ev)) < 0)
+		DBG("write: %s (%d)", strerror(errno), errno);
 
 	return TRUE;
 }
@@ -185,6 +260,44 @@ static gboolean ctrl_watch_cb(GIOChannel *chan, GIOCondition cond,
 	return FALSE;
 }
 
+static int uhid_create(struct hid_device *hdev)
+{
+	GIOCondition cond = G_IO_IN | G_IO_ERR | G_IO_NVAL;
+	GIOChannel *io;
+	struct uhid_event ev;
+
+	hdev->uhid_fd = open(UHID_DEVICE_FILE, O_RDWR | O_CLOEXEC);
+	if (hdev->uhid_fd < 0) {
+		error("Failed to open uHID device: %s", strerror(errno));
+		return -errno;
+	}
+
+	memset(&ev, 0, sizeof(ev));
+	ev.type = UHID_CREATE;
+	strcpy((char *) ev.u.create.name, "bluez-input-device");
+	ev.u.create.bus = BUS_BLUETOOTH;
+	ev.u.create.vendor = hdev->vendor;
+	ev.u.create.product = hdev->product;
+	ev.u.create.version = hdev->vendor;
+	ev.u.create.country = hdev->country;
+	ev.u.create.rd_size = hdev->rd_size;
+	ev.u.create.rd_data = hdev->rd_data;
+
+	if (write(hdev->uhid_fd, &ev, sizeof(ev)) < 0) {
+		error("Failed to create uHID device: %s", strerror(errno));
+		close(hdev->uhid_fd);
+		hdev->uhid_fd = -1;
+		return -errno;
+	}
+
+	io = g_io_channel_unix_new(hdev->uhid_fd);
+	g_io_channel_set_encoding(io, NULL, NULL);
+	hdev->uhid_watch_id = g_io_add_watch(io, cond, uhid_event_cb, hdev);
+	g_io_channel_unref(io);
+
+	return 0;
+}
+
 static void interrupt_connect_cb(GIOChannel *chan, GError *conn_err,
 							gpointer user_data)
 {
@@ -195,6 +308,9 @@ static void interrupt_connect_cb(GIOChannel *chan, GError *conn_err,
 	if (conn_err)
 		goto failed;
 
+	if (uhid_create(hdev) < 0)
+		goto failed;
+
 	hdev->intr_watch = g_io_add_watch(hdev->intr_io,
 				G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
 				intr_watch_cb, hdev);
@@ -321,8 +437,11 @@ static void hid_sdp_search_cb(sdp_list_t *recs, int err, gpointer data)
 		}
 	}
 
-	if (hdev->ctrl_io)
+	if (hdev->ctrl_io) {
+		if (uhid_create(hdev) < 0)
+			goto fail;
 		return;
+	}
 
 	hdev->ctrl_io = bt_io_connect(control_connect_cb, hdev, NULL, &gerr,
 					BT_IO_OPT_SOURCE_BDADDR, src,
@@ -365,6 +484,7 @@ static uint8_t bt_hid_connect(struct hal_cmd_hid_connect *cmd, uint16_t len)
 
 	hdev = g_new0(struct hid_device, 1);
 	bacpy(&hdev->dst, &dst);
+	hdev->uhid_fd = -1;
 
 	ba2str(&hdev->dst, addr);
 	DBG("connecting to %s", addr);
@@ -472,6 +592,7 @@ static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
 		hdev = g_new0(struct hid_device, 1);
 		bacpy(&hdev->dst, &dst);
 		hdev->ctrl_io = g_io_channel_ref(chan);
+		hdev->uhid_fd = -1;
 
 		bt_string2uuid(&uuid, HID_UUID);
 		if (bt_search_service(src, &hdev->dst, &uuid,
-- 
1.8.3.1


^ permalink raw reply related

* [PATCH BlueZ 1/2] android/hid: Fetch record before attempting to connect
From: Luiz Augusto von Dentz @ 2013-10-31 15:57 UTC (permalink / raw)
  To: linux-bluetooth

From: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>

This patch fetch HID record and store the information needed by uHID.
---
 android/Android.mk  |   4 +-
 android/Makefile.am |   4 +-
 android/hid.c       | 134 +++++++++++++++++++++++++++++++++++++++++++++-------
 3 files changed, 122 insertions(+), 20 deletions(-)

diff --git a/android/Android.mk b/android/Android.mk
index 72ea8b8..d2afa09 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -35,7 +35,9 @@ LOCAL_SRC_FILES := \
 	../lib/sdp.c \
 	../lib/bluetooth.c \
 	../lib/hci.c \
-	../btio/btio.c
+	../btio/btio.c \
+	../src/sdp-client.c \
+	../src/glib-helper.c
 
 LOCAL_C_INCLUDES := \
 	$(call include-path-for, glib) \
diff --git a/android/Makefile.am b/android/Makefile.am
index c5b70ab..ac92510 100644
--- a/android/Makefile.am
+++ b/android/Makefile.am
@@ -13,7 +13,9 @@ android_bluetoothd_SOURCES =	android/main.c \
 				android/hid.h android/hid.c \
 				android/ipc.h android/ipc.c \
 				android/socket.h android/socket.c \
-				btio/btio.h btio/btio.c
+				btio/btio.h btio/btio.c \
+				src/sdp-client.h src/sdp-client.c \
+				src/glib-helper.h src/glib-helper.c
 
 android_bluetoothd_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
 
diff --git a/android/hid.c b/android/hid.c
index 5caa25b..6b3b1f7 100644
--- a/android/hid.c
+++ b/android/hid.c
@@ -31,7 +31,12 @@
 
 #include "btio/btio.h"
 #include "lib/bluetooth.h"
+#include "lib/sdp.h"
+#include "lib/sdp_lib.h"
+#include "lib/uuid.h"
 #include "src/shared/mgmt.h"
+#include "src/sdp-client.h"
+#include "src/glib-helper.h"
 
 #include "log.h"
 #include "hal-msg.h"
@@ -52,6 +57,12 @@ static GSList *devices = NULL;
 struct hid_device {
 	bdaddr_t	dst;
 	uint8_t		state;
+	uint16_t	vendor;
+	uint16_t	product;
+	uint16_t	version;
+	uint8_t		country;
+	int		rd_size;
+	void		*rd_data;
 	GIOChannel	*ctrl_io;
 	GIOChannel	*intr_io;
 	guint		ctrl_watch;
@@ -80,6 +91,8 @@ static void hid_device_free(struct hid_device *hdev)
 	if (hdev->ctrl_io)
 		g_io_channel_unref(hdev->ctrl_io);
 
+	g_free(hdev->rd_data);
+
 	devices = g_slist_remove(devices, hdev);
 	g_free(hdev);
 }
@@ -98,10 +111,6 @@ static gboolean intr_io_watch_cb(GIOChannel *chan, gpointer data)
 
 	DBG("bytes read %d", bread);
 
-	/* TODO: At this moment only baseband is connected, i.e. mouse
-	 * movements keyboard events doesn't effect on UI. Have to send
-	 * this data to uhid fd for profile connection. */
-
 	return TRUE;
 }
 
@@ -186,8 +195,6 @@ static void interrupt_connect_cb(GIOChannel *chan, GError *conn_err,
 	if (conn_err)
 		goto failed;
 
-	/*TODO: Get device details through SDP and create UHID fd and start
-	 * listening on uhid events */
 	hdev->intr_watch = g_io_add_watch(hdev->intr_io,
 				G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
 				intr_watch_cb, hdev);
@@ -250,14 +257,100 @@ failed:
 	hid_device_free(hdev);
 }
 
+static void hid_sdp_search_cb(sdp_list_t *recs, int err, gpointer data)
+{
+	struct hid_device *hdev = data;
+	sdp_list_t *list;
+	GError *gerr = NULL;
+	const bdaddr_t *src = bt_adapter_get_address();
+
+	DBG("");
+
+	if (err < 0) {
+		error("Unable to get SDP record: %s", strerror(-err));
+		goto fail;
+	}
+
+	if (!recs || !recs->data) {
+		error("No SDP records found");
+		goto fail;
+	}
+
+	for (list = recs; list != NULL; list = list->next) {
+		sdp_record_t *rec = list->data;
+		sdp_data_t *data;
+
+		data = sdp_data_get(rec, SDP_ATTR_VENDOR_ID);
+		if (data)
+			hdev->vendor = data->val.uint16;
+
+		data = sdp_data_get(rec, SDP_ATTR_PRODUCT_ID);
+		if (data)
+			hdev->product = data->val.uint16;
+
+		data = sdp_data_get(rec, SDP_ATTR_VERSION);
+		if (data)
+			hdev->version = data->val.uint16;
+
+		data = sdp_data_get(rec, SDP_ATTR_HID_COUNTRY_CODE);
+		if (data)
+			hdev->country = data->val.uint8;
+
+		data = sdp_data_get(rec, SDP_ATTR_HID_DESCRIPTOR_LIST);
+		if (data) {
+			if (!SDP_IS_SEQ(data->dtd))
+				goto fail;
+
+			/* First HIDDescriptor */
+			data = data->val.dataseq;
+			if (!SDP_IS_SEQ(data->dtd))
+				goto fail;
+
+			/* ClassDescriptorType */
+			data = data->val.dataseq;
+			if (data->dtd != SDP_UINT8)
+				goto fail;
+
+			/* ClassDescriptorData */
+			data = data->next;
+			if (!data || !SDP_IS_TEXT_STR(data->dtd))
+				goto fail;
+
+			hdev->rd_size = data->unitSize;
+			hdev->rd_data = g_memdup(data->val.str, data->unitSize);
+		}
+	}
+
+	if (hdev->ctrl_io)
+		return;
+
+	hdev->ctrl_io = bt_io_connect(control_connect_cb, hdev, NULL, &gerr,
+					BT_IO_OPT_SOURCE_BDADDR, src,
+					BT_IO_OPT_DEST_BDADDR, &hdev->dst,
+					BT_IO_OPT_PSM, L2CAP_PSM_HIDP_CTRL,
+					BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_LOW,
+					BT_IO_OPT_INVALID);
+	if (gerr) {
+		error("%s", gerr->message);
+		g_error_free(gerr);
+		goto fail;
+	}
+
+	return;
+
+fail:
+	bt_hid_set_state(hdev, HAL_HID_STATE_DISCONNECTED);
+	hid_device_free(hdev);
+}
+
 static uint8_t bt_hid_connect(struct hal_cmd_hid_connect *cmd, uint16_t len)
 {
 	struct hid_device *hdev;
 	char addr[18];
 	bdaddr_t dst;
 	GSList *l;
-	GError *err = NULL;
 	const bdaddr_t *src = bt_adapter_get_address();
+	uuid_t uuid;
 
 	DBG("");
 
@@ -271,20 +364,15 @@ static uint8_t bt_hid_connect(struct hal_cmd_hid_connect *cmd, uint16_t len)
 		return HAL_STATUS_FAILED;
 
 	hdev = g_new0(struct hid_device, 1);
-	android2bdaddr(&cmd->bdaddr, &hdev->dst);
-	ba2str(&hdev->dst, addr);
+	bacpy(&hdev->dst, &dst);
 
+	ba2str(&hdev->dst, addr);
 	DBG("connecting to %s", addr);
 
-	hdev->ctrl_io = bt_io_connect(control_connect_cb, hdev, NULL, &err,
-					BT_IO_OPT_SOURCE_BDADDR, src,
-					BT_IO_OPT_DEST_BDADDR, &hdev->dst,
-					BT_IO_OPT_PSM, L2CAP_PSM_HIDP_CTRL,
-					BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_LOW,
-					BT_IO_OPT_INVALID);
-	if (err) {
-		error("%s", err->message);
-		g_error_free(err);
+	bt_string2uuid(&uuid, HID_UUID);
+	if (bt_search_service(src, &hdev->dst, &uuid, hid_sdp_search_cb, hdev,
+								NULL) < 0) {
+		error("Failed to search sdp details");
 		hid_device_free(hdev);
 		return HAL_STATUS_FAILED;
 	}
@@ -354,6 +442,8 @@ static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
 	uint16_t psm;
 	GError *gerr = NULL;
 	GSList *l;
+	const bdaddr_t *src = bt_adapter_get_address();
+	uuid_t uuid;
 
 	if (err) {
 		error("%s", err->message);
@@ -383,6 +473,14 @@ static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
 		bacpy(&hdev->dst, &dst);
 		hdev->ctrl_io = g_io_channel_ref(chan);
 
+		bt_string2uuid(&uuid, HID_UUID);
+		if (bt_search_service(src, &hdev->dst, &uuid,
+					hid_sdp_search_cb, hdev, NULL) < 0) {
+			error("failed to search sdp details");
+			hid_device_free(hdev);
+			return;
+		}
+
 		devices = g_slist_append(devices, hdev);
 
 		hdev->ctrl_watch = g_io_add_watch(hdev->ctrl_io,
-- 
1.8.3.1


^ permalink raw reply related

* [RFC] hidhost: Shutdown HID L2CAP sockets on unregister
From: Andrei Emeltchenko @ 2013-10-31 15:30 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Fixes address already in use issue if we reenable HID.
...
bluetoothd[2894]: Failed to listen on ctrl channel:
	l2cap_bind: Address already in use (98)
...
---
 android/hid.c |   14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/android/hid.c b/android/hid.c
index 4075ecb..2bc8c06 100644
--- a/android/hid.c
+++ b/android/hid.c
@@ -445,9 +445,15 @@ void bt_hid_unregister(void)
 	g_io_channel_unref(notification_io);
 	notification_io = NULL;
 
-	g_io_channel_unref(ctrl_io);
-	ctrl_io = NULL;
+	if (ctrl_io) {
+		g_io_channel_shutdown(ctrl_io, TRUE, NULL);
+		g_io_channel_unref(ctrl_io);
+		ctrl_io = NULL;
+	}
 
-	g_io_channel_unref(intr_io);
-	intr_io = NULL;
+	if (intr_io) {
+		g_io_channel_shutdown(intr_io, TRUE, NULL);
+		g_io_channel_unref(intr_io);
+		intr_io = NULL;
+	}
 }
-- 
1.7.10.4


^ permalink raw reply related

* [PATCH] android: Add support for setting adapters name
From: Grzegorz Kolodziejczyk @ 2013-10-31 15:26 UTC (permalink / raw)
  To: linux-bluetooth

---
 android/adapter.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)

diff --git a/android/adapter.c b/android/adapter.c
index 15b65e5..5dadc2e 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -129,6 +129,27 @@ static void scan_mode_changed(void)
 	g_free(ev);
 }
 
+static void adapter_name_changed(const uint8_t *name)
+{
+	struct hal_ev_adapter_props_changed *ev;
+	uint8_t buf[sizeof(*ev) + sizeof(struct hal_property) +
+							HAL_MAX_NAME_LENGTH];
+
+	memset(buf, 0, sizeof(buf));
+	ev = (void *) buf;
+
+	ev->num_props = 1;
+	ev->status = HAL_STATUS_SUCCESS;
+	ev->props[0].type = HAL_PROP_ADAPTER_NAME;
+	ev->props[0].len = HAL_MAX_NAME_LENGTH;
+	memcpy(ev->props->val, name, HAL_MAX_NAME_LENGTH);
+
+	DBG("Adapter name changed to: %s", ev->props->val);
+
+	ipc_send(notification_io, HAL_SERVICE_ID_BLUETOOTH,
+			HAL_EV_ADAPTER_PROPS_CHANGED, sizeof(buf), ev, -1);
+}
+
 static void settings_changed(uint32_t settings)
 {
 	uint32_t changed_mask;
@@ -286,6 +307,37 @@ static bool set_mode(uint16_t opcode, uint8_t mode)
 	return false;
 }
 
+static void set_adapter_name_complete(uint8_t status, uint16_t length,
+					const void *param, void *user_data)
+{
+	const struct mgmt_cp_set_local_name *rp = param;
+
+	if (status != MGMT_STATUS_SUCCESS) {
+		error("Failed to set name: %s (0x%02x)",
+						mgmt_errstr(status), status);
+		return;
+	}
+
+	adapter_name_changed(rp->name);
+}
+
+static bool set_adapter_name(uint8_t *name, uint16_t len)
+{
+	struct mgmt_cp_set_local_name cp;
+
+	memset(&cp, 0, sizeof(cp));
+	memcpy(cp.name, name, len);
+
+	if (mgmt_send(adapter->mgmt, MGMT_OP_SET_LOCAL_NAME, adapter->index,
+			sizeof(cp), &cp, set_adapter_name_complete, NULL,
+								NULL) > 0)
+		return true;
+
+	error("Failed to set name");
+
+	return false;
+}
+
 static void read_info_complete(uint8_t status, uint16_t length, const void *param,
 							void *user_data)
 {
@@ -472,6 +524,7 @@ static uint8_t set_property(void *buf, uint16_t len)
 	case HAL_PROP_ADAPTER_SCAN_MODE:
 		return set_scan_mode(cmd->val, cmd->len);
 	case HAL_PROP_ADAPTER_NAME:
+		return set_adapter_name(cmd->val, cmd->len);
 	case HAL_PROP_ADAPTER_DISC_TIMEOUT:
 	default:
 		DBG("Unhandled property type 0x%x", cmd->type);
-- 
1.8.4.1


^ permalink raw reply related

* [PATCH 5/5] android: Pass found uuids to remote_device_properties_cb
From: Szymon Janc @ 2013-10-31 15:25 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Marcin Kraglak
In-Reply-To: <1383233152-15040-1-git-send-email-szymon.janc@tieto.com>

From: Marcin Kraglak <marcin.kraglak@tieto.com>

Change-Id: I21221033cf3510113b4014bdacb64e25b7d16ba9
---
 android/adapter.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 82 insertions(+), 1 deletion(-)

diff --git a/android/adapter.c b/android/adapter.c
index 48e5e95..3d3cd72 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -1242,9 +1242,89 @@ static void browse_req_free(struct browse_req *req)
 	g_free(req);
 }
 
+static void fill_uuids(GSList *list, void *buf)
+{
+	int i, len = g_slist_length(list);
+
+	for (i = 0; i < len; i++) {
+		memcpy(buf, g_slist_nth_data(list, i), sizeof(uint128_t));
+		buf += sizeof(uint128_t);
+	}
+}
+
+static void remote_uuids_callback(struct browse_req *req)
+{
+	struct hal_ev_remote_device_props *ev;
+	int len;
+
+	len = sizeof(*ev) + sizeof(struct hal_property) + (sizeof(uint128_t) *
+						g_slist_length(req->uuids));
+	ev = g_malloc(len);
+
+	ev->status = HAL_STATUS_SUCCESS;
+	bdaddr2android(req->bdaddr, &ev->bdaddr);
+	ev->num_props = 1;
+	ev->props[0].type = HAL_PROP_DEVICE_UUIDS;
+	ev->props[0].len = sizeof(uint128_t) * g_slist_length(req->uuids);
+	fill_uuids(req->uuids, ev->props[0].val);
+
+	ipc_send(notification_io, HAL_SERVICE_ID_BLUETOOTH,
+				HAL_EV_REMOTE_DEVICE_PROPS, len, ev, -1);
+
+	g_free(ev);
+}
+
+static int uuid_128_cmp(gconstpointer a, gconstpointer b)
+{
+	return memcmp(a, b, sizeof(uint128_t));
+}
+
 static void update_records(struct browse_req *req, sdp_list_t *recs)
 {
-	/* TODO cache found uuids */
+	for (; recs; recs = recs->next) {
+		sdp_record_t *rec = (sdp_record_t *) recs->data;
+		sdp_list_t *svcclass = NULL;
+		uuid_t uuid128;
+		uuid_t *temp;
+		uint8_t *u;
+
+		if (!rec)
+			break;
+
+		if (sdp_get_service_classes(rec, &svcclass) < 0)
+			continue;
+
+		if (svcclass == NULL)
+			continue;
+
+		temp = svcclass->data;
+
+		switch (temp->type) {
+		case SDP_UUID16:
+			sdp_uuid16_to_uuid128(&uuid128, temp);
+			break;
+		case SDP_UUID32:
+			sdp_uuid32_to_uuid128(&uuid128, temp);
+			break;
+		case SDP_UUID128:
+			memcpy(&uuid128, temp, sizeof(uuid_t));
+			break;
+		default:
+			continue;
+		}
+
+		u = g_malloc(16);/* size of 128 bit uuid */
+		memcpy(u, &uuid128.value.uuid128,
+				sizeof(uuid128.value.uuid128));
+
+		/* Check if uuid is already added */
+		if (g_slist_find_custom(req->uuids, u, uuid_128_cmp))
+			g_free(u);
+		else
+			req->uuids = g_slist_append(req->uuids, u);
+
+		sdp_list_free(svcclass, free);
+	}
 }
 
 static void browse_cb(sdp_list_t *recs, int err, gpointer user_data)
@@ -1274,6 +1354,7 @@ static void browse_cb(sdp_list_t *recs, int err, gpointer user_data)
 	}
 
 done:
+	remote_uuids_callback(req);
 	sdp_req_list = g_list_remove(sdp_req_list, req->bdaddr);
 	browse_req_free(req);
 }
-- 
1.8.4.1


^ permalink raw reply related

* [PATCH 4/5] android: Initial implementation of get_remote_services
From: Szymon Janc @ 2013-10-31 15:25 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Marcin Kraglak
In-Reply-To: <1383233152-15040-1-git-send-email-szymon.janc@tieto.com>

From: Marcin Kraglak <marcin.kraglak@tieto.com>

Change-Id: I9dffb4d59be5d41c0c26d619b30289c0e52f3a2e
---
 android/Android.mk  |  1 +
 android/Makefile.am |  1 +
 android/adapter.c   | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 94 insertions(+), 1 deletion(-)

diff --git a/android/Android.mk b/android/Android.mk
index b953554..993f6d6 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -34,6 +34,7 @@ LOCAL_SRC_FILES := \
 	../src/sdpd-server.c \
 	../src/glib-helper.c \
 	../src/eir.c \
+	../src/sdp-client.c \
 	../lib/sdp.c \
 	../lib/bluetooth.c \
 	../lib/hci.c \
diff --git a/android/Makefile.am b/android/Makefile.am
index 17165e2..acaece2 100644
--- a/android/Makefile.am
+++ b/android/Makefile.am
@@ -9,6 +9,7 @@ android_bluetoothd_SOURCES =	android/main.c \
 				src/sdpd-service.c src/sdpd-request.c \
 				src/glib-helper.h src/glib-helper.c \
 				src/eir.h src/eir.c \
+				src/sdp-client.c src/sdp-client.h \
 				src/shared/util.h src/shared/util.c \
 				src/shared/mgmt.h src/shared/mgmt.c \
 				android/adapter.h android/adapter.c \
diff --git a/android/adapter.c b/android/adapter.c
index 6ee4a21..48e5e95 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -31,6 +31,10 @@
 #include "src/shared/mgmt.h"
 #include "src/glib-helper.h"
 #include "src/eir.h"
+#include "lib/sdp.h"
+#include "lib/sdp_lib.h"
+#include "lib/uuid.h"
+#include "src/sdp-client.h"
 #include "log.h"
 #include "hal-msg.h"
 #include "ipc.h"
@@ -41,6 +45,8 @@
 #define DEFAULT_IO_CAPABILITY 0x01
 
 static GIOChannel *notification_io = NULL;
+/* This list contains addresses which are asked for records */
+static GList *sdp_req_list;
 
 struct bt_adapter {
 	uint16_t index;
@@ -59,6 +65,20 @@ struct bt_adapter {
 	bool discovering;
 };
 
+struct browse_req {
+	bdaddr_t *bdaddr;
+	GSList *uuids;
+	int search_uuid;
+	int reconnect_attempt;
+};
+
+static const uint16_t uuid_list[] = {
+	L2CAP_UUID,
+	PNP_INFO_SVCLASS_ID,
+	PUBLIC_BROWSE_GROUP,
+	0
+};
+
 static struct bt_adapter *adapter;
 static GSList *found_devices = NULL;
 
@@ -1215,9 +1235,80 @@ static uint8_t ssp_reply(void *buf, uint16_t len)
 	return status;
 }
 
+static void browse_req_free(struct browse_req *req)
+{
+	g_free(req->bdaddr);
+	g_slist_free_full(req->uuids, g_free);
+	g_free(req);
+}
+
+static void update_records(struct browse_req *req, sdp_list_t *recs)
+{
+	/* TODO cache found uuids */
+}
+
+static void browse_cb(sdp_list_t *recs, int err, gpointer user_data)
+{
+	struct browse_req *req = user_data;
+	uuid_t uuid;
+
+	/* If we have a valid response and req->search_uuid == 2, then L2CAP
+	 * UUID & PNP searching was successful -- we are done */
+	if (err < 0 || req->search_uuid == 2) {
+		if (err == -ECONNRESET && req->reconnect_attempt < 1) {
+			req->search_uuid--;
+			req->reconnect_attempt++;
+		} else {
+			goto done;
+		}
+	}
+
+	update_records(req, recs);
+
+	/* Search for mandatory uuids */
+	if (uuid_list[req->search_uuid]) {
+		sdp_uuid16_create(&uuid, uuid_list[req->search_uuid++]);
+		bt_search_service(&adapter->bdaddr, req->bdaddr, &uuid,
+						browse_cb, user_data, NULL);
+		return;
+	}
+
+done:
+	sdp_req_list = g_list_remove(sdp_req_list, req->bdaddr);
+	browse_req_free(req);
+}
+
 static uint8_t get_remote_services(void *buf, uint16_t len)
 {
-	return HAL_STATUS_UNSUPPORTED;
+	struct hal_cmd_get_remote_services *cmd = buf;
+	struct browse_req *req;
+	bdaddr_t *addr;
+	uuid_t uuid;
+	int err;
+
+	addr = g_new0(bdaddr_t, 1);
+	android2bdaddr(&cmd->bdaddr, addr);
+
+	if (g_list_find_custom(sdp_req_list, addr, bdaddr_cmp)) {
+		g_free(addr);
+		return HAL_STATUS_DONE;
+	}
+
+	sdp_req_list = g_list_append(sdp_req_list, addr);
+
+	req = g_new0(struct browse_req, 1);
+	req->bdaddr = addr;
+	sdp_uuid16_create(&uuid, uuid_list[req->search_uuid++]);
+
+	err = bt_search_service(&adapter->bdaddr,
+			req->bdaddr, &uuid, browse_cb, req, NULL);
+	if (err) {
+		sdp_req_list = g_list_remove(sdp_req_list, req->bdaddr);
+		browse_req_free(req);
+		return HAL_STATUS_FAILED;
+	}
+
+	return HAL_STATUS_SUCCESS;
 }
 
 void bt_adapter_handle_cmd(GIOChannel *io, uint8_t opcode, void *buf,
-- 
1.8.4.1


^ permalink raw reply related

* [PATCH 3/5] android: Add stub for handling get_remote_services command
From: Szymon Janc @ 2013-10-31 15:25 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Marcin Kraglak
In-Reply-To: <1383233152-15040-1-git-send-email-szymon.janc@tieto.com>

From: Marcin Kraglak <marcin.kraglak@tieto.com>

Change-Id: I3a88c104a496fa3c3391b11dc85b6607861158f3
---
 android/adapter.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/android/adapter.c b/android/adapter.c
index 10d4a8e..6ee4a21 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -1215,6 +1215,11 @@ static uint8_t ssp_reply(void *buf, uint16_t len)
 	return status;
 }
 
+static uint8_t get_remote_services(void *buf, uint16_t len)
+{
+	return HAL_STATUS_UNSUPPORTED;
+}
+
 void bt_adapter_handle_cmd(GIOChannel *io, uint8_t opcode, void *buf,
 								uint16_t len)
 {
@@ -1308,6 +1313,11 @@ void bt_adapter_handle_cmd(GIOChannel *io, uint8_t opcode, void *buf,
 			goto error;
 
 		break;
+	case HAL_OP_GET_REMOTE_SERVICES:
+		status = get_remote_services(buf, len);
+		if (status != HAL_STATUS_SUCCESS)
+			goto error;
+		break;
 	default:
 		DBG("Unhandled command, opcode 0x%x", opcode);
 		goto error;
-- 
1.8.4.1


^ permalink raw reply related

* [PATCH 2/5] android/hal: Add support for sending get_remote_services command
From: Szymon Janc @ 2013-10-31 15:25 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Marcin Kraglak
In-Reply-To: <1383233152-15040-1-git-send-email-szymon.janc@tieto.com>

From: Marcin Kraglak <marcin.kraglak@tieto.com>

Change-Id: I99c92d8a3f3d915d1e06ecad2515fcbcbb5b660a
---
 android/hal-bluetooth.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/android/hal-bluetooth.c b/android/hal-bluetooth.c
index a6228d7..4eab869 100644
--- a/android/hal-bluetooth.c
+++ b/android/hal-bluetooth.c
@@ -476,12 +476,18 @@ static int get_remote_service_record(bt_bdaddr_t *remote_addr, bt_uuid_t *uuid)
 
 static int get_remote_services(bt_bdaddr_t *remote_addr)
 {
+	struct hal_cmd_get_remote_services cmd;
+
 	DBG("");
 
 	if (!interface_ready())
 		return BT_STATUS_NOT_READY;
 
-	return BT_STATUS_UNSUPPORTED;
+	memcpy(cmd.bdaddr, remote_addr, sizeof(cmd.bdaddr));
+
+	return hal_ipc_cmd(HAL_SERVICE_ID_BLUETOOTH,
+				HAL_OP_GET_REMOTE_SERVICES, sizeof(cmd),
+						&cmd, 0, NULL, NULL);
 }
 
 static int start_discovery(void)
-- 
1.8.4.1


^ permalink raw reply related

* [PATCH 1/5] android: Fix typo in get_remote_services command
From: Szymon Janc @ 2013-10-31 15:25 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Marcin Kraglak

From: Marcin Kraglak <marcin.kraglak@tieto.com>

Change-Id: Ia38b82b4b7fdbd6e52389b34e1cdbbcfd098958c
---
 android/hal-msg.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/android/hal-msg.h b/android/hal-msg.h
index 8a344d8..c0af083 100644
--- a/android/hal-msg.h
+++ b/android/hal-msg.h
@@ -148,8 +148,8 @@ struct hal_cmd_get_remote_service_rec {
 	uint8_t uuid[16];
 } __attribute__((packed));
 
-#define HAL_OP_GET_REMOTE_SERVICE	0x0a
-struct hal_cmd_get_remote_service {
+#define HAL_OP_GET_REMOTE_SERVICES	0x0a
+struct hal_cmd_get_remote_services {
 	uint8_t bdaddr[6];
 } __attribute__((packed));
 
-- 
1.8.4.1


^ permalink raw reply related

* Re: [PATCH] android: Add support for setting adapters name
From: Grzegorz Kolodziejczyk @ 2013-10-31 15:16 UTC (permalink / raw)
  To: Andrei Emeltchenko, Grzegorz Kolodziejczyk, linux-bluetooth
In-Reply-To: <20131031142138.GM27517@aemeltch-MOBL1>

Hi Andrei,

On 31 October 2013 15:21, Andrei Emeltchenko
<andrei.emeltchenko.news@gmail.com> wrote:
>
> Hi Grzegorz,
>
> On Thu, Oct 31, 2013 at 03:00:38PM +0100, Grzegorz Kolodziejczyk wrote:
> > ---
> >  android/adapter.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  android/hal-msg.h |  2 ++
> >  2 files changed, 55 insertions(+)
> >
> > diff --git a/android/adapter.c b/android/adapter.c
> > index 15b65e5..5dadc2e 100644
> > --- a/android/adapter.c
> > +++ b/android/adapter.c
> > @@ -129,6 +129,27 @@ static void scan_mode_changed(void)
> >       g_free(ev);
> >  }
> >
> > +static void adapter_name_changed(const uint8_t *name)
> > +{
> > +     struct hal_ev_adapter_props_changed *ev;
> > +     uint8_t buf[sizeof(*ev) + sizeof(struct hal_property) +
> > +                                                     HAL_MAX_NAME_LENGTH];
> > +
> > +     memset(buf, 0, sizeof(buf));
> > +     ev = (void *) buf;
> > +
> > +     ev->num_props = 1;
> > +     ev->status = HAL_STATUS_SUCCESS;
> > +     ev->props[0].type = HAL_PROP_ADAPTER_NAME;
> > +     ev->props[0].len = HAL_MAX_NAME_LENGTH;
>
> Do we need to pass always HAL_MAX_NAME_LENGTH ?
>

Yes, HAL expect 249 byte size array. IPC should map to HAL calls,
where name is expected to have 249 bytes.

Best regards,
Grzegorz Kołodziejczyk

^ permalink raw reply

* Re: [PATCH 1/2] android/hidhost: Fix not unregistering HID
From: Johan Hedberg @ 2013-10-31 14:58 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth
In-Reply-To: <1383230705-18110-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>

Hi Andrei,

On Thu, Oct 31, 2013, Andrei Emeltchenko wrote:
> If HID is not unregistered it cannot be registered again and we get
> following error:
> ...
> E/BluetoothHidServiceJni( 2849): Failed to initialize Bluetooth HID, status: 1
> ...
> ---
>  android/hal-hidhost.c |    7 +++++++
>  1 file changed, 7 insertions(+)

Both patches have been applied. Thanks.

Johan

^ permalink raw reply

* Re: [PATCH 1/5] android: Add support for starting and cancelling device discovery
From: Johan Hedberg @ 2013-10-31 14:52 UTC (permalink / raw)
  To: Jakub Tyszkowski; +Cc: linux-bluetooth
In-Reply-To: <1383229534-17157-1-git-send-email-jakub.tyszkowski@tieto.com>

Hi Jakub,

On Thu, Oct 31, 2013, Jakub Tyszkowski wrote:
> Android will cancel ongoing discovery after some period of time so there
> is no need for another timeout inside the daemon itself.
> 
> ---
>  android/adapter.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 107 insertions(+), 1 deletion(-)

All five patches have been applied. Thanks.

Johan

^ permalink raw reply

* [PATCH 2/2] android/hid: Add error message to error print
From: Andrei Emeltchenko @ 2013-10-31 14:45 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1383230705-18110-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 android/hid.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/android/hid.c b/android/hid.c
index 5caa25b..4075ecb 100644
--- a/android/hid.c
+++ b/android/hid.c
@@ -419,7 +419,7 @@ bool bt_hid_register(GIOChannel *io, const bdaddr_t *addr)
 				BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_LOW,
 				BT_IO_OPT_INVALID);
 	if (!ctrl_io) {
-		error("Failed to listen on control channel");
+		error("Failed to listen on ctrl channel: %s", err->message);
 		g_error_free(err);
 		return false;
 	}
@@ -429,7 +429,7 @@ bool bt_hid_register(GIOChannel *io, const bdaddr_t *addr)
 				BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_LOW,
 				BT_IO_OPT_INVALID);
 	if (!intr_io) {
-		error("Failed to listen on interrupt channel");
+		error("Failed to listen on intr channel: %s", err->message);
 		g_io_channel_unref(ctrl_io);
 		g_error_free(err);
 		return false;
-- 
1.7.10.4


^ permalink raw reply related

* [PATCH 1/2] android/hidhost: Fix not unregistering HID
From: Andrei Emeltchenko @ 2013-10-31 14:45 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

If HID is not unregistered it cannot be registered again and we get
following error:
...
E/BluetoothHidServiceJni( 2849): Failed to initialize Bluetooth HID, status: 1
...
---
 android/hal-hidhost.c |    7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/android/hal-hidhost.c b/android/hal-hidhost.c
index a72410b..e148dc2 100644
--- a/android/hal-hidhost.c
+++ b/android/hal-hidhost.c
@@ -301,12 +301,19 @@ static bt_status_t hh_init(bthh_callbacks_t *callbacks)
 
 static void hh_cleanup(void)
 {
+	struct hal_cmd_unregister_module cmd;
+
 	DBG("");
 
 	if (!interface_ready())
 		return;
 
 	bt_hh_cbacks = NULL;
+
+	cmd.service_id = HAL_SERVICE_ID_HIDHOST;
+
+	hal_ipc_cmd(HAL_SERVICE_ID_CORE, HAL_OP_UNREGISTER_MODULE,
+					sizeof(cmd), &cmd, 0, NULL, NULL);
 }
 
 static bthh_interface_t hh_if = {
-- 
1.7.10.4


^ permalink raw reply related

* Re: l2cap sockets not properly multiplexed on ARM
From: Marcel Holtmann @ 2013-10-31 14:41 UTC (permalink / raw)
  To: Tim Tisdall; +Cc: Alexander Holler, linux-bluetooth@vger.kernel.org
In-Reply-To: <D9B9EB3A112B8F489DFFA00A6D5C0FE203241DC5@AD-BR-EX-2.adroot.flemingc.local>

Hi Tim,

>> I actually need to know if bluetooth-next tree still has this issue. That is first and foremost the one thing that needs to be checked.
> 
> I really doubt it's an issue with bluetooth-next as it's only been an issue with kernel versions 3.4.X and older.
> 
> I'm not familiar with how kernel development goes, so I'm not sure I completely understand what "bluetooth-next" entails.  Aren't there different maintainers for the different major versions of the kernel and don't they update the in-built modules where ever possible?  Is "bluetooth-next" tied to a particular kernel version or does it support a range of versions as it's a module?

bluetooth-next is what will become kernel 3.13 at some point when Linus releases it. It is code that is on its way towards official Linux trees.

If bluetooth-next works as expected, then you could just git bisect and root cause the patch that fixed it. However first you have to establish if bluetooth-next kernel works or not.

Regards

Marcel


^ permalink raw reply

* RE: l2cap sockets not properly multiplexed on ARM
From: Tim Tisdall @ 2013-10-31 14:29 UTC (permalink / raw)
  To: Marcel Holtmann; +Cc: Alexander Holler, linux-bluetooth@vger.kernel.org
In-Reply-To: <F9B30CD6-4DCB-4F58-9322-E18969867664@holtmann.org>

> I actually need to know if bluetooth-next tree still has this issue. That=
 is first and foremost the one thing that needs to be checked.=0A=
=0A=
I really doubt it's an issue with bluetooth-next as it's only been an issue=
 with kernel versions 3.4.X and older.=0A=
=0A=
I'm not familiar with how kernel development goes, so I'm not sure I comple=
tely understand what "bluetooth-next" entails.  Aren't there different main=
tainers for the different major versions of the kernel and don't they updat=
e the in-built modules where ever possible?  Is "bluetooth-next" tied to a =
particular kernel version or does it support a range of versions as it's a =
module?=

^ permalink raw reply

* [PATCH 5/5] android: Add support for remote device name confirmation
From: Jakub Tyszkowski @ 2013-10-31 14:25 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1383229534-17157-1-git-send-email-jakub.tyszkowski@tieto.com>

---
 android/adapter.c | 30 +++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

diff --git a/android/adapter.c b/android/adapter.c
index e72e45b..10d4a8e 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -390,6 +390,28 @@ static void mgmt_discovering_event(uint16_t index, uint16_t length,
 						sizeof(cp), &cp, -1);
 }
 
+static void confirm_name_complete(uint8_t status, uint16_t length,
+					const void *param, void *user_data)
+{
+	if (status != MGMT_STATUS_SUCCESS)
+		error("Failed to confirm name: %s (0x%02x)",
+						mgmt_errstr(status), status);
+}
+
+static void confirm_device_name(const bdaddr_t *addr, uint8_t addr_type)
+{
+	struct mgmt_cp_confirm_name cp;
+
+	memset(&cp, 0, sizeof(cp));
+	bacpy(&cp.addr.bdaddr, addr);
+	cp.addr.type = addr_type;
+
+	if (mgmt_reply(adapter->mgmt, MGMT_OP_CONFIRM_NAME, adapter->index,
+					sizeof(cp), &cp, confirm_name_complete,
+					NULL, NULL) == 0)
+		error("Failed to send confirm name request");
+}
+
 static int bdaddr_cmp(gconstpointer a, gconstpointer b)
 {
 	const bdaddr_t *bda = a;
@@ -519,7 +541,13 @@ static void update_found_device(const bdaddr_t *bdaddr, uint8_t bdaddr_type,
 		g_free(buf);
 	}
 
-	/* TODO: name confirmation */
+	if (confirm) {
+		char addr[18];
+
+		ba2str(bdaddr, addr);
+		info("Device %s needs name confirmation.", addr);
+		confirm_device_name(bdaddr, bdaddr_type);
+	}
 
 	eir_data_free(&eir);
 }
-- 
1.8.4.1


^ permalink raw reply related

* [PATCH 4/5] android: Add device found notifications passing
From: Jakub Tyszkowski @ 2013-10-31 14:25 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1383229534-17157-1-git-send-email-jakub.tyszkowski@tieto.com>

This patch adds remote device found and remote device properties changed
notifications passing using IPC.

---
 android/adapter.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 82 insertions(+), 2 deletions(-)

diff --git a/android/adapter.c b/android/adapter.c
index 154dd06..e72e45b 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -398,11 +398,45 @@ static int bdaddr_cmp(gconstpointer a, gconstpointer b)
 	return bacmp(bdb, bda);
 }
 
+static int fill_device_props(struct hal_property *prop, bdaddr_t *addr,
+					uint32_t cod, int8_t rssi, char *name)
+{
+	uint8_t num_props = 0;
+
+	/* fill cod */
+	prop->type = HAL_PROP_DEVICE_CLASS;
+	prop->len = sizeof(cod);
+	memcpy(prop->val, &cod, prop->len);
+	prop = ((void *) prop) + sizeof(*prop) + sizeof(cod);
+	num_props++;
+
+	/* fill rssi */
+	prop->type = HAL_PROP_DEVICE_RSSI;
+	prop->len = sizeof(rssi);
+	memcpy(prop->val, &rssi, prop->len);
+	prop = ((void *) prop) + sizeof(*prop) + sizeof(rssi);
+	num_props++;
+
+	/* fill name */
+	if (name) {
+		prop->type = HAL_PROP_DEVICE_NAME;
+		prop->len = HAL_MAX_NAME_LENGTH;
+		strncpy((char *) prop->val, name, HAL_MAX_NAME_LENGTH - 1);
+		prop = ((void *) prop) + sizeof(*prop) + HAL_MAX_NAME_LENGTH;
+		num_props++;
+	}
+
+	return num_props;
+}
+
 static void update_found_device(const bdaddr_t *bdaddr, uint8_t bdaddr_type,
 					int8_t rssi, bool confirm,
 					const uint8_t *data, uint8_t data_len)
 {
 	bool is_new_dev = false;
+	size_t props_size = 0;
+	size_t buff_size = 0;
+	void *buf;
 	struct eir_data eir;
 	GSList *l;
 	bdaddr_t *remote = NULL;
@@ -433,10 +467,56 @@ static void update_found_device(const bdaddr_t *bdaddr, uint8_t bdaddr_type,
 		DBG("New device found: %s", addr);
 	}
 
+	props_size += sizeof(struct hal_property) + sizeof(eir.class);
+	props_size += sizeof(struct hal_property) + sizeof(rssi);
+
+	if (eir.name)
+		props_size += sizeof(struct hal_property) + HAL_MAX_NAME_LENGTH;
+
 	if (is_new_dev) {
-		/* TODO: notify device found */
+		struct hal_ev_device_found *ev = NULL;
+		struct hal_property *prop = NULL;
+
+		/* with new device we also send bdaddr prop */
+		props_size += sizeof(struct hal_property) + sizeof(eir.addr);
+
+		buff_size = sizeof(struct hal_ev_device_found) + props_size;
+		buf = g_new0(char, buff_size);
+		ev = buf;
+		prop = ev->props;
+
+		/* fill first prop with bdaddr */
+		prop->type = HAL_PROP_DEVICE_ADDR;
+		prop->len = sizeof(bdaddr_t);
+		bdaddr2android(bdaddr, prop->val);
+		prop = ((void *) prop) + sizeof(*prop) + sizeof(bdaddr_t);
+		ev->num_props += 1;
+
+		/* fill eir, name, and cod props */
+		ev->num_props += fill_device_props(prop, remote, eir.class,
+								rssi, eir.name);
+
+		ipc_send(notification_io, HAL_SERVICE_ID_BLUETOOTH,
+							HAL_EV_DEVICE_FOUND,
+							buff_size, ev, -1);
+		g_free(buf);
 	} else {
-		/* TODO: notify device state changed */
+		struct hal_ev_remote_device_props *ev = NULL;
+
+		buff_size = sizeof(*ev) + props_size;
+		buf = g_new0(char, buff_size);
+		ev = buf;
+
+		ev->num_props = fill_device_props(ev->props, remote, eir.class,
+								rssi, eir.name);
+
+		ev->status = HAL_STATUS_SUCCESS;
+		bdaddr2android(bdaddr, ev->bdaddr);
+
+		ipc_send(notification_io, HAL_SERVICE_ID_BLUETOOTH,
+						HAL_EV_REMOTE_DEVICE_PROPS,
+						buff_size, ev, -1);
+		g_free(buf);
 	}
 
 	/* TODO: name confirmation */
-- 
1.8.4.1


^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox