* Re: [RFC v0 05/15] network: Add network .connect and .disconnect
From: Anderson Lizardo @ 2012-10-24 12:28 UTC (permalink / raw)
To: Mikel Astiz; +Cc: linux-bluetooth, Mikel Astiz
In-Reply-To: <1350661172-18125-6-git-send-email-mikel.astiz.oss@gmail.com>
Hi Mikel,
On Fri, Oct 19, 2012 at 11:39 AM, Mikel Astiz <mikel.astiz.oss@gmail.com> wrote:
> +static void connect_profile_cb(struct btd_device *device, int err,
> + const char *pdev, void *data)
> +{
> + struct connect_req *req = data;
> +
> + req->cb(req->profile, req->device, err);
> +
> + g_free(req);
> +}
> +
> +static int connect_profile(struct btd_device *dev, struct btd_profile *profile,
> + uint16_t id, btd_profile_cb cb)
> +{
> + struct connect_req *req;
> + int err;
> +
> + DBG("path %s id %u", device_get_path(dev), id);
> +
> + req = g_new0(struct connect_req, 1);
> + req->device = dev;
Isn't btd_device_ref() required here?
> + req->profile = profile;
> + req->cb = cb;
> +
> + err = connection_connect(dev, BNEP_SVC_PANU, NULL, connect_profile_cb,
> + req);
> + if (err < 0) {
> + g_free(req);
> + return err;
> + }
> +
> + return 0;
> +}
Regards,
--
Anderson Lizardo
Instituto Nokia de Tecnologia - INdT
Manaus - Brazil
^ permalink raw reply
* Re: [PATCH] Bluetooth: Add support for BCM20702A0 [0b05, 17b5]
From: Anderson Lizardo @ 2012-10-24 12:20 UTC (permalink / raw)
To: jeff; +Cc: marcel, gustavo, johan.hedberg, linux-bluetooth, linux-kernel
In-Reply-To: <5087B517.9090703@deserettechnology.com>
Hi Jeff,
On Wed, Oct 24, 2012 at 5:29 AM, Jeff Cook <jeff@deserettechnology.com> wrote:
> Hello all,
>
> Please see included patch. First-time submitter so let me know if I did
> something wrong.
Just one more suggestion (adding to Gustavo's comments), you may want to read:
http://www.kernel.org/doc/Documentation/SubmittingPatches
Specially sections 12 and 15.
Best Regards,
--
Anderson Lizardo
Instituto Nokia de Tecnologia - INdT
Manaus - Brazil
^ permalink raw reply
* Re: [PATCH] Bluetooth: Add support for BCM20702A0 [0b05, 17b5]
From: Gustavo Padovan @ 2012-10-24 12:11 UTC (permalink / raw)
To: Jeff Cook; +Cc: marcel, johan.hedberg, linux-bluetooth, linux-kernel
In-Reply-To: <5087B517.9090703@deserettechnology.com>
Hi Jeff,
* Jeff Cook <jeff@deserettechnology.com> [2012-10-24 03:29:59 -0600]:
> Hello all,
>
> Please see included patch. First-time submitter so let me know if I did
> something wrong.
Your patch is good, but you need to improve the way you submit it. We recommend
using 'git send-email' like this:
$ git send-email HEAD~1..HEAD
For sending the patch on the top of tree. You can also do combined use of 'git
format-patch' and 'git send-email' in case you want to add some message or to your
patch like the first-time submitter message you did here and these messages
needs to be added...
>
> Thanks,
> Jeff
> --------------------
>
> Vendor-specific ID for BCM20702A0.
> Support for bluetooth over Asus Wi-Fi GO!, included with Asus P8Z77-V
> Deluxe.
>
> T: Bus=07 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=12 MxCh= 0
> D: Ver= 2.00 Cls=ff(vend.) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
> P: Vendor=0b05 ProdID=17b5 Rev=01.12
> S: Manufacturer=Broadcom Corp
> S: Product=BCM20702A0
> S: SerialNumber=94DBC98AC113
> C: #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=0mA
> I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
> I: If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
> I: If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
> I: If#= 3 Alt= 0 #EPs= 0 Cls=fe(app. ) Sub=01 Prot=01 Driver=(none)
> ---
... after these 3 dashes lines so they don't go the final commit when I apply
your patch.
Gustavo
^ permalink raw reply
* Re: [PATCH 2/7] Bluetooth: mgmt: Restrict BR/EDR settings to BR/EDR-only adapters
From: Anderson Lizardo @ 2012-10-24 12:11 UTC (permalink / raw)
To: Marcel Holtmann; +Cc: Johan Hedberg, linux-bluetooth
In-Reply-To: <1351028768.1785.57.camel@aeonflux>
Hi Marcel,
On Tue, Oct 23, 2012 at 5:46 PM, Marcel Holtmann <marcel@holtmann.org> wrote:
> That is why I like the explanation above, if we set ourselves as
> peripheral, then we are peripheral and everything else is out of the
> question. So either LE is enabled and we act as central or we are acting
> as peripheral.
>
> So broadcaster and observer are extra features on top of central. For me
> that means we have treat them independent. How much you can be
> broadcaster and observer and central at the same time is then again a
> different question that we need to answer.
So do you suggest we keep Broadcaster/Observer as separate settings
(which actually we prefer, given that we have been working on
supporting those modes for BR/EDR only adapters, by using EIR for
broadcasting data allowed on EIR, such as Manufacturer Specific Data,
and parsing them from Device Found mgmt event when on Observer mode),
and keep "Set Low Energy" setting just for Central/Peripheral modes?
Regards
--
Anderson Lizardo
Instituto Nokia de Tecnologia - INdT
Manaus - Brazil
^ permalink raw reply
* Re: [PATCH] Bluetooth: Add support for Atheros [04ca:3004]
From: Gustavo Padovan @ 2012-10-24 11:56 UTC (permalink / raw)
To: Dwaine Garden VE3GIF; +Cc: linux-bluetooth@vger.kernel.org
In-Reply-To: <1351054633.13513.YahooMailNeo@web125402.mail.ne1.yahoo.com>
Hi Dwaine,
* Dwaine Garden VE3GIF <dwainegarden@rogers.com> [2012-10-23 21:57:13 -0700]:
> Add another vendor specific ID for Atheros AR3012 device.
> This chip is wrapped by Lite-On Technology Corp.
>
> output of usb-devices:T: Bus=01 Lev=02 Prnt=02 Port=03 Cnt=01 Dev#= 3 Spd=12 MxCh= 0
Break a line before pasting the output in the patch.
> D: Ver= 1.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
> P: Vendor=04ca ProdID=3004 Rev= 0.02
> S: Manufacturer=Atheros Communications
> S: Product=Bluetooth USB Host Controller
> S: SerialNumber=Alaska Day 2006
>
> Signed-off-by: Dwaine Garden <DwaineGarden@rogers.com> ---
>
> diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c
> index fc2de55..1486f15 100644
> --- a/drivers/bluetooth/ath3k.c
> +++ b/drivers/bluetooth/ath3k.c
> @@ -75,6 +75,7 @@ static struct usb_device_id ath3k_table[] = {
> { USB_DEVICE(0x0CF3, 0x3004) },
> { USB_DEVICE(0x0CF3, 0x311D) },
> { USB_DEVICE(0x13d3, 0x3375) },
> + { USB_DEVICE(0x04CA, 0x3004) },
> { USB_DEVICE(0x04CA, 0x3005) },
> { USB_DEVICE(0x13d3, 0x3362) },
> { USB_DEVICE(0x0CF3, 0xE004) },
> @@ -102,6 +103,7 @@ static struct usb_device_id ath3k_blist_tbl[] = {
> { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
> { USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
> { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
> + { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
> { USB_DEVICE(0x04ca, 0x3005), .driver_info =
> BTUSB_ATH3012 },
> {
> USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
> { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
> diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
> index debda27..0529cee 100644
> --- a/drivers/bluetooth/btusb.c
> +++ b/drivers/bluetooth/btusb.c
> @@ -132,6 +132,7 @@ static struct usb_device_id blacklist_table[] = {
> { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
> { USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
> { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
> + { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
> { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
> { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
> { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
You patch is still broken, please use git-send-email to send it to the mailing
list and also make sure it apply cleanly on the latest bluetooth-next tree
before sending. Thanks.
Gustavo
^ permalink raw reply
* [PATCH] Bluetooth: Add support for BCM20702A0 [0b05, 17b5]
From: Jeff Cook @ 2012-10-24 9:29 UTC (permalink / raw)
To: marcel, gustavo, johan.hedberg; +Cc: linux-bluetooth, linux-kernel
Hello all,
Please see included patch. First-time submitter so let me know if I did
something wrong.
Thanks,
Jeff
--------------------
Vendor-specific ID for BCM20702A0.
Support for bluetooth over Asus Wi-Fi GO!, included with Asus P8Z77-V
Deluxe.
T: Bus=07 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=12 MxCh= 0
D: Ver= 2.00 Cls=ff(vend.) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
P: Vendor=0b05 ProdID=17b5 Rev=01.12
S: Manufacturer=Broadcom Corp
S: Product=BCM20702A0
S: SerialNumber=94DBC98AC113
C: #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=0mA
I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
I: If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb
I: If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
I: If#= 3 Alt= 0 #EPs= 0 Cls=fe(app. ) Sub=01 Prot=01 Driver=(none)
---
drivers/bluetooth/btusb.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 654e248..1d7b126 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -96,6 +96,7 @@ static struct usb_device_id btusb_table[] = {
{ USB_DEVICE(0x0c10, 0x0000) },
/* Broadcom BCM20702A0 */
+ { USB_DEVICE(0x0b05, 0x17b5) },
{ USB_DEVICE(0x0489, 0xe042) },
{ USB_DEVICE(0x413c, 0x8197) },
--
1.8.0
^ permalink raw reply related
* Re: [PATCH BlueZ v2] AVDTP: Do not keep a internal reference
From: Luiz Augusto von Dentz @ 2012-10-24 8:51 UTC (permalink / raw)
To: Ludek Finstrle; +Cc: linux-bluetooth
In-Reply-To: <20121023131633.GA12443@pzkagis.cz>
Hi Ludek,
On Tue, Oct 23, 2012 at 3:16 PM, Ludek Finstrle <luf@pzkagis.cz> wrote:
>> + avdtp_cancel_authorization(session);
>
> Why do you call avdtp_cancel_authorization here? It's useless as above you have
> in the same function:
> if (session->state != AVDTP_SESSION_STATE_DISCONNECTED)
> avdtp_set_state(session, AVDTP_SESSION_STATE_DISCONNECTED);
>
> and the first if statement inf avdtp_cancel_authorization is to check if the
> state is AVDTP_SESSION_STATE_CONNECTING (otherwise return).
Right, that could be removed then.
> See below. Why you deinitialize the session different way for ref=0?
>
>> + else if (session->ref > 0)
>> + connection_lost(session, ETIMEDOUT);
>> + else {
>> + struct avdtp_server *server = session->server;
>> +
>> + server->sessions = g_slist_remove(server->sessions, session);
>> + avdtp_free(session);
>> + }
The reason is simple, if there is nobody holding a reference it is
useless to call connection_lost.
> If I change whole block above (starting else if ((session->ref > 0)) this
> way it works with N900 as expected:
>
> else {
> connection_lost(session, ETIMEDOUT);
>
> if (session->ref <= 0) {
> struct avdtp_server *server = session->server;
>
> server->sessions = g_slist_remove(server->sessions, session);
> avdtp_free(session);
> }
> }
hmm, that actually make sense if the caller releases its reference on
connection_lost then we can free immediately but the mystery here is
how you end up in disconnect_timeout if there are still a reference
being held.
--
Luiz Augusto von Dentz
^ permalink raw reply
* RE: [RFC 1/2] Bluetooth: Add driver extension for vendor specific init
From: Ho, Albert O @ 2012-10-24 8:27 UTC (permalink / raw)
To: Marcel Holtmann
Cc: linux-bluetooth, Hedberg, Johan, tedd.hj.an@gmail.com, An, Tedd
In-Reply-To: <1349346013.27233.28.camel@aeonflux>
SGkgTWFyY2VsLA0KDQpJIGhhdmUgYSBxdWVzdGlvbiBhZnRlciBvdXIgY2hhdCB2aWEgSVJDLiAg
U2VlIGJlbG93Lg0KIA0KDQo+IFRoaXMgcGF0Y2ggcHJvdmlkZXMgYW4gZXh0ZW5zaW9uIG9mIGJ0
dXNiIHRvIHN1cHBvcnQgZGV2aWNlIHZlbmRvciBjYW4gDQo+IGltcGxlbWVudCB0aGVpciBvd24g
bW9kdWxlIHRvIGV4ZWN1dGUgdGhlIHZlbmRvciBzcGVjaWZpYyBkZXZpY2UgDQo+IGluaXRpYWxp
emF0aW9uIGJlZm9yZSB0aGUgc3RhY2sgc2VuZHMgZ2VuZXJpYyBCVCBkZXZpY2UgDQo+IGluaXRp
YWxpemF0aW9uLg0KPiANCj4gU2lnbmVkLW9mZi1ieTogVGVkZCBIby1KZW9uZyBBbiA8dGVkZC5h
bkBpbnRlbC5jb20+DQo+IC0tLQ0KPiAgZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYyAgICAgICAg
fCAgMTkxICsrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tDQo+ICBkcml2ZXJz
L2JsdWV0b290aC9idHVzYi5oICAgICAgICB8ICAgNTMgKysrKysrKysrKysNCj4gIGluY2x1ZGUv
bmV0L2JsdWV0b290aC9oY2lfY29yZS5oIHwgICAxMCArKw0KPiAgbmV0L2JsdWV0b290aC9oY2lf
Y29yZS5jICAgICAgICAgfCAgIDE1ICsrLQ0KPiAgNCBmaWxlcyBjaGFuZ2VkLCAyMDQgaW5zZXJ0
aW9ucygrKSwgNjUgZGVsZXRpb25zKC0pICBjcmVhdGUgbW9kZSANCj4gMTAwNjQ0IGRyaXZlcnMv
Ymx1ZXRvb3RoL2J0dXNiLmgNCj4gDQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9i
dHVzYi5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYyANCj4gaW5kZXggZjYzN2MyNS4uYWZh
MTU1OCAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYw0KPiArKysgYi9k
cml2ZXJzL2JsdWV0b290aC9idHVzYi5jDQo+IEBAIC0yNiw2ICsyNiw3IEBADQo+ICANCj4gICNp
bmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPg0KPiAgI2luY2x1ZGUgPG5ldC9ibHVl
dG9vdGgvaGNpX2NvcmUuaD4NCj4gKyNpbmNsdWRlICJidHVzYi5oIg0KPiAgDQo+ICAjZGVmaW5l
IFZFUlNJT04gIjAuNiINCj4gIA0KPiBAQCAtMzksMTQgKzQwLDU5IEBAIHN0YXRpYyBib29sIHJl
c2V0ID0gMTsNCj4gIA0KPiAgc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGJ0dXNiX2RyaXZlcjsN
Cj4gIA0KPiAtI2RlZmluZSBCVFVTQl9JR05PUkUJCTB4MDENCj4gLSNkZWZpbmUgQlRVU0JfRElH
SUFOU1dFUgkweDAyDQo+IC0jZGVmaW5lIEJUVVNCX0NTUgkJMHgwNA0KPiAtI2RlZmluZSBCVFVT
Ql9TTklGRkVSCQkweDA4DQo+IC0jZGVmaW5lIEJUVVNCX0JDTTkyMDM1CQkweDEwDQo+IC0jZGVm
aW5lIEJUVVNCX0JST0tFTl9JU09DCTB4MjANCj4gLSNkZWZpbmUgQlRVU0JfV1JPTkdfU0NPX01U
VQkweDQwDQo+IC0jZGVmaW5lIEJUVVNCX0FUSDMwMTIJCTB4ODANCj4gKy8qDQo+ICsgKiBDcmVh
dGUgYnR1c2JfZHJpdmVyX2luZm8gc3RydWN0IGZvciBlYWNoIGRyaXZlcl9pbmZvIGZsYWdzIHVz
ZWQgYnkNCj4gKyAqIGJsYWNrbGlzdCBzaW5jZSB2ZW5kb3IncyBidHVzYiBkcml2ZXIgd2lsbCBy
ZXR1cm4gYnR1c2JfZHJpdmVyX2luZm8gc3RydWN0Lg0KPiArICovDQo+ICsNCj4gKy8qDQo+ICsg
KiBpZiB0aGUgZGV2aWNlIGlzIHNldCB0byB0aGlzLCB0aGlzIG1lbmFzIHRoYXQgdGhlIGRldmlj
ZSBpcyANCj4gK2dlbmVyaWMgYW5kDQo+ICsgKiBkb2Vzbid0IHJlcXVpcmUgYW55IHZlbmRvciBz
cGVjaWZpYyBoYW5kbGluZyAgKi8gc3RhdGljIGNvbnN0IA0KPiArc3RydWN0IGJ0dXNiX2RyaXZl
cl9pbmZvIGdlbmVyaWMgPSB7DQo+ICsJLmRlc2NyaXB0aW9uCT0gIkJUVVNCIEdlbmVyaWMiLA0K
PiArCS5mbGFncwkJPSBCVFVTQl9HRU5FUklDLA0KPiArfTsNCj4gKw0KPiArc3RhdGljIGNvbnN0
IHN0cnVjdCBidHVzYl9kcml2ZXJfaW5mbyBpZ25vcmUgPSB7DQo+ICsJLmRlc2NyaXB0aW9uCT0g
IkJUVVNCIElnbm9yZSIsDQo+ICsJLmZsYWdzCQk9IEJUVVNCX0lHTk9SRSwNCj4gK307DQoNCj4+
IEkgbGlrZSB0aGUgZWZmb3J0LCBidXQgSSB0aGluayB5b3Ugd2VudCBhIGxpdHRsZSBiaXQgdG9v
IGZhciBoZXJlLiBGb3IgdGhlc2Ugc2ltcGxlIG9uZXMsIHdlIGNhbiBlYXNpbHkga2VlcCBvdXIg
c2ltcGxlIGJsYWNrbGlzdC4gSXQga2VlcHMgdGhlIGNvZGUgbW9yZSByZWFkYWJsZSB0aGFuIHRo
aXMgcGFydC4gQnV0IEkgZG8gYXBwcmVjaWF0ZSB0aGUgYXR0ZW1wdCBpbiB1bmlmeWluZyB0aGlz
Lg0KDQoNCj4gKw0KPiArc3RhdGljIGNvbnN0IHN0cnVjdCBidHVzYl9kcml2ZXJfaW5mbyBkaWdp
YW5zd2VyID0gew0KPiArCS5kZXNjcmlwdGlvbgk9ICJCVFVTQiBESUdJQU5TV0VSIiwNCj4gKwku
ZmxhZ3MJCT0gQlRVU0JfRElHSUFOU1dFUiwNCj4gK307DQo+ICsNCj4gK3N0YXRpYyBjb25zdCBz
dHJ1Y3QgYnR1c2JfZHJpdmVyX2luZm8gY3NyID0gew0KPiArCS5kZXNjcmlwdGlvbgk9ICJCVFVT
QiBDU1IiLA0KPiArCS5mbGFncwkJPSBCVFVTQl9DU1IsDQo+ICt9Ow0KPiArDQo+ICtzdGF0aWMg
Y29uc3Qgc3RydWN0IGJ0dXNiX2RyaXZlcl9pbmZvIHNuaWZmZXIgPSB7DQo+ICsJLmRlc2NyaXB0
aW9uCT0gIkJUVVNCIFNuaWZmZXIiLA0KPiArCS5mbGFncwkJPSBCVFVTQl9TTklGRkVSLA0KPiAr
fTsNCj4gKw0KPiArc3RhdGljIGNvbnN0IHN0cnVjdCBidHVzYl9kcml2ZXJfaW5mbyBiY205MjAz
NSA9IHsNCj4gKwkuZGVzY3JpcHRpb24JPSAiQlRVU0IgQkNNOTIwMzUiLA0KPiArCS5mbGFncwkJ
PSBCVFVTQl9CQ005MjAzNSwNCj4gK307DQo+ICsNCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnR1
c2JfZHJpdmVyX2luZm8gYnJva2VuX2lzb2MgPSB7DQo+ICsJLmRlc2NyaXB0aW9uCT0gIkJUVVNC
IEJyb2tlbiBJU09DIiwNCj4gKwkuZmxhZ3MJCT0gQlRVU0JfQlJPS0VOX0lTT0MsDQo+ICt9Ow0K
PiArDQo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGJ0dXNiX2RyaXZlcl9pbmZvIHdyb25nX3Njb19t
dHUgPSB7DQo+ICsJLmRlc2NyaXB0aW9uCT0gIkJUVVNCIFdyb25nIFNDTyBNVFUiLA0KPiArCS5m
bGFncwkJPSBCVFVTQl9XUk9OR19TQ09fTVRVLA0KPiArfTsNCj4gKw0KPiArc3RhdGljIGNvbnN0
IHN0cnVjdCBidHVzYl9kcml2ZXJfaW5mbyBhdGgzMDEyID0gew0KPiArCS5kZXNjcmlwdGlvbgk9
ICJCVFVTQiBBdGgzMDEyIiwNCj4gKwkuZmxhZ3MJCT0gQlRVU0JfQVRIMzAxMiwNCj4gK307DQo+
ICANCj4gIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBidHVzYl90YWJsZVtdID0gew0KPiAg
CS8qIEdlbmVyaWMgQmx1ZXRvb3RoIFVTQiBkZXZpY2UgKi8NCj4gQEAgLTEwNSw5MCArMTUxLDg5
IEBAIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBidHVzYl90YWJsZVtdID0gew0KPiAgDQo+
ICAJeyB9CS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovDQo+ICB9Ow0KPiAtDQo+ICBNT0RVTEVfREVW
SUNFX1RBQkxFKHVzYiwgYnR1c2JfdGFibGUpOw0KPiAgDQo+ICBzdGF0aWMgc3RydWN0IHVzYl9k
ZXZpY2VfaWQgYmxhY2tsaXN0X3RhYmxlW10gPSB7DQo+ICAJLyogQ1NSIEJsdWVDb3JlIGRldmlj
ZXMgKi8NCj4gLQl7IFVTQl9ERVZJQ0UoMHgwYTEyLCAweDAwMDEpLCAuZHJpdmVyX2luZm8gPSBC
VFVTQl9DU1IgfSwNCj4gKwl7IFVTQl9ERVZJQ0UoMHgwYTEyLCAweDAwMDEpLCAuZHJpdmVyX2lu
Zm8gPSAodW5zaWduZWQgbG9uZykgJmNzciB9LA0KDQo+PiBLZWVwIHRoZSBibGFja2xpc3RfdGFi
bGUgYXMgaXQgaXMuIFRoZSBpbXBvcnRhbnQgdGFibGUgdG8gbW9kaWZ5IGlzIGJ0dXNiX3RhYmxl
IGFuZCB1c2UgYSBjb21tb24gZHJpdmVyX2luZm8gdGhhdCB3aWxsIGJlIHNoYXJlZCBiZXR3ZWVu
IGRyaXZlcnMuDQoNCj4+IFRoYXQgd291bGQgYWxzbyBtYWtlIGl0IHNpbXBsZSB0byBqdXN0IGFk
ZCBCVFVTQl9JR05PUkUgb3IgYSBuZXcgQlRVU0JfVkVORE9SIGZsYWcgdG8gY2FsbCBvdXQgdGhl
IGRyaXZlcnMgdGhhdCBoYXZlIGEgc2VwYXJhdGUgZHJpdmVyIHdpdGggYSB2ZW5kb3IgaW5pdCBm
dW5jdGlvbiwgYnV0IHdvdWxkIG1hdGNoID4+IHRoZSBCbHVldG9vdGggZ2VuZXJhbCBVU0IgZGVz
Y3JpcHRvcnMuDQoNCkkgbG9va2VkIGF0IHVzYm5ldCBtaW5pZHJpdmVyIGFzIHlvdSBzdWdnZXN0
ZWQuICBJZiB3ZSBkbyBhIHNpbWlsYXIgc2NoZW1lIHN1Y2ggdGhhdCBidHVzYl9wcm9iZSgpIGlu
dm9rZXMgdGhlIG1pbmlfZHJpdmVyJ3MgYmluZCgpL3VuYmluZCgpIHRoZW4gYnR1c2IncyB1c2Fn
ZSBvZiBkcml2ZXJfaW5mbyB3aWxsIG5lZWQgdG8gY2hhbmdlIGZyb20gc3RvcmluZyBmbGFncyAo
ZXg6IEJUVVNCX0lHTk9SRSkgYW5kIGNoYW5nZSB0byBzdG9yZSAic3RhdGljIGNvbnN0IHN0cnVj
dCIgd2hlcmUgaXQgaG9sZHMgYSBzdHJ1Y3QgY29udGFpbmluZyB0aGUgbWluaS1kcml2ZXIncyBi
aW5kL3VuYmluZCBmdW5jdGlvbnMgKGp1c3QgbGlrZSB1c2JuZXQgbWluaWRyaXZlcikuICAgQXJl
IHlvdSBnb29kIHdpdGggdGhpcyBjaGFuZ2U/ICBJIGFsc28gd2FudCB0byBtZW50aW9uIHRoYXQg
aW4gdGhlIHBhdGNoIGNvbnRhaW5pbmcgdGhlIEJUIFVTQiBtaW5pIGRyaXZlciB0ZW1wbGF0ZSwg
aXQgYWxyZWFkeSBoYXMgaXRzIG93biBtb2R1bGVfdXNiX2RyaXZlcigpIHNlY3Rpb24gd2l0aCBp
dHMgVklEL1BJRCBsaXN0ZWQuDQoNCg0KPj4gVGhlbiBvdmVyIHRpbWUsIHdlIGNhbiBtb3ZlIHRo
ZSBCVFVTQl9CQ005MjAzNSBmb3IgZXhhbXBsZSBpbnRvIGl0cyBzZXBhcmF0ZSBkcml2ZXIuIEFu
ZCBhbHNvIGRlYWwgd2l0aCBjbGVhbmluZyB1cCBhbGwgdGhlIG90aGVyIEJyb2FkY29tIHNwZWNp
YWx0aWVzLg0KDQo+ICANCj4gIAkvKiBCcm9hZGNvbSBCQ00yMDMzIHdpdGhvdXQgZmlybXdhcmUg
Ki8NCj4gLQl7IFVTQl9ERVZJQ0UoMHgwYTVjLCAweDIwMzMpLCAuZHJpdmVyX2luZm8gPSBCVFVT
Ql9JR05PUkUgfSwNCj4gKwl7IFVTQl9ERVZJQ0UoMHgwYTVjLCAweDIwMzMpLCAuZHJpdmVyX2lu
Zm8gPSAodW5zaWduZWQgbG9uZykgJmlnbm9yZSANCj4gK30sDQo+ICANCj4gIAkvKiBBdGhlcm9z
IDMwMTEgd2l0aCBzZmxhc2ggZmlybXdhcmUgKi8NCj4gLQl7IFVTQl9ERVZJQ0UoMHgwY2YzLCAw
eDMwMDIpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9JR05PUkUgfSwNCj4gLQl7IFVTQl9ERVZJQ0Uo
MHgwY2YzLCAweGUwMTkpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9JR05PUkUgfSwNCj4gLQl7IFVT
Ql9ERVZJQ0UoMHgxM2QzLCAweDMzMDQpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9JR05PUkUgfSwN
Cj4gLQl7IFVTQl9ERVZJQ0UoMHgwOTMwLCAweDAyMTUpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9J
R05PUkUgfSwNCj4gLQl7IFVTQl9ERVZJQ0UoMHgwNDg5LCAweGUwM2QpLCAuZHJpdmVyX2luZm8g
PSBCVFVTQl9JR05PUkUgfSwNCj4gKwl7IFVTQl9ERVZJQ0UoMHgwY2YzLCAweDMwMDIpLCAuZHJp
dmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmlnbm9yZSB9LA0KPiArCXsgVVNCX0RFVklDRSgw
eDBjZjMsIDB4ZTAxOSksIC5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmaWdub3JlIH0s
DQo+ICsJeyBVU0JfREVWSUNFKDB4MTNkMywgMHgzMzA0KSwgLmRyaXZlcl9pbmZvID0gKHVuc2ln
bmVkIGxvbmcpICZpZ25vcmUgfSwNCj4gKwl7IFVTQl9ERVZJQ0UoMHgwOTMwLCAweDAyMTUpLCAu
ZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmlnbm9yZSB9LA0KPiArCXsgVVNCX0RFVklD
RSgweDA0ODksIDB4ZTAzZCksIC5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmaWdub3Jl
IA0KPiArfSwNCj4gIA0KPiAgCS8qIEF0aGVyb3MgQVI5Mjg1IE1hbGJlYyB3aXRoIHNmbGFzaCBm
aXJtd2FyZSAqLw0KPiAtCXsgVVNCX0RFVklDRSgweDAzZjAsIDB4MzExZCksIC5kcml2ZXJfaW5m
byA9IEJUVVNCX0lHTk9SRSB9LA0KPiArCXsgVVNCX0RFVklDRSgweDAzZjAsIDB4MzExZCksIC5k
cml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmaWdub3JlIA0KPiArfSwNCj4gIA0KPiAgCS8q
IEF0aGVyb3MgMzAxMiB3aXRoIHNmbGFzaCBmaXJtd2FyZSAqLw0KPiAtCXsgVVNCX0RFVklDRSgw
eDBjZjMsIDB4MzAwNCksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX0FUSDMwMTIgfSwNCj4gLQl7IFVT
Ql9ERVZJQ0UoMHgwY2YzLCAweDMxMWQpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9BVEgzMDEyIH0s
DQo+IC0JeyBVU0JfREVWSUNFKDB4MTNkMywgMHgzMzc1KSwgLmRyaXZlcl9pbmZvID0gQlRVU0Jf
QVRIMzAxMiB9LA0KPiAtCXsgVVNCX0RFVklDRSgweDA0Y2EsIDB4MzAwNSksIC5kcml2ZXJfaW5m
byA9IEJUVVNCX0FUSDMwMTIgfSwNCj4gLQl7IFVTQl9ERVZJQ0UoMHgxM2QzLCAweDMzNjIpLCAu
ZHJpdmVyX2luZm8gPSBCVFVTQl9BVEgzMDEyIH0sDQo+IC0JeyBVU0JfREVWSUNFKDB4MGNmMywg
MHhlMDA0KSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfQVRIMzAxMiB9LA0KPiAtCXsgVVNCX0RFVklD
RSgweDA5MzAsIDB4MDIxOSksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX0FUSDMwMTIgfSwNCj4gKwl7
IFVTQl9ERVZJQ0UoMHgwY2YzLCAweDMwMDQpLCAuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9u
ZykgJmF0aDMwMTIgfSwNCj4gKwl7IFVTQl9ERVZJQ0UoMHgwY2YzLCAweDMxMWQpLCAuZHJpdmVy
X2luZm8gPSAodW5zaWduZWQgbG9uZykgJmF0aDMwMTIgfSwNCj4gKwl7IFVTQl9ERVZJQ0UoMHgx
M2QzLCAweDMzNzUpLCAuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmF0aDMwMTIgfSwN
Cj4gKwl7IFVTQl9ERVZJQ0UoMHgwNGNhLCAweDMwMDUpLCAuZHJpdmVyX2luZm8gPSAodW5zaWdu
ZWQgbG9uZykgJmF0aDMwMTIgfSwNCj4gKwl7IFVTQl9ERVZJQ0UoMHgxM2QzLCAweDMzNjIpLCAu
ZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmF0aDMwMTIgfSwNCj4gKwl7IFVTQl9ERVZJ
Q0UoMHgwY2YzLCAweGUwMDQpLCAuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmF0aDMw
MTIgfSwNCj4gKwl7IFVTQl9ERVZJQ0UoMHgwOTMwLCAweDAyMTkpLCAuZHJpdmVyX2luZm8gPSAo
dW5zaWduZWQgbG9uZykgDQo+ICsmYXRoMzAxMiB9LA0KPiAgDQo+ICAJLyogQXRoZXJvcyBBUjVC
QlUxMiB3aXRoIHNmbGFzaCBmaXJtd2FyZSAqLw0KPiAtCXsgVVNCX0RFVklDRSgweDA0ODksIDB4
ZTAyYyksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX0lHTk9SRSB9LA0KPiArCXsgVVNCX0RFVklDRSgw
eDA0ODksIDB4ZTAyYyksIC5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmaWdub3JlIA0K
PiArfSwNCj4gIA0KPiAgCS8qIEF0aGVyb3MgQVI1QkJVMTIgd2l0aCBzZmxhc2ggZmlybXdhcmUg
Ki8NCj4gLQl7IFVTQl9ERVZJQ0UoMHgwNDg5LCAweGUwM2MpLCAuZHJpdmVyX2luZm8gPSBCVFVT
Ql9BVEgzMDEyIH0sDQo+ICsJeyBVU0JfREVWSUNFKDB4MDQ4OSwgMHhlMDNjKSwgLmRyaXZlcl9p
bmZvID0gKHVuc2lnbmVkIGxvbmcpIA0KPiArJmF0aDMwMTIgfSwNCj4gIA0KPiAgCS8qIEJyb2Fk
Y29tIEJDTTIwMzUgKi8NCj4gLQl7IFVTQl9ERVZJQ0UoMHgwYTVjLCAweDIwMzUpLCAuZHJpdmVy
X2luZm8gPSBCVFVTQl9XUk9OR19TQ09fTVRVIH0sDQo+IC0JeyBVU0JfREVWSUNFKDB4MGE1Yywg
MHgyMDBhKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfV1JPTkdfU0NPX01UVSB9LA0KPiAtCXsgVVNC
X0RFVklDRSgweDBhNWMsIDB4MjAwOSksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX0JDTTkyMDM1IH0s
DQo+ICsJeyBVU0JfREVWSUNFKDB4MGE1YywgMHgyMDM1KSwgLmRyaXZlcl9pbmZvID0gKHVuc2ln
bmVkIGxvbmcpICZ3cm9uZ19zY29fbXR1IH0sDQo+ICsJeyBVU0JfREVWSUNFKDB4MGE1YywgMHgy
MDBhKSwgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZ3cm9uZ19zY29fbXR1IH0sDQo+
ICsJeyBVU0JfREVWSUNFKDB4MGE1YywgMHgyMDA5KSwgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVk
IGxvbmcpIA0KPiArJmJjbTkyMDM1IH0sDQo+ICANCj4gIAkvKiBCcm9hZGNvbSBCQ00yMDQ1ICov
DQo+IC0JeyBVU0JfREVWSUNFKDB4MGE1YywgMHgyMDM5KSwgLmRyaXZlcl9pbmZvID0gQlRVU0Jf
V1JPTkdfU0NPX01UVSB9LA0KPiAtCXsgVVNCX0RFVklDRSgweDBhNWMsIDB4MjEwMSksIC5kcml2
ZXJfaW5mbyA9IEJUVVNCX1dST05HX1NDT19NVFUgfSwNCj4gKwl7IFVTQl9ERVZJQ0UoMHgwYTVj
LCAweDIwMzkpLCAuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJndyb25nX3Njb19tdHUg
fSwNCj4gKwl7IFVTQl9ERVZJQ0UoMHgwYTVjLCAweDIxMDEpLCAuZHJpdmVyX2luZm8gPSAodW5z
aWduZWQgbG9uZykgDQo+ICsmd3Jvbmdfc2NvX210dSB9LA0KPiAgDQo+ICAJLyogSUJNL0xlbm92
byBUaGlua1BhZCB3aXRoIEJyb2FkY29tIGNoaXAgKi8NCj4gLQl7IFVTQl9ERVZJQ0UoMHgwYTVj
LCAweDIwMWUpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9XUk9OR19TQ09fTVRVIH0sDQo+IC0JeyBV
U0JfREVWSUNFKDB4MGE1YywgMHgyMTEwKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfV1JPTkdfU0NP
X01UVSB9LA0KPiArCXsgVVNCX0RFVklDRSgweDBhNWMsIDB4MjAxZSksIC5kcml2ZXJfaW5mbyA9
ICh1bnNpZ25lZCBsb25nKSAmd3Jvbmdfc2NvX210dSB9LA0KPiArCXsgVVNCX0RFVklDRSgweDBh
NWMsIDB4MjExMCksIC5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSANCj4gKyZ3cm9uZ19z
Y29fbXR1IH0sDQo+ICANCj4gIAkvKiBIUCBsYXB0b3Agd2l0aCBCcm9hZGNvbSBjaGlwICovDQo+
IC0JeyBVU0JfREVWSUNFKDB4MDNmMCwgMHgxNzFkKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfV1JP
TkdfU0NPX01UVSB9LA0KPiArCXsgVVNCX0RFVklDRSgweDAzZjAsIDB4MTcxZCksIC5kcml2ZXJf
aW5mbyA9ICh1bnNpZ25lZCBsb25nKSANCj4gKyZ3cm9uZ19zY29fbXR1IH0sDQo+ICANCj4gIAkv
KiBEZWxsIGxhcHRvcCB3aXRoIEJyb2FkY29tIGNoaXAgKi8NCj4gLQl7IFVTQl9ERVZJQ0UoMHg0
MTNjLCAweDgxMjYpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9XUk9OR19TQ09fTVRVIH0sDQo+ICsJ
eyBVU0JfREVWSUNFKDB4NDEzYywgMHg4MTI2KSwgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxv
bmcpIA0KPiArJndyb25nX3Njb19tdHUgfSwNCj4gIA0KPiAgCS8qIERlbGwgV2lyZWxlc3MgMzcw
IGFuZCA0MTAgZGV2aWNlcyAqLw0KPiAtCXsgVVNCX0RFVklDRSgweDQxM2MsIDB4ODE1MiksIC5k
cml2ZXJfaW5mbyA9IEJUVVNCX1dST05HX1NDT19NVFUgfSwNCj4gLQl7IFVTQl9ERVZJQ0UoMHg0
MTNjLCAweDgxNTYpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9XUk9OR19TQ09fTVRVIH0sDQo+ICsJ
eyBVU0JfREVWSUNFKDB4NDEzYywgMHg4MTUyKSwgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxv
bmcpICZ3cm9uZ19zY29fbXR1IH0sDQo+ICsJeyBVU0JfREVWSUNFKDB4NDEzYywgMHg4MTU2KSwg
LmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpIA0KPiArJndyb25nX3Njb19tdHUgfSwNCj4g
IA0KPiAgCS8qIEJlbGtpbiBGOFQwMTIgYW5kIEY4VDAxMyBkZXZpY2VzICovDQo+IC0JeyBVU0Jf
REVWSUNFKDB4MDUwZCwgMHgwMDEyKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfV1JPTkdfU0NPX01U
VSB9LA0KPiAtCXsgVVNCX0RFVklDRSgweDA1MGQsIDB4MDAxMyksIC5kcml2ZXJfaW5mbyA9IEJU
VVNCX1dST05HX1NDT19NVFUgfSwNCj4gKwl7IFVTQl9ERVZJQ0UoMHgwNTBkLCAweDAwMTIpLCAu
ZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJndyb25nX3Njb19tdHUgfSwNCj4gKwl7IFVT
Ql9ERVZJQ0UoMHgwNTBkLCAweDAwMTMpLCAuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykg
DQo+ICsmd3Jvbmdfc2NvX210dSB9LA0KPiAgDQo+ICAJLyogQXN1cyBXTC1CVEQyMDIgZGV2aWNl
ICovDQo+IC0JeyBVU0JfREVWSUNFKDB4MGIwNSwgMHgxNzE1KSwgLmRyaXZlcl9pbmZvID0gQlRV
U0JfV1JPTkdfU0NPX01UVSB9LA0KPiArCXsgVVNCX0RFVklDRSgweDBiMDUsIDB4MTcxNSksIC5k
cml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSANCj4gKyZ3cm9uZ19zY29fbXR1IH0sDQo+ICAN
Cj4gIAkvKiBLZW5zaW5ndG9uIEJsdWV0b290aCBVU0IgYWRhcHRlciAqLw0KPiAtCXsgVVNCX0RF
VklDRSgweDA0N2QsIDB4MTA1ZSksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1dST05HX1NDT19NVFUg
fSwNCj4gKwl7IFVTQl9ERVZJQ0UoMHgwNDdkLCAweDEwNWUpLCAuZHJpdmVyX2luZm8gPSAodW5z
aWduZWQgbG9uZykgDQo+ICsmd3Jvbmdfc2NvX210dSB9LA0KPiAgDQo+ICAJLyogUlRYIFRlbGVj
b20gYmFzZWQgYWRhcHRlcnMgd2l0aCBidWdneSBTQ08gc3VwcG9ydCAqLw0KPiAtCXsgVVNCX0RF
VklDRSgweDA0MDAsIDB4MDgwNyksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX0JST0tFTl9JU09DIH0s
DQo+IC0JeyBVU0JfREVWSUNFKDB4MDQwMCwgMHgwODBhKSwgLmRyaXZlcl9pbmZvID0gQlRVU0Jf
QlJPS0VOX0lTT0MgfSwNCj4gKwl7IFVTQl9ERVZJQ0UoMHgwNDAwLCAweDA4MDcpLCAuZHJpdmVy
X2luZm8gPSAodW5zaWduZWQgbG9uZykgJmJyb2tlbl9pc29jIH0sDQo+ICsJeyBVU0JfREVWSUNF
KDB4MDQwMCwgMHgwODBhKSwgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpIA0KPiArJmJy
b2tlbl9pc29jIH0sDQo+ICANCj4gIAkvKiBDT05XSVNFIFRlY2hub2xvZ3kgYmFzZWQgYWRhcHRl
cnMgd2l0aCBidWdneSBTQ08gc3VwcG9ydCAqLw0KPiAtCXsgVVNCX0RFVklDRSgweDBlNWUsIDB4
NjYyMiksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX0JST0tFTl9JU09DIH0sDQo+ICsJeyBVU0JfREVW
SUNFKDB4MGU1ZSwgMHg2NjIyKSwgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpIA0KPiAr
JmJyb2tlbl9pc29jIH0sDQo+ICANCj4gIAkvKiBEaWdpYW5zd2VyIGRldmljZXMgKi8NCj4gLQl7
IFVTQl9ERVZJQ0UoMHgwOGZkLCAweDAwMDEpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9ESUdJQU5T
V0VSIH0sDQo+IC0JeyBVU0JfREVWSUNFKDB4MDhmZCwgMHgwMDAyKSwgLmRyaXZlcl9pbmZvID0g
QlRVU0JfSUdOT1JFIH0sDQo+ICsJeyBVU0JfREVWSUNFKDB4MDhmZCwgMHgwMDAxKSwgLmRyaXZl
cl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZkaWdpYW5zd2VyIH0sDQo+ICsJeyBVU0JfREVWSUNF
KDB4MDhmZCwgMHgwMDAyKSwgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZpZ25vcmUg
DQo+ICt9LA0KPiAgDQo+ICAJLyogQ1NSIEJsdWVDb3JlIEJsdWV0b290aCBTbmlmZmVyICovDQo+
IC0JeyBVU0JfREVWSUNFKDB4MGExMiwgMHgwMDAyKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfU05J
RkZFUiB9LA0KPiArCXsgVVNCX0RFVklDRSgweDBhMTIsIDB4MDAwMiksIC5kcml2ZXJfaW5mbyA9
ICh1bnNpZ25lZCBsb25nKSANCj4gKyZzbmlmZmVyIH0sDQo+ICANCj4gIAkvKiBGcm9udGxpbmUg
Q29tUHJvYmUgQmx1ZXRvb3RoIFNuaWZmZXIgKi8NCj4gLQl7IFVTQl9ERVZJQ0UoMHgxNmQzLCAw
eDAwMDIpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9TTklGRkVSIH0sDQo+ICsJeyBVU0JfREVWSUNF
KDB4MTZkMywgMHgwMDAyKSwgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpIA0KPiArJnNu
aWZmZXIgfSwNCj4gIA0KPiAgCXsgfQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLw0KPiAgfTsNCj4g
QEAgLTkxMCwxMiArOTU1LDEyIEBAIHN0YXRpYyB2b2lkIGJ0dXNiX3dha2VyKHN0cnVjdCB3b3Jr
X3N0cnVjdCAqd29yaykNCj4gIAl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoZGF0YS0+aW50Zik7
DQo+ICB9DQo+ICANCj4gLXN0YXRpYyBpbnQgYnR1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZh
Y2UgKmludGYsDQo+IC0JCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQ0KPiAraW50
IGJ0dXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgDQo+
ICt1c2JfZGV2aWNlX2lkICppZCkNCj4gIHsNCj4gIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2Ny
aXB0b3IgKmVwX2Rlc2M7DQo+ICAJc3RydWN0IGJ0dXNiX2RhdGEgKmRhdGE7DQo+ICAJc3RydWN0
IGhjaV9kZXYgKmhkZXY7DQo+ICsJc3RydWN0IGJ0dXNiX2RyaXZlcl9pbmZvICppbmZvOw0KPiAg
CWludCBpLCBlcnI7DQo+ICANCj4gIAlCVF9EQkcoImludGYgJXAgaWQgJXAiLCBpbnRmLCBpZCk7
DQo+IEBAIC05MzEsMTkgKzk3NiwyOCBAQCBzdGF0aWMgaW50IGJ0dXNiX3Byb2JlKHN0cnVjdCB1
c2JfaW50ZXJmYWNlICppbnRmLA0KPiAgCQkJaWQgPSBtYXRjaDsNCj4gIAl9DQo+ICANCj4gLQlp
ZiAoaWQtPmRyaXZlcl9pbmZvID09IEJUVVNCX0lHTk9SRSkNCj4gKwkvKg0KPiArCSAqIE1ha2Ug
c3VyZSB0aGUgZHJpdmVyX2luZm8gaXMgbm90IG51bGwgb3IgMCBiZWNhdXNlIHRoZSBjb2RlIGJl
bG93DQo+ICsJICogbmVlZCB0byBhY2Nlc3MgdGhlIGZsYWdzDQo+ICsJICovDQo+ICsJaWYgKCFp
ZC0+ZHJpdmVyX2luZm8pDQo+ICsJCWluZm8gPSAoc3RydWN0IGJ0dXNiX2RyaXZlcl9pbmZvICop
ICZnZW5lcmljOw0KPiArCWVsc2UNCj4gKwkJaW5mbyA9IChzdHJ1Y3QgYnR1c2JfZHJpdmVyX2lu
Zm8gKikgaWQtPmRyaXZlcl9pbmZvOw0KPiArDQo+ICsJaWYgKGluZm8tPmZsYWdzID09IEJUVVNC
X0lHTk9SRSkNCj4gIAkJcmV0dXJuIC1FTk9ERVY7DQo+ICANCj4gLQlpZiAoaWdub3JlX2RnYSAm
JiBpZC0+ZHJpdmVyX2luZm8gJiBCVFVTQl9ESUdJQU5TV0VSKQ0KPiArCWlmIChpZ25vcmVfZGdh
ICYmIChpbmZvLT5mbGFncyAmIEJUVVNCX0RJR0lBTlNXRVIpKQ0KPiAgCQlyZXR1cm4gLUVOT0RF
VjsNCj4gIA0KPiAtCWlmIChpZ25vcmVfY3NyICYmIGlkLT5kcml2ZXJfaW5mbyAmIEJUVVNCX0NT
UikNCj4gKwlpZiAoaWdub3JlX2NzciAmJiAoaW5mby0+ZmxhZ3MgJiBCVFVTQl9DU1IpKQ0KPiAg
CQlyZXR1cm4gLUVOT0RFVjsNCj4gIA0KPiAtCWlmIChpZ25vcmVfc25pZmZlciAmJiBpZC0+ZHJp
dmVyX2luZm8gJiBCVFVTQl9TTklGRkVSKQ0KPiArCWlmIChpZ25vcmVfc25pZmZlciAmJiAoaW5m
by0+ZmxhZ3MgJiBCVFVTQl9TTklGRkVSKSkNCj4gIAkJcmV0dXJuIC1FTk9ERVY7DQo+ICANCj4g
LQlpZiAoaWQtPmRyaXZlcl9pbmZvICYgQlRVU0JfQVRIMzAxMikgew0KPiArCWlmIChpbmZvLT5m
bGFncyAmIEJUVVNCX0FUSDMwMTIpIHsNCj4gIAkJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBp
bnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOw0KPiAgDQo+ICAJCS8qIE9sZCBmaXJtd2FyZSB3b3Vs
ZCBvdGhlcndpc2UgbGV0IGF0aDNrIGRyaXZlciBsb2FkIEBAIC0xMDEyLDI2IA0KPiArMTA2Niwz
MCBAQCBzdGF0aWMgaW50IGJ0dXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLA0K
PiAgCWhkZXYtPnNlbmQgICAgID0gYnR1c2Jfc2VuZF9mcmFtZTsNCj4gIAloZGV2LT5ub3RpZnkg
ICA9IGJ0dXNiX25vdGlmeTsNCj4gIA0KPiArCS8qIHZlbmRvciBzcGVjaWZpYyBkZXZpY2UgaW5p
dGlhbGl6YXRpb24gcm91dGluZXMgKi8NCj4gKwloZGV2LT52c2Rldl9pbml0ID0gaW5mby0+dnNk
ZXZfaW5pdDsNCj4gKwloZGV2LT52c2Rldl9ldmVudCA9IGluZm8tPnZzZGV2X2V2ZW50Ow0KPiAr
DQo+ICAJLyogSW50ZXJmYWNlIG51bWJlcnMgYXJlIGhhcmRjb2RlZCBpbiB0aGUgc3BlY2lmaWNh
dGlvbiAqLw0KPiAgCWRhdGEtPmlzb2MgPSB1c2JfaWZudW1fdG9faWYoZGF0YS0+dWRldiwgMSk7
DQo+ICANCj4gIAlpZiAoIXJlc2V0KQ0KPiAgCQlzZXRfYml0KEhDSV9RVUlSS19SRVNFVF9PTl9D
TE9TRSwgJmhkZXYtPnF1aXJrcyk7DQo+ICANCj4gLQlpZiAoZm9yY2Vfc2NvZml4IHx8IGlkLT5k
cml2ZXJfaW5mbyAmIEJUVVNCX1dST05HX1NDT19NVFUpIHsNCj4gKwlpZiAoZm9yY2Vfc2NvZml4
IHx8IChpbmZvLT5mbGFncyAmIEJUVVNCX1dST05HX1NDT19NVFUpKSB7DQo+ICAJCWlmICghZGlz
YWJsZV9zY29maXgpDQo+ICAJCQlzZXRfYml0KEhDSV9RVUlSS19GSVhVUF9CVUZGRVJfU0laRSwg
JmhkZXYtPnF1aXJrcyk7DQo+ICAJfQ0KPiAgDQo+IC0JaWYgKGlkLT5kcml2ZXJfaW5mbyAmIEJU
VVNCX0JST0tFTl9JU09DKQ0KPiArCWlmIChpbmZvLT5mbGFncyAmIEJUVVNCX0JST0tFTl9JU09D
KQ0KPiAgCQlkYXRhLT5pc29jID0gTlVMTDsNCj4gIA0KPiAtCWlmIChpZC0+ZHJpdmVyX2luZm8g
JiBCVFVTQl9ESUdJQU5TV0VSKSB7DQo+ICsJaWYgKGluZm8tPmZsYWdzICYgQlRVU0JfRElHSUFO
U1dFUikgew0KPiAgCQlkYXRhLT5jbWRyZXFfdHlwZSA9IFVTQl9UWVBFX1ZFTkRPUjsNCj4gIAkJ
c2V0X2JpdChIQ0lfUVVJUktfUkVTRVRfT05fQ0xPU0UsICZoZGV2LT5xdWlya3MpOw0KPiAgCX0N
Cj4gIA0KPiAtCWlmIChpZC0+ZHJpdmVyX2luZm8gJiBCVFVTQl9DU1IpIHsNCj4gKwlpZiAoaW5m
by0+ZmxhZ3MgJiBCVFVTQl9DU1IpIHsNCj4gIAkJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBk
YXRhLT51ZGV2Ow0KPiAgDQo+ICAJCS8qIE9sZCBmaXJtd2FyZSB3b3VsZCBvdGhlcndpc2UgZXhl
Y3V0ZSBVU0IgcmVzZXQgKi8gQEAgLTEwMzksNyANCj4gKzEwOTcsNyBAQCBzdGF0aWMgaW50IGJ0
dXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLA0KPiAgCQkJc2V0X2JpdChIQ0lf
UVVJUktfUkVTRVRfT05fQ0xPU0UsICZoZGV2LT5xdWlya3MpOw0KPiAgCX0NCj4gIA0KPiAtCWlm
IChpZC0+ZHJpdmVyX2luZm8gJiBCVFVTQl9TTklGRkVSKSB7DQo+ICsJaWYgKGluZm8tPmZsYWdz
ICYgQlRVU0JfU05JRkZFUikgew0KPiAgCQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGRhdGEt
PnVkZXY7DQo+ICANCj4gIAkJLyogTmV3IHNuaWZmZXIgZmlybXdhcmUgaGFzIGNyaXBwbGVkIEhD
SSBpbnRlcmZhY2UgKi8gQEAgLTEwNDksNyANCj4gKzExMDcsNyBAQCBzdGF0aWMgaW50IGJ0dXNi
X3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLA0KPiAgCQlkYXRhLT5pc29jID0gTlVM
TDsNCj4gIAl9DQo+ICANCj4gLQlpZiAoaWQtPmRyaXZlcl9pbmZvICYgQlRVU0JfQkNNOTIwMzUp
IHsNCj4gKwlpZiAoaW5mby0+ZmxhZ3MgJiBCVFVTQl9CQ005MjAzNSkgew0KPiAgCQl1bnNpZ25l
ZCBjaGFyIGNtZFtdID0geyAweDNiLCAweGZjLCAweDAxLCAweDAwIH07DQo+ICAJCXN0cnVjdCBz
a19idWZmICpza2I7DQo+ICANCj4gQEAgLTEwNzksOCArMTEzNyw5IEBAIHN0YXRpYyBpbnQgYnR1
c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgDQo+ICppbnRmLA0KPiAgDQo+ICAJcmV0dXJu
IDA7DQo+ICB9DQo+ICtFWFBPUlRfU1lNQk9MX0dQTChidHVzYl9wcm9iZSk7DQo+ICANCj4gLXN0
YXRpYyB2b2lkIGJ0dXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpDQo+
ICt2b2lkIGJ0dXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpDQo+ICB7
DQo+ICAJc3RydWN0IGJ0dXNiX2RhdGEgKmRhdGEgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOw0K
PiAgCXN0cnVjdCBoY2lfZGV2ICpoZGV2Ow0KPiBAQCAtMTEwNSw5ICsxMTY0LDEwIEBAIHN0YXRp
YyB2b2lkIGJ0dXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IA0KPiB1c2JfaW50ZXJmYWNlICppbnRmKQ0K
PiAgDQo+ICAJaGNpX2ZyZWVfZGV2KGhkZXYpOw0KPiAgfQ0KPiArRVhQT1JUX1NZTUJPTF9HUEwo
YnR1c2JfZGlzY29ubmVjdCk7DQo+ICANCj4gICNpZmRlZiBDT05GSUdfUE0NCj4gLXN0YXRpYyBp
bnQgYnR1c2Jfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90
IA0KPiBtZXNzYWdlKQ0KPiAraW50IGJ0dXNiX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2Ug
KmludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQ0KPiAgew0KPiAgCXN0cnVjdCBidHVzYl9kYXRh
ICpkYXRhID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsNCj4gIA0KPiBAQCAtMTEzMyw2ICsxMTkz
LDcgQEAgc3RhdGljIGludCBidHVzYl9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlIA0KPiAq
aW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpDQo+ICANCj4gIAlyZXR1cm4gMDsNCj4gIH0NCj4g
K0VYUE9SVF9TWU1CT0xfR1BMKGJ0dXNiX3N1c3BlbmQpOw0KPiAgDQo+ICBzdGF0aWMgdm9pZCBw
bGF5X2RlZmVycmVkKHN0cnVjdCBidHVzYl9kYXRhICpkYXRhKSAgeyBAQCAtMTE0OSw3IA0KPiAr
MTIxMCw3IEBAIHN0YXRpYyB2b2lkIHBsYXlfZGVmZXJyZWQoc3RydWN0IGJ0dXNiX2RhdGEgKmRh
dGEpDQo+ICAJdXNiX3NjdXR0bGVfYW5jaG9yZWRfdXJicygmZGF0YS0+ZGVmZXJyZWQpOw0KPiAg
fQ0KPiAgDQo+IC1zdGF0aWMgaW50IGJ0dXNiX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAq
aW50ZikNCj4gK2ludCBidHVzYl9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpDQo+
ICB7DQo+ICAJc3RydWN0IGJ0dXNiX2RhdGEgKmRhdGEgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYp
Ow0KPiAgCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gZGF0YS0+aGRldjsNCj4gQEAgLTEyMDUsOCAr
MTI2NiwxMCBAQCBkb25lOg0KPiAgDQo+ICAJcmV0dXJuIGVycjsNCj4gIH0NCj4gK0VYUE9SVF9T
WU1CT0xfR1BMKGJ0dXNiX3Jlc3VtZSk7DQo+ICAjZW5kaWYNCj4gIA0KPiArDQo+ICBzdGF0aWMg
c3RydWN0IHVzYl9kcml2ZXIgYnR1c2JfZHJpdmVyID0gew0KPiAgCS5uYW1lCQk9ICJidHVzYiIs
DQo+ICAJLnByb2JlCQk9IGJ0dXNiX3Byb2JlLA0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVl
dG9vdGgvYnR1c2IuaCBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmggbmV3IA0KPiBmaWxlIG1v
ZGUgMTAwNjQ0IGluZGV4IDAwMDAwMDAuLmMyNmE4NDUNCj4gLS0tIC9kZXYvbnVsbA0KPiArKysg
Yi9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5oDQo+IEBAIC0wLDAgKzEsNTMgQEANCj4gKy8qDQo+
ICsgKg0KPiArICogIEdlbmVyaWMgQmx1ZXRvb3RoIFVTQiBkcml2ZXINCj4gKyAqDQo+ICsgKiAg
Q29weXJpZ2h0IChDKSAyMDA1LTIwMDggIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5u
Lm9yZz4NCj4gKyAqDQo+ICsgKg0KPiArICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgDQo+ICttb2RpZnkNCj4gKyAqICBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCANCj4gK2J5DQo+ICsgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCj4gKyAqICAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLg0KPiArICoNCj4gKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCj4gKyAqICBidXQgV0lUSE9V
VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KPiAr
ICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUNCj4gKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLg0KPiArICoNCj4gKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPiArICogIGFsb25nIHdpdGggdGhpcyBwcm9n
cmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQo+ICsgKiAgRm91bmRhdGlv
biwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIA0KPiArMDIx
MTEtMTMwNyAgVVNBDQo+ICsgKg0KPiArICovDQo+ICsjaWZuZGVmIF9CVFVTQl9IDQo+ICsjZGVm
aW5lIF9CVFVTQl9IDQo+ICsNCj4gK3N0cnVjdCBidHVzYl9kcml2ZXJfaW5mbyB7DQo+ICsJY2hh
cgkqZGVzY3JpcHRpb247DQo+ICsJaW50CWZsYWdzOw0KPiArI2RlZmluZSBCVFVTQl9HRU5FUklD
CQkweDAwDQo+ICsjZGVmaW5lIEJUVVNCX0lHTk9SRQkJMHgwMQ0KPiArI2RlZmluZSBCVFVTQl9E
SUdJQU5TV0VSCTB4MDINCj4gKyNkZWZpbmUgQlRVU0JfQ1NSCQkweDA0DQo+ICsjZGVmaW5lIEJU
VVNCX1NOSUZGRVIJCTB4MDgNCj4gKyNkZWZpbmUgQlRVU0JfQkNNOTIwMzUJCTB4MTANCj4gKyNk
ZWZpbmUgQlRVU0JfQlJPS0VOX0lTT0MJMHgyMA0KPiArI2RlZmluZSBCVFVTQl9XUk9OR19TQ09f
TVRVCTB4NDANCj4gKyNkZWZpbmUgQlRVU0JfQVRIMzAxMgkJMHg4MA0KPiArDQo+ICsJLyogZW50
cnkgcG9pbnQgZm9yIHZlbmRvciBzcGVjaWZpYyBkZXZpY2UgaW5pdGlhbGl6YXRpb24gKi8NCj4g
KwlpbnQJKCp2c2Rldl9pbml0KShzdHJ1Y3QgaGNpX2RldiAqaGRldik7DQoNCj4+IEtlZXAgaXQg
c2ltcGxlLiBDYWxsIHRoaXMgKCpzZXR1cCkuDQoNCj4gKw0KPiArCS8qIGV2ZW50IGhhbmRsZXIg
ZHVyaW5nIHZlbmRvciBzcGVjaWZpYyBkZXZpY2UgaW5pdGlhdGlvbiBwaGFzZSAqLw0KPiArCXZv
aWQJKCp2c2Rldl9ldmVudCkoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpz
a2IpOw0KDQo+PkFuZCB0aGlzIGp1c3QgKCpldmVudCkuDQoNCj4+IEkgYW0gc3RpbGwgY3VyaW91
cyBpZiB3ZSB3b3VsZCBuZWVkIHRoZSBldmVudCBwYXJ0IGF0IGFsbCB3aGVuIHVzaW5nIEhDSSBj
b21tYW5kIGhhbmRsaW5nIHdpdGggY2FsbGJhY2tzLCBidXQgSSBrbm93IGF0IGxlYXN0IHRoYXQg
Q1NSIGlzIG5vdCBmb2xsb3dpbmcgdGhlIEhDSSBzcGVjaWZpY2F0aW9uIGZvciBjb21tYW5kICsg
ZXZlbnQsIHNvIGl0IG1pZ2h0IGJlIGEgZ29vZCBpZGVhLg0KDQo+ICt9Ow0KPiArDQo+ICtleHRl
cm4gaW50IGJ0dXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICosIGNvbnN0IHN0cnVjdCAN
Cj4gK3VzYl9kZXZpY2VfaWQgKik7IGV4dGVybiB2b2lkIGJ0dXNiX2Rpc2Nvbm5lY3Qoc3RydWN0
IHVzYl9pbnRlcmZhY2UgDQo+ICsqKTsgI2lmZGVmIENPTkZJR19QTSBleHRlcm4gaW50IGJ0dXNi
X3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKiwgDQo+ICtwbV9tZXNzYWdlX3QpOyBleHRl
cm4gaW50IGJ0dXNiX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsgDQo+ICsjZW5kaWYN
Cj4gKw0KPiArI2VuZGlmIC8qIF9CVFVTQl9IICovDQo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL25l
dC9ibHVldG9vdGgvaGNpX2NvcmUuaCANCj4gYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2Nv
cmUuaA0KPiBpbmRleCA2YTMzMzdlLi40YWY2MDFkIDEwMDY0NA0KPiAtLS0gYS9pbmNsdWRlL25l
dC9ibHVldG9vdGgvaGNpX2NvcmUuaA0KPiArKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNp
X2NvcmUuaA0KPiBAQCAtMjc1LDYgKzI3NSwxNiBAQCBzdHJ1Y3QgaGNpX2RldiB7DQo+ICAJaW50
ICgqc2VuZCkoc3RydWN0IHNrX2J1ZmYgKnNrYik7DQo+ICAJdm9pZCAoKm5vdGlmeSkoc3RydWN0
IGhjaV9kZXYgKmhkZXYsIHVuc2lnbmVkIGludCBldnQpOw0KPiAgCWludCAoKmlvY3RsKShzdHJ1
Y3QgaGNpX2RldiAqaGRldiwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyANCj4gYXJn
KTsNCj4gKw0KPiArCS8qDQo+ICsJICogVE9ETzogQWRkZWQgZm9sbG93aW5nIG1lbWJlcnMgZm9y
IHZlbmRvciBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiB0bw0KPiArCSAqIG1ha2UgdGhlIGJsdWV0
b290aC5rbyB0cmFuc3BhcmVudCB0byB0aGUgaW50ZXJmYWNlLg0KPiArCSAqIFRoZXNlIG1lbWJl
cnMgYXJlIHNldCBieSB0aGUgdmVuZG9yIHByb3ZpZGVkIGRyaXZlcg0KPiArCSAqLw0KPiArCWlu
dAkJCXZzZGV2X2luaXRfZG9uZTsNCg0KPj4gRm9yIHRoaXMsIHBsZWFzZSB1c2UgZGV2X2ZsYWdz
LiBObyBuZWVkIHdhc3RlIHNwYWNlIHdpdGggYW5vdGhlciB2YXJpYWJsZS4NCg0KPiArCXZvaWQJ
CQkqdnNkZXZfcHJpdl9kYXRhOw0KPiArCWludCAoKnZzZGV2X2luaXQpKHN0cnVjdCBoY2lfZGV2
ICpoZGV2KTsNCj4gKwl2b2lkICgqdnNkZXZfZXZlbnQpKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBz
dHJ1Y3Qgc2tfYnVmZiAqc2tiKTsNCj4gIH07DQoNCj4+IFJhdGhlciBsaWtlIHZlbmRvcl9zZXR1
cCBhbmQgdmVuZG9yX2V2ZW50IGhlcmUuIEkgZG8gbm90IGV2ZW4gd2FudCB0byBrbm93IHdoYXQg
dnMgc3RhbmRzIGZvciA7KQ0KDQo+PiBIb3BlIHdlIGFyZSBub3QgZ2V0dGluZyBpbnRvIHRyb3Vi
bGUgd2l0aCBkcml2ZXIgaWQgdGFibGVzIG5vcm1hbGx5IGJlaW5nIGNvbnN0Lg0KDQo+ICANCj4g
IHN0cnVjdCBoY2lfY29ubiB7DQo+IGRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3Jl
LmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMgaW5kZXggDQo+IGU0MDcwNTEuLjgwYWExM2Yg
MTAwNjQ0DQo+IC0tLSBhL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYw0KPiArKysgYi9uZXQvYmx1
ZXRvb3RoL2hjaV9jb3JlLmMNCj4gQEAgLTY4NSw2ICs2ODUsMTUgQEAgaW50IGhjaV9kZXZfb3Bl
bihfX3UxNiBkZXYpDQo+ICAJCXNldF9iaXQoSENJX0lOSVQsICZoZGV2LT5mbGFncyk7DQo+ICAJ
CWhkZXYtPmluaXRfbGFzdF9jbWQgPSAwOw0KPiAgDQo+ICsJCS8qIHZlbmRvciBzcGVjaWZpYyBk
ZXZpY2UgaW5pdGlhbGl6YXRpb24gKi8NCj4gKwkJaWYgKGhkZXYtPnZzZGV2X2luaXQpIHsNCj4g
KwkJCXJldCA9IGhkZXYtPnZzZGV2X2luaXQoaGRldik7DQo+ICsJCQloZGV2LT52c2Rldl9pbml0
X2RvbmUgPSAxOw0KPiArCQkJaGRldi0+dnNkZXZfZXZlbnQgPSBOVUxMOw0KPiArCQkJaWYgKHJl
dCA8IDApDQo+ICsJCQkJZ290byBkb25lOw0KPiArCQl9DQo+ICsNCg0KPj4gRG8geW91IHJlYWxs
eSB3YW50IHRvIGRvIHRoaXMgb24gZXZlcnkgaGNpY29uZmlnIGhjaTAgdXA/IEkgYXNzdW1lZCB0
aGlzIGlzIGEgb25lIHRpbWUgdGFzay4gU28geW91IG1pZ2h0IGJldHRlciBsb29rIGF0IGhjaV9w
b3dlcl9vbigpIGZvciB0aGlzLg0KDQo+PiBJcyBhIEhDSV9SZXNldCBjb21tYW5kIHVubG9hZGlu
ZyB0aGUgZmlybXdhcmUgcGF0Y2hlcy4NCg0KPiAgCQlyZXQgPSBfX2hjaV9yZXF1ZXN0KGhkZXYs
IGhjaV9pbml0X3JlcSwgMCwgSENJX0lOSVRfVElNRU9VVCk7DQo+ICANCj4gIAkJaWYgKGxtcF9o
b3N0X2xlX2NhcGFibGUoaGRldikpDQo+IEBAIC0yMTE5LDYgKzIxMjgsNyBAQCBpbnQgaGNpX3Nl
bmRfY21kKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBfX3UxNiANCj4gb3Bjb2RlLCBfX3UzMiBwbGVu
LCB2b2lkICpwYXJhbSkNCj4gIA0KPiAgCXJldHVybiAwOw0KPiAgfQ0KPiArRVhQT1JUX1NZTUJP
TChoY2lfc2VuZF9jbWQpOw0KPiAgDQo+ICAvKiBHZXQgZGF0YSBmcm9tIHRoZSBwcmV2aW91c2x5
IHNlbnQgY29tbWFuZCAqLyAgdm9pZCANCj4gKmhjaV9zZW50X2NtZF9kYXRhKHN0cnVjdCBoY2lf
ZGV2ICpoZGV2LCBfX3UxNiBvcGNvZGUpIEBAIC0yODAwLDcgDQo+ICsyODEwLDEwIEBAIHN0YXRp
YyB2b2lkIGhjaV9yeF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykNCj4gIAkJc3dpdGNo
IChidF9jYihza2IpLT5wa3RfdHlwZSkgew0KPiAgCQljYXNlIEhDSV9FVkVOVF9QS1Q6DQo+ICAJ
CQlCVF9EQkcoIiVzIEV2ZW50IHBhY2tldCIsIGhkZXYtPm5hbWUpOw0KPiAtCQkJaGNpX2V2ZW50
X3BhY2tldChoZGV2LCBza2IpOw0KPiArCQkJaWYgKGhkZXYtPnZzZGV2X2V2ZW50ICYmICFoZGV2
LT52c2Rldl9pbml0X2RvbmUpDQo+ICsJCQkJaGRldi0+dnNkZXZfZXZlbnQoaGRldiwgc2tiKTsN
Cj4gKwkJCWVsc2UNCj4gKwkJCQloY2lfZXZlbnRfcGFja2V0KGhkZXYsIHNrYik7DQo+ICAJCQli
cmVhazsNCg0KPj4gTm90IGdvaW5nIHRocm91Z2ggaGNpX2V2ZW50X3BhY2tldCBpcyBhIGJhZCBp
ZGVhLiBUaGF0IHdpbGwgc2NyZXcgb3ZlciB0aGUgZmxvdyBjb250cm9sIGhhbmRsaW5nIGZvciBj
b21tYW5kcy4NCg0KPj4gUmVnYXJkcw0KDQo+PiBNYXJjZWwNCg0KUmVnYXJkcywNCkFsYmVydA0K
DQoNCg0K
^ permalink raw reply
* Re: [PATCHv5 00/18] L2CAP signaling for AMP channel create/move
From: Andrei Emeltchenko @ 2012-10-24 4:58 UTC (permalink / raw)
To: Marcel Holtmann; +Cc: sunnyk, gustavo, linux-bluetooth, Mat Martineau
In-Reply-To: <1351031906.1785.64.camel@aeonflux>
[-- Attachment #1: Type: text/plain, Size: 430 bytes --]
Hi Marcel,
> > Here are the changes that process commands on the L2CAP signaling
> > channel for setting up AMP channels. There's still a lot of
> > integration to do as other AMP functionality is implemented. I've
> > marked places that require this integration with "Placeholder"
> > comments (look for that string).
>
> this looks fine to me now.
>
> Andrei, what is left to do on your side?
Looks OK now.
Regards,
Andrei
[-- Attachment #2: Type: text/html, Size: 573 bytes --]
^ permalink raw reply
* [PATCH] Bluetooth: Add support for Atheros [04ca:3004]
From: Dwaine Garden VE3GIF @ 2012-10-24 4:57 UTC (permalink / raw)
To: linux-bluetooth@vger.kernel.org
Add another vendor specific ID for Atheros AR3012 device.
This chip is wrapped by Lite-On Technology Corp.
output of usb-devices:T: Bus=01 Lev=02 Prnt=02 Port=03 Cnt=01 Dev#= 3 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
P: Vendor=04ca ProdID=3004 Rev= 0.02
S: Manufacturer=Atheros Communications
S: Product=Bluetooth USB Host Controller
S: SerialNumber=Alaska Day 2006
Signed-off-by: Dwaine Garden <DwaineGarden@rogers.com> ---
diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c
index fc2de55..1486f15 100644
--- a/drivers/bluetooth/ath3k.c
+++ b/drivers/bluetooth/ath3k.c
@@ -75,6 +75,7 @@ static struct usb_device_id ath3k_table[] = {
{ USB_DEVICE(0x0CF3, 0x3004) },
{ USB_DEVICE(0x0CF3, 0x311D) },
{ USB_DEVICE(0x13d3, 0x3375) },
+ { USB_DEVICE(0x04CA, 0x3004) },
{ USB_DEVICE(0x04CA, 0x3005) },
{ USB_DEVICE(0x13d3, 0x3362) },
{ USB_DEVICE(0x0CF3, 0xE004) },
@@ -102,6 +103,7 @@ static struct usb_device_id ath3k_blist_tbl[] = {
{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
+ { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x04ca, 0x3005), .driver_info =
BTUSB_ATH3012 },
{
USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index debda27..0529cee 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -132,6 +132,7 @@ static struct usb_device_id blacklist_table[] = {
{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
+ { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
^ permalink raw reply related
* Re: [PATCH 3/5] Bluetooth: Replace include linux/module.h with linux/export.h
From: Gustavo Padovan @ 2012-10-24 2:47 UTC (permalink / raw)
To: Syam Sidhardhan; +Cc: linux-bluetooth
In-Reply-To: <1350999140-7481-3-git-send-email-s.syam@samsung.com>
Hi Syam,
* Syam Sidhardhan <s.syam@samsung.com> [2012-10-23 19:02:18 +0530]:
> include <linux/export.h> is the right to go here.
>
> Signed-off-by: Syam Sidhardhan <s.syam@samsung.com>
> ---
> net/bluetooth/cmtp/capi.c | 2 +-
> net/bluetooth/cmtp/sock.c | 2 +-
> 2 files changed, 2 insertions(+), 2 deletions(-)
Patch has been applied to bluetooth-next. Thanks.
Gustavo
^ permalink raw reply
* Re: [PATCH 1/5] Bluetooth: trivial: Remove newline before EOF
From: Gustavo Padovan @ 2012-10-24 2:46 UTC (permalink / raw)
To: Syam Sidhardhan; +Cc: linux-bluetooth
In-Reply-To: <1350999140-7481-1-git-send-email-s.syam@samsung.com>
Hi Syam,
* Syam Sidhardhan <s.syam@samsung.com> [2012-10-23 19:02:16 +0530]:
> Trivial fix.
>
> Signed-off-by: Syam Sidhardhan <s.syam@samsung.com>
> ---
> net/bluetooth/Kconfig | 1 -
> 1 file changed, 1 deletion(-)
Patch has been applied to bluetooth-next. Thanks.
Gustavo
^ permalink raw reply
* Re: [PATCHv5 18/18] Bluetooth: Start channel move when socket option is changed
From: Gustavo Padovan @ 2012-10-24 2:45 UTC (permalink / raw)
To: Mat Martineau; +Cc: linux-bluetooth, sunnyk, marcel, andrei.emeltchenko.news
In-Reply-To: <1351031063-11791-19-git-send-email-mathewm@codeaurora.org>
Hi Mat,
* Mat Martineau <mathewm@codeaurora.org> [2012-10-23 15:24:23 -0700]:
> Channel moves are triggered by changes to the BT_CHANNEL_POLICY
> sockopt when an ERTM or streaming-mode channel is connected.
>
> Moves are only started if enable_hs is true.
>
> Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
> Acked-by: Marcel Holtmann <marcel@holtmann.org>
> ---
> include/net/bluetooth/l2cap.h | 1 +
> net/bluetooth/l2cap_core.c | 19 +++++++++++++++++++
> net/bluetooth/l2cap_sock.c | 5 +++++
> 3 files changed, 25 insertions(+)
all 18 patches have been applied upstream. Thanks.
Gustavo
^ permalink raw reply
* Re: [PATCHv5 00/18] L2CAP signaling for AMP channel create/move
From: Marcel Holtmann @ 2012-10-23 22:38 UTC (permalink / raw)
To: Mat Martineau; +Cc: linux-bluetooth, gustavo, sunnyk, andrei.emeltchenko.news
In-Reply-To: <1351031063-11791-1-git-send-email-mathewm@codeaurora.org>
Hi Mat,
> Here are the changes that process commands on the L2CAP signaling
> channel for setting up AMP channels. There's still a lot of
> integration to do as other AMP functionality is implemented. I've
> marked places that require this integration with "Placeholder"
> comments (look for that string).
this looks fine to me now.
Andrei, what is left to do on your side?
Regards
Marcel
^ permalink raw reply
* Re: [PATCHv5 10/18] Bluetooth: Add logical link confirm
From: Marcel Holtmann @ 2012-10-23 22:36 UTC (permalink / raw)
To: Mat Martineau; +Cc: linux-bluetooth, gustavo, sunnyk, andrei.emeltchenko.news
In-Reply-To: <1351031063-11791-11-git-send-email-mathewm@codeaurora.org>
Hi Mat,
> The logical link confirm callback is executed when the AMP controller
> completes its logical link setup. During a channel move, a newly
> formed logical link allows a move responder to send a move channel
> response. A move initiator will send a move channel confirm. A
> failed logical link will end the channel move and send an appropriate
> response or confirm command indicating a failure.
>
> If the channel is being created on an AMP controller, L2CAP
> configuration is completed after the logical link is set up.
>
> Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
> ---
> net/bluetooth/l2cap_core.c | 134 +++++++++++++++++++++++++++++++++++++++++----
> 1 file changed, 123 insertions(+), 11 deletions(-)
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Regards
Marcel
^ permalink raw reply
* [PATCHv5 18/18] Bluetooth: Start channel move when socket option is changed
From: Mat Martineau @ 2012-10-23 22:24 UTC (permalink / raw)
To: linux-bluetooth, gustavo; +Cc: sunnyk, marcel, andrei.emeltchenko.news
In-Reply-To: <1351031063-11791-1-git-send-email-mathewm@codeaurora.org>
Channel moves are triggered by changes to the BT_CHANNEL_POLICY
sockopt when an ERTM or streaming-mode channel is connected.
Moves are only started if enable_hs is true.
Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
---
include/net/bluetooth/l2cap.h | 1 +
net/bluetooth/l2cap_core.c | 19 +++++++++++++++++++
net/bluetooth/l2cap_sock.c | 5 +++++
3 files changed, 25 insertions(+)
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h
index b4c3c65..49783e9 100644
--- a/include/net/bluetooth/l2cap.h
+++ b/include/net/bluetooth/l2cap.h
@@ -809,5 +809,6 @@ void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan);
void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan);
void l2cap_chan_del(struct l2cap_chan *chan, int err);
void l2cap_send_conn_req(struct l2cap_chan *chan);
+void l2cap_move_start(struct l2cap_chan *chan);
#endif /* __L2CAP_H */
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 93f1ebb..fae0c70 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -4453,6 +4453,25 @@ static void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
}
}
+void l2cap_move_start(struct l2cap_chan *chan)
+{
+ BT_DBG("chan %p", chan);
+
+ if (chan->local_amp_id == HCI_BREDR_ID) {
+ if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
+ return;
+ chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
+ chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
+ /* Placeholder - start physical link setup */
+ } else {
+ chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
+ chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
+ chan->move_id = 0;
+ l2cap_move_setup(chan);
+ l2cap_send_move_chan_req(chan, 0);
+ }
+}
+
static void l2cap_do_create(struct l2cap_chan *chan, int result,
u8 local_amp_id, u8 remote_amp_id)
{
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
index 89f1472..1bcfb84 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -736,6 +736,11 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
}
chan->chan_policy = (u8) opt;
+
+ if (sk->sk_state == BT_CONNECTED &&
+ chan->move_role == L2CAP_MOVE_ROLE_NONE)
+ l2cap_move_start(chan);
+
break;
default:
--
1.8.0
--
Mat Martineau
Employee of Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
^ permalink raw reply related
* [PATCHv5 17/18] Bluetooth: Do not retransmit data during a channel move
From: Mat Martineau @ 2012-10-23 22:24 UTC (permalink / raw)
To: linux-bluetooth, gustavo; +Cc: sunnyk, marcel, andrei.emeltchenko.news
In-Reply-To: <1351031063-11791-1-git-send-email-mathewm@codeaurora.org>
Do not retransmit previously-sent data when a "receiver ready" s-frame
with the "final" flag is received during a move.
The ERTM state machines will resynchronize at the end of a channel
move, and the state machine needs to avoid state changes during a
move.
Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Acked-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
net/bluetooth/l2cap_core.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index ef86ebb..93f1ebb 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -5591,8 +5591,8 @@ static int l2cap_rx_state_recv(struct l2cap_chan *chan,
if (control->final) {
clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
- if (!test_and_clear_bit(CONN_REJ_ACT,
- &chan->conn_state)) {
+ if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
+ !__chan_is_moving(chan)) {
control->final = 0;
l2cap_retransmit_all(chan, control);
}
--
1.8.0
--
Mat Martineau
Employee of Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
^ permalink raw reply related
* [PATCHv5 16/18] Bluetooth: Ignore BR/EDR packet size constraints when fragmenting for AMP
From: Mat Martineau @ 2012-10-23 22:24 UTC (permalink / raw)
To: linux-bluetooth, gustavo
Cc: sunnyk, marcel, andrei.emeltchenko.news, Andrei Emeltchenko
In-Reply-To: <1351031063-11791-1-git-send-email-mathewm@codeaurora.org>
When operating over BR/EDR, ERTM accounts for the maximum over-the-air
packet size when setting the PDU size. AMP controllers do not use the
same over-the-air packets, so the PDU size should only be based on the
HCI MTU of the AMP controller.
Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
---
net/bluetooth/l2cap_core.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 6662ee3..ef86ebb 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -2272,7 +2272,9 @@ static int l2cap_segment_sdu(struct l2cap_chan *chan,
/* PDU size is derived from the HCI MTU */
pdu_len = chan->conn->mtu;
- pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
+ /* Constrain PDU size for BR/EDR connections */
+ if (!chan->hs_hcon)
+ pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
/* Adjust for largest possible L2CAP overhead. */
if (chan->fcs)
--
1.8.0
--
Mat Martineau
Employee of Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
^ permalink raw reply related
* [PATCHv5 15/18] Bluetooth: Configure appropriate timeouts for AMP controllers
From: Mat Martineau @ 2012-10-23 22:24 UTC (permalink / raw)
To: linux-bluetooth, gustavo; +Cc: sunnyk, marcel, andrei.emeltchenko.news
In-Reply-To: <1351031063-11791-1-git-send-email-mathewm@codeaurora.org>
The L2CAP spec recommends specific retransmit and monitor timeouts for
ERTM channels that are on AMP controllers. These timeouts are
calculated from the AMP controller's best effort flush timeout.
BR/EDR controllers use the default retransmit and monitor timeouts.
Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
---
net/bluetooth/l2cap_core.c | 47 ++++++++++++++++++++++++++++++++++++++++------
1 file changed, 41 insertions(+), 6 deletions(-)
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 4eb3ca8..6662ee3 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -2967,6 +2967,44 @@ static inline bool __l2cap_efs_supported(struct l2cap_chan *chan)
return enable_hs && chan->conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
}
+static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
+ struct l2cap_conf_rfc *rfc)
+{
+ if (chan->local_amp_id && chan->hs_hcon) {
+ u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
+
+ /* Class 1 devices have must have ERTM timeouts
+ * exceeding the Link Supervision Timeout. The
+ * default Link Supervision Timeout for AMP
+ * controllers is 10 seconds.
+ *
+ * Class 1 devices use 0xffffffff for their
+ * best-effort flush timeout, so the clamping logic
+ * will result in a timeout that meets the above
+ * requirement. ERTM timeouts are 16-bit values, so
+ * the maximum timeout is 65.535 seconds.
+ */
+
+ /* Convert timeout to milliseconds and round */
+ ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
+
+ /* This is the recommended formula for class 2 devices
+ * that start ERTM timers when packets are sent to the
+ * controller.
+ */
+ ertm_to = 3 * ertm_to + 500;
+
+ if (ertm_to > 0xffff)
+ ertm_to = 0xffff;
+
+ rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
+ rfc->monitor_timeout = rfc->retrans_timeout;
+ } else {
+ rfc->retrans_timeout = __constant_cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
+ rfc->monitor_timeout = __constant_cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
+ }
+}
+
static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
{
if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
@@ -3033,8 +3071,8 @@ done:
case L2CAP_MODE_ERTM:
rfc.mode = L2CAP_MODE_ERTM;
rfc.max_transmit = chan->max_tx;
- rfc.retrans_timeout = 0;
- rfc.monitor_timeout = 0;
+
+ __l2cap_set_ertm_timeouts(chan, &rfc);
size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
@@ -3262,10 +3300,7 @@ done:
rfc.max_pdu_size = cpu_to_le16(size);
chan->remote_mps = size;
- rfc.retrans_timeout =
- __constant_cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
- rfc.monitor_timeout =
- __constant_cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
+ __l2cap_set_ertm_timeouts(chan, &rfc);
set_bit(CONF_MODE_DONE, &chan->conf_state);
--
1.8.0
--
Mat Martineau
Employee of Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
^ permalink raw reply related
* [PATCHv5 14/18] Bluetooth: Do not send data during channel move
From: Mat Martineau @ 2012-10-23 22:24 UTC (permalink / raw)
To: linux-bluetooth, gustavo; +Cc: sunnyk, marcel, andrei.emeltchenko.news
In-Reply-To: <1351031063-11791-1-git-send-email-mathewm@codeaurora.org>
Outgoing ERTM data is queued during a channel move. The ERTM state
machine is partially reset at the start of a move, and must be
resynchronized with the remote state machine at the end of the move.
Data is not sent so that there are no state transitions between the
partial reset and the resync.
Streaming mode frames are dropped during a move.
Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Acked-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
net/bluetooth/l2cap_core.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 22f3768..4eb3ca8 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -947,6 +947,9 @@ static void l2cap_send_sframe(struct l2cap_chan *chan,
if (!control->sframe)
return;
+ if (__chan_is_moving(chan))
+ return;
+
if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
!control->poll)
control->final = 1;
@@ -1811,6 +1814,9 @@ static void l2cap_streaming_send(struct l2cap_chan *chan,
BT_DBG("chan %p, skbs %p", chan, skbs);
+ if (__chan_is_moving(chan))
+ return;
+
skb_queue_splice_tail_init(skbs, &chan->tx_q);
while (!skb_queue_empty(&chan->tx_q)) {
@@ -1853,6 +1859,9 @@ static int l2cap_ertm_send(struct l2cap_chan *chan)
if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
return 0;
+ if (__chan_is_moving(chan))
+ return 0;
+
while (chan->tx_send_head &&
chan->unacked_frames < chan->remote_tx_win &&
chan->tx_state == L2CAP_TX_STATE_XMIT) {
@@ -1918,6 +1927,9 @@ static void l2cap_ertm_resend(struct l2cap_chan *chan)
if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
return;
+ if (__chan_is_moving(chan))
+ return;
+
while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
seq = l2cap_seq_list_pop(&chan->retrans_list);
--
1.8.0
--
Mat Martineau
Employee of Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
^ permalink raw reply related
* [PATCHv5 13/18] Bluetooth: Flag ACL frames as complete for AMP controllers
From: Mat Martineau @ 2012-10-23 22:24 UTC (permalink / raw)
To: linux-bluetooth, gustavo; +Cc: sunnyk, marcel, andrei.emeltchenko.news
In-Reply-To: <1351031063-11791-1-git-send-email-mathewm@codeaurora.org>
AMP controllers expect to transmit only "complete" ACL frames. These
frames have both the "start" and "cont" bits set. AMP does not allow
fragmented ACLs.
Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Acked-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
net/bluetooth/l2cap_core.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 898529d..22f3768 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -763,6 +763,15 @@ static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
skb->priority);
+ if (chan->hs_hcon && !__chan_is_moving(chan)) {
+ if (chan->hs_hchan)
+ hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
+ else
+ kfree_skb(skb);
+
+ return;
+ }
+
if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
lmp_no_flush_capable(hcon->hdev))
flags = ACL_START_NO_FLUSH;
--
1.8.0
--
Mat Martineau
Employee of Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
^ permalink raw reply related
* [PATCHv5 12/18] Bluetooth: Handle physical link completion
From: Mat Martineau @ 2012-10-23 22:24 UTC (permalink / raw)
To: linux-bluetooth, gustavo; +Cc: sunnyk, marcel, andrei.emeltchenko.news
In-Reply-To: <1351031063-11791-1-git-send-email-mathewm@codeaurora.org>
Several different actions may be taken when an AMP physical link
becomes available. A channel being created on an AMP controller must
continue the connection process. A channel being moved needs to
either send a move request or a move response. A failed physical link
will revert to using a BR/EDR controller if possible.
Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Acked-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
net/bluetooth/l2cap_core.c | 164 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 164 insertions(+)
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 7663a1e..898529d 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -1016,6 +1016,19 @@ void l2cap_send_conn_req(struct l2cap_chan *chan)
l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
}
+static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
+{
+ struct l2cap_create_chan_req req;
+ req.scid = cpu_to_le16(chan->scid);
+ req.psm = chan->psm;
+ req.amp_id = amp_id;
+
+ chan->ident = l2cap_get_ident(chan->conn);
+
+ l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
+ sizeof(req), &req);
+}
+
static void l2cap_move_setup(struct l2cap_chan *chan)
{
struct sk_buff *skb;
@@ -4187,6 +4200,25 @@ static int l2cap_create_channel_req(struct l2cap_conn *conn,
return 0;
}
+static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
+{
+ struct l2cap_move_chan_req req;
+ u8 ident;
+
+ BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
+
+ ident = l2cap_get_ident(chan->conn);
+ chan->ident = ident;
+
+ req.icid = cpu_to_le16(chan->scid);
+ req.dest_amp_id = dest_amp_id;
+
+ l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
+ &req);
+
+ __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
+}
+
static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
{
struct l2cap_move_chan_rsp rsp;
@@ -4363,6 +4395,138 @@ static void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
}
}
+static void l2cap_do_create(struct l2cap_chan *chan, int result,
+ u8 local_amp_id, u8 remote_amp_id)
+{
+ if (!test_bit(CONF_CONNECT_PEND, &chan->conf_state)) {
+ struct l2cap_conn_rsp rsp;
+ char buf[128];
+ rsp.scid = cpu_to_le16(chan->dcid);
+ rsp.dcid = cpu_to_le16(chan->scid);
+
+ /* Incoming channel on AMP */
+ if (result == L2CAP_CR_SUCCESS) {
+ /* Send successful response */
+ rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
+ rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
+ } else {
+ /* Send negative response */
+ rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
+ rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
+ }
+
+ l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
+ sizeof(rsp), &rsp);
+
+ if (result == L2CAP_CR_SUCCESS) {
+ __l2cap_state_change(chan, BT_CONFIG);
+ set_bit(CONF_REQ_SENT, &chan->conf_state);
+ l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
+ L2CAP_CONF_REQ,
+ l2cap_build_conf_req(chan, buf), buf);
+ chan->num_conf_req++;
+ }
+ } else {
+ /* Outgoing channel on AMP */
+ if (result == L2CAP_CR_SUCCESS) {
+ chan->local_amp_id = local_amp_id;
+ l2cap_send_create_chan_req(chan, remote_amp_id);
+ } else {
+ /* Revert to BR/EDR connect */
+ l2cap_send_conn_req(chan);
+ }
+ }
+}
+
+static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
+ u8 remote_amp_id)
+{
+ l2cap_move_setup(chan);
+ chan->move_id = local_amp_id;
+ chan->move_state = L2CAP_MOVE_WAIT_RSP;
+
+ l2cap_send_move_chan_req(chan, remote_amp_id);
+}
+
+static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
+{
+ struct hci_chan *hchan = NULL;
+
+ /* Placeholder - get hci_chan for logical link */
+
+ if (hchan) {
+ if (hchan->state == BT_CONNECTED) {
+ /* Logical link is ready to go */
+ chan->hs_hcon = hchan->conn;
+ chan->hs_hcon->l2cap_data = chan->conn;
+ chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
+ l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
+
+ l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
+ } else {
+ /* Wait for logical link to be ready */
+ chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
+ }
+ } else {
+ /* Logical link not available */
+ l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
+ }
+}
+
+static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
+{
+ if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
+ u8 rsp_result;
+ if (result == -EINVAL)
+ rsp_result = L2CAP_MR_BAD_ID;
+ else
+ rsp_result = L2CAP_MR_NOT_ALLOWED;
+
+ l2cap_send_move_chan_rsp(chan, rsp_result);
+ }
+
+ chan->move_role = L2CAP_MOVE_ROLE_NONE;
+ chan->move_state = L2CAP_MOVE_STABLE;
+
+ /* Restart data transmission */
+ l2cap_ertm_send(chan);
+}
+
+void l2cap_physical_cfm(struct l2cap_chan *chan, int result, u8 local_amp_id,
+ u8 remote_amp_id)
+{
+ BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
+ chan, result, local_amp_id, remote_amp_id);
+
+ l2cap_chan_lock(chan);
+
+ if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
+ l2cap_chan_unlock(chan);
+ return;
+ }
+
+ if (chan->state != BT_CONNECTED) {
+ l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
+ } else if (result != L2CAP_MR_SUCCESS) {
+ l2cap_do_move_cancel(chan, result);
+ } else {
+ switch (chan->move_role) {
+ case L2CAP_MOVE_ROLE_INITIATOR:
+ l2cap_do_move_initiate(chan, local_amp_id,
+ remote_amp_id);
+ break;
+ case L2CAP_MOVE_ROLE_RESPONDER:
+ l2cap_do_move_respond(chan, result);
+ break;
+ default:
+ l2cap_do_move_cancel(chan, result);
+ break;
+ }
+ }
+
+ l2cap_chan_unlock(chan);
+}
+
static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
struct l2cap_cmd_hdr *cmd,
u16 cmd_len, void *data)
--
1.8.0
--
Mat Martineau
Employee of Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
^ permalink raw reply related
* [PATCHv5 11/18] Bluetooth: Add move confirm response handling
From: Mat Martineau @ 2012-10-23 22:24 UTC (permalink / raw)
To: linux-bluetooth, gustavo; +Cc: sunnyk, marcel, andrei.emeltchenko.news
In-Reply-To: <1351031063-11791-1-git-send-email-mathewm@codeaurora.org>
The move confirm response concludes the channel move command sequence.
Receipt of this command indicates that data may begin to flow again.
Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Acked-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
net/bluetooth/l2cap_core.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 4d240c2..7663a1e 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -4650,6 +4650,7 @@ static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
u16 cmd_len, void *data)
{
struct l2cap_move_chan_cfm_rsp *rsp = data;
+ struct l2cap_chan *chan;
u16 icid;
if (cmd_len != sizeof(*rsp))
@@ -4659,6 +4660,23 @@ static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
BT_DBG("icid 0x%4.4x", icid);
+ chan = l2cap_get_chan_by_scid(conn, icid);
+ if (!chan)
+ return 0;
+
+ __clear_chan_timer(chan);
+
+ if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
+ chan->local_amp_id = chan->move_id;
+
+ if (!chan->local_amp_id && chan->hs_hchan)
+ __release_logical_link(chan);
+
+ l2cap_move_done(chan);
+ }
+
+ l2cap_chan_unlock(chan);
+
return 0;
}
--
1.8.0
--
Mat Martineau
Employee of Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
^ permalink raw reply related
* [PATCHv5 10/18] Bluetooth: Add logical link confirm
From: Mat Martineau @ 2012-10-23 22:24 UTC (permalink / raw)
To: linux-bluetooth, gustavo; +Cc: sunnyk, marcel, andrei.emeltchenko.news
In-Reply-To: <1351031063-11791-1-git-send-email-mathewm@codeaurora.org>
The logical link confirm callback is executed when the AMP controller
completes its logical link setup. During a channel move, a newly
formed logical link allows a move responder to send a move channel
response. A move initiator will send a move channel confirm. A
failed logical link will end the channel move and send an appropriate
response or confirm command indicating a failure.
If the channel is being created on an AMP controller, L2CAP
configuration is completed after the logical link is set up.
Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
---
net/bluetooth/l2cap_core.c | 134 +++++++++++++++++++++++++++++++++++++++++----
1 file changed, 123 insertions(+), 11 deletions(-)
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 2277ed5..4d240c2 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -3787,6 +3787,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn,
goto unlock;
}
+ chan->ident = cmd->ident;
l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
chan->num_conf_rsp++;
@@ -4186,17 +4187,17 @@ static int l2cap_create_channel_req(struct l2cap_conn *conn,
return 0;
}
-static void l2cap_send_move_chan_rsp(struct l2cap_conn *conn, u8 ident,
- u16 icid, u16 result)
+static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
{
struct l2cap_move_chan_rsp rsp;
- BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
+ BT_DBG("chan %p, result 0x%4.4x", chan, result);
- rsp.icid = cpu_to_le16(icid);
+ rsp.icid = cpu_to_le16(chan->dcid);
rsp.result = cpu_to_le16(result);
- l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_RSP, sizeof(rsp), &rsp);
+ l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
+ sizeof(rsp), &rsp);
}
static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
@@ -4248,11 +4249,118 @@ static void __release_logical_link(struct l2cap_chan *chan)
/* Placeholder - release the logical link */
}
+static void l2cap_logical_fail(struct l2cap_chan *chan)
+{
+ /* Logical link setup failed */
+ if (chan->state != BT_CONNECTED) {
+ /* Create channel failure, disconnect */
+ l2cap_send_disconn_req(chan->conn, chan, ECONNRESET);
+ return;
+ }
+
+ switch (chan->move_role) {
+ case L2CAP_MOVE_ROLE_RESPONDER:
+ l2cap_move_done(chan);
+ l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
+ break;
+ case L2CAP_MOVE_ROLE_INITIATOR:
+ if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
+ chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
+ /* Remote has only sent pending or
+ * success responses, clean up
+ */
+ l2cap_move_done(chan);
+ }
+
+ /* Other amp move states imply that the move
+ * has already aborted
+ */
+ l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
+ break;
+ }
+}
+
+static void l2cap_logical_finish_create(struct l2cap_chan *chan,
+ struct hci_chan *hchan)
+{
+ struct l2cap_conf_rsp rsp;
+ u8 code;
+
+ chan->hs_hcon = hchan->conn;
+ chan->hs_hcon->l2cap_data = chan->conn;
+
+ code = l2cap_build_conf_rsp(chan, &rsp,
+ L2CAP_CONF_SUCCESS, 0);
+ l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CONF_RSP, code,
+ &rsp);
+ set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
+
+ if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
+ int err = 0;
+
+ set_default_fcs(chan);
+
+ err = l2cap_ertm_init(chan);
+ if (err < 0)
+ l2cap_send_disconn_req(chan->conn, chan, -err);
+ else
+ l2cap_chan_ready(chan);
+ }
+}
+
+static void l2cap_logical_finish_move(struct l2cap_chan *chan,
+ struct hci_chan *hchan)
+{
+ chan->hs_hcon = hchan->conn;
+ chan->hs_hcon->l2cap_data = chan->conn;
+
+ BT_DBG("move_state %d", chan->move_state);
+
+ switch (chan->move_state) {
+ case L2CAP_MOVE_WAIT_LOGICAL_COMP:
+ /* Move confirm will be sent after a success
+ * response is received
+ */
+ chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
+ break;
+ case L2CAP_MOVE_WAIT_LOGICAL_CFM:
+ if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
+ chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
+ } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
+ chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
+ l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
+ } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
+ chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
+ l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
+ }
+ break;
+ default:
+ /* Move was not in expected state, free the channel */
+ __release_logical_link(chan);
+
+ chan->move_state = L2CAP_MOVE_STABLE;
+ }
+}
+
+/* Call with chan locked */
static void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
u8 status)
{
- /* Placeholder */
- return;
+ BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
+
+ if (status) {
+ l2cap_logical_fail(chan);
+ __release_logical_link(chan);
+ return;
+ }
+
+ if (chan->state != BT_CONNECTED) {
+ /* Ignore logical link if channel is on BR/EDR */
+ if (chan->local_amp_id)
+ l2cap_logical_finish_create(chan, hchan);
+ } else {
+ l2cap_logical_finish_move(chan, hchan);
+ }
}
static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
@@ -4260,6 +4368,7 @@ static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
u16 cmd_len, void *data)
{
struct l2cap_move_chan_req *req = data;
+ struct l2cap_move_chan_rsp rsp;
struct l2cap_chan *chan;
u16 icid = 0;
u16 result = L2CAP_MR_NOT_ALLOWED;
@@ -4276,11 +4385,15 @@ static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
chan = l2cap_get_chan_by_dcid(conn, icid);
if (!chan) {
- l2cap_send_move_chan_rsp(conn, cmd->ident, icid,
- L2CAP_MR_NOT_ALLOWED);
+ rsp.icid = cpu_to_le16(icid);
+ rsp.result = __constant_cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
+ l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
+ sizeof(rsp), &rsp);
return 0;
}
+ chan->ident = cmd->ident;
+
if (chan->scid < L2CAP_CID_DYN_START ||
chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
(chan->mode != L2CAP_MODE_ERTM &&
@@ -4319,7 +4432,6 @@ static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
goto send_move_response;
}
- chan->ident = cmd->ident;
chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
l2cap_move_setup(chan);
chan->move_id = req->dest_amp_id;
@@ -4342,7 +4454,7 @@ static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
}
send_move_response:
- l2cap_send_move_chan_rsp(conn, cmd->ident, icid, result);
+ l2cap_send_move_chan_rsp(chan, result);
l2cap_chan_unlock(chan);
--
1.8.0
--
Mat Martineau
Employee of Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
^ permalink raw reply related
* [PATCHv5 09/18] Bluetooth: Move channel response
From: Mat Martineau @ 2012-10-23 22:24 UTC (permalink / raw)
To: linux-bluetooth, gustavo; +Cc: sunnyk, marcel, andrei.emeltchenko.news
In-Reply-To: <1351031063-11791-1-git-send-email-mathewm@codeaurora.org>
The move response command includes a result code indicationg
"pending", "success", or "failure" status. A pending result is
received when the remote address is still setting up a physical link,
and will be followed by success or failure. On success, logical link
setup will proceed. On failure, the move is stopped. The receiver of
a move channel response must always follow up by sending a move
channel confirm command.
Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
---
include/net/bluetooth/l2cap.h | 2 +
net/bluetooth/l2cap_core.c | 183 ++++++++++++++++++++++++++++++++++++++----
2 files changed, 170 insertions(+), 15 deletions(-)
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h
index 6d3615e..b4c3c65 100644
--- a/include/net/bluetooth/l2cap.h
+++ b/include/net/bluetooth/l2cap.h
@@ -52,6 +52,8 @@
#define L2CAP_ENC_TIMEOUT msecs_to_jiffies(5000)
#define L2CAP_CONN_TIMEOUT msecs_to_jiffies(40000)
#define L2CAP_INFO_TIMEOUT msecs_to_jiffies(4000)
+#define L2CAP_MOVE_TIMEOUT msecs_to_jiffies(4000)
+#define L2CAP_MOVE_ERTX_TIMEOUT msecs_to_jiffies(60000)
#define L2CAP_A2MP_DEFAULT_MTU 670
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index fef0394..2277ed5 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -129,6 +129,20 @@ static struct l2cap_chan *__l2cap_get_chan_by_ident(struct l2cap_conn *conn,
return NULL;
}
+static struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn,
+ u8 ident)
+{
+ struct l2cap_chan *c;
+
+ mutex_lock(&conn->chan_lock);
+ c = __l2cap_get_chan_by_ident(conn, ident);
+ if (c)
+ l2cap_chan_lock(c);
+ mutex_unlock(&conn->chan_lock);
+
+ return c;
+}
+
static struct l2cap_chan *__l2cap_global_chan_by_addr(__le16 psm, bdaddr_t *src)
{
struct l2cap_chan *c;
@@ -4185,23 +4199,34 @@ static void l2cap_send_move_chan_rsp(struct l2cap_conn *conn, u8 ident,
l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_RSP, sizeof(rsp), &rsp);
}
-static void l2cap_send_move_chan_cfm(struct l2cap_conn *conn,
- struct l2cap_chan *chan,
- u16 icid, u16 result)
+static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
{
struct l2cap_move_chan_cfm cfm;
- u8 ident;
- BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
+ BT_DBG("chan %p, result 0x%4.4x", chan, result);
- ident = l2cap_get_ident(conn);
- if (chan)
- chan->ident = ident;
+ chan->ident = l2cap_get_ident(chan->conn);
- cfm.icid = cpu_to_le16(icid);
+ cfm.icid = cpu_to_le16(chan->scid);
cfm.result = cpu_to_le16(result);
- l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM, sizeof(cfm), &cfm);
+ l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
+ sizeof(cfm), &cfm);
+
+ __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
+}
+
+static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
+{
+ struct l2cap_move_chan_cfm cfm;
+
+ BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
+
+ cfm.icid = cpu_to_le16(icid);
+ cfm.result = __constant_cpu_to_le16(L2CAP_MC_UNCONFIRMED);
+
+ l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
+ sizeof(cfm), &cfm);
}
static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
@@ -4223,6 +4248,13 @@ static void __release_logical_link(struct l2cap_chan *chan)
/* Placeholder - release the logical link */
}
+static void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
+ u8 status)
+{
+ /* Placeholder */
+ return;
+}
+
static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
struct l2cap_cmd_hdr *cmd,
u16 cmd_len, void *data)
@@ -4317,9 +4349,128 @@ send_move_response:
return 0;
}
-static inline int l2cap_move_channel_rsp(struct l2cap_conn *conn,
- struct l2cap_cmd_hdr *cmd,
- u16 cmd_len, void *data)
+static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
+{
+ struct l2cap_chan *chan;
+ struct hci_chan *hchan = NULL;
+
+ chan = l2cap_get_chan_by_scid(conn, icid);
+ if (!chan) {
+ l2cap_send_move_chan_cfm_icid(conn, icid);
+ return;
+ }
+
+ __clear_chan_timer(chan);
+ if (result == L2CAP_MR_PEND)
+ __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
+
+ switch (chan->move_state) {
+ case L2CAP_MOVE_WAIT_LOGICAL_COMP:
+ /* Move confirm will be sent when logical link
+ * is complete.
+ */
+ chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
+ break;
+ case L2CAP_MOVE_WAIT_RSP_SUCCESS:
+ if (result == L2CAP_MR_PEND) {
+ break;
+ } else if (test_bit(CONN_LOCAL_BUSY,
+ &chan->conn_state)) {
+ chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
+ } else {
+ /* Logical link is up or moving to BR/EDR,
+ * proceed with move
+ */
+ chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
+ l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
+ }
+ break;
+ case L2CAP_MOVE_WAIT_RSP:
+ /* Moving to AMP */
+ if (result == L2CAP_MR_SUCCESS) {
+ /* Remote is ready, send confirm immediately
+ * after logical link is ready
+ */
+ chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
+ } else {
+ /* Both logical link and move success
+ * are required to confirm
+ */
+ chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
+ }
+
+ /* Placeholder - get hci_chan for logical link */
+ if (!hchan) {
+ /* Logical link not available */
+ l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
+ break;
+ }
+
+ /* If the logical link is not yet connected, do not
+ * send confirmation.
+ */
+ if (hchan->state != BT_CONNECTED)
+ break;
+
+ /* Logical link is already ready to go */
+
+ chan->hs_hcon = hchan->conn;
+ chan->hs_hcon->l2cap_data = chan->conn;
+
+ if (result == L2CAP_MR_SUCCESS) {
+ /* Can confirm now */
+ l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
+ } else {
+ /* Now only need move success
+ * to confirm
+ */
+ chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
+ }
+
+ l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
+ break;
+ default:
+ /* Any other amp move state means the move failed. */
+ chan->move_id = chan->local_amp_id;
+ l2cap_move_done(chan);
+ l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
+ }
+
+ l2cap_chan_unlock(chan);
+}
+
+static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
+ u16 result)
+{
+ struct l2cap_chan *chan;
+
+ chan = l2cap_get_chan_by_ident(conn, ident);
+ if (!chan) {
+ /* Could not locate channel, icid is best guess */
+ l2cap_send_move_chan_cfm_icid(conn, icid);
+ return;
+ }
+
+ __clear_chan_timer(chan);
+
+ if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
+ if (result == L2CAP_MR_COLLISION) {
+ chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
+ } else {
+ /* Cleanup - cancel move */
+ chan->move_id = chan->local_amp_id;
+ l2cap_move_done(chan);
+ }
+ }
+
+ l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
+
+ l2cap_chan_unlock(chan);
+}
+
+static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
+ struct l2cap_cmd_hdr *cmd,
+ u16 cmd_len, void *data)
{
struct l2cap_move_chan_rsp *rsp = data;
u16 icid, result;
@@ -4332,8 +4483,10 @@ static inline int l2cap_move_channel_rsp(struct l2cap_conn *conn,
BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
- /* Placeholder: Always unconfirmed */
- l2cap_send_move_chan_cfm(conn, NULL, icid, L2CAP_MC_UNCONFIRMED);
+ if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
+ l2cap_move_continue(conn, icid, result);
+ else
+ l2cap_move_fail(conn, cmd->ident, icid, result);
return 0;
}
--
1.8.0
--
Mat Martineau
Employee of Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox