2011-08-18 00:37:42

by Peter Hurley

[permalink] [raw]
Subject: [RFC v2 4/5] Bluetooth: Schedule links by tx buffer use

Q29tYmluZSB0eCBsaW5rIHR5cGVzIHdoaWNoIHVzZSB0aGUgc2FtZSB0eCBidWZmZXJzLiBTbyBT
Q08gYW5kIEVTQ08NCmxpbmtzIGFyZSBzY2hlZHVsZWQgdG9nZXRoZXIgYW5kIGFsc28gc2NoZWR1
bGUgTEUgbGlua3Mgd2l0aCBBQ0wNCmxpbmtzICppZiogdGhlIGNvbnRyb2xsZXIgdXNlcyBzaGFy
ZWQgQUNMIGJ1ZmZlcnMgZm9yIExFIHR4Lg0KDQpUaGlzIGFsc28gZml4ZXMgdHggdGltZW91dHMg
aWYgdGhlIGNvbnRyb2xsZXIgdXNlcyBzaGFyZWQgQUNMIGJ1ZmZlcnMNCmZvciBMRSB0eC4NCg0K
U2lnbmVkLW9mZi1ieTogUGV0ZXIgSHVybGV5IDxwZXRlckBodXJsZXlzb2Z0d2FyZS5jb20+DQot
LS0NCiBpbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmggfCAgIDEwICsrKysrKw0KIG5ldC9ibHVl
dG9vdGgvaGNpX2NvcmUuYyAgICB8ICAgNjkgKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQ0KIDIgZmlsZXMgY2hhbmdlZCwgMzcgaW5zZXJ0aW9ucygrKSwgNDIgZGVs
ZXRpb25zKC0pDQoNCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmggYi9p
bmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmgNCmluZGV4IDBjMjAyMjcuLmM4MzE5ZTUgMTAwNjQ0
DQotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmgNCisrKyBiL2luY2x1ZGUvbmV0L2Js
dWV0b290aC9oY2kuaA0KQEAgLTE3NCw2ICsxNzQsMTYgQEAgZW51bSB7DQogLyogTG93IEVuZXJn
eSBsaW5rcyBkbyBub3QgaGF2ZSBkZWZpbmVkIGxpbmsgdHlwZS4gVXNlIGludmVudGVkIG9uZSAq
Lw0KICNkZWZpbmUgTEVfTElOSwkJMHg4MA0KIA0KKyNkZWZpbmUgTEVfTUFTSwkJMHg4MA0KKyNk
ZWZpbmUgU0NPX01BU0sJMHgwMQ0KKyNkZWZpbmUgQUNMX01BU0sJMHgwMg0KKyNkZWZpbmUgRVND
T19NQVNLCTB4MDQNCisNCitzdGF0aWMgaW5saW5lIF9fdTggbGlua19tYXNrKF9fdTggdHlwZSkN
Cit7DQorCXJldHVybiB0eXBlIDwgTEVfTElOSyA/IDEgPDwgdHlwZSA6IExFX01BU0s7DQorfQ0K
Kw0KIC8qIExNUCBmZWF0dXJlcyAqLw0KICNkZWZpbmUgTE1QXzNTTE9UCTB4MDENCiAjZGVmaW5l
IExNUF81U0xPVAkweDAyDQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jIGIv
bmV0L2JsdWV0b290aC9oY2lfY29yZS5jDQppbmRleCBiMmExYjlhLi5jOWI0NGM1IDEwMDY0NA0K
LS0tIGEvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jDQorKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9j
b3JlLmMNCkBAIC0xNzk4LDcgKzE3OTgsNyBAQCBFWFBPUlRfU1lNQk9MKGhjaV9zZW5kX3Njbyk7
DQogLyogLS0tLSBIQ0kgVFggdGFzayAob3V0Z29pbmcgZGF0YSkgLS0tLSAqLw0KIA0KIC8qIEhD
SSBDb25uZWN0aW9uIHNjaGVkdWxlciAqLw0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGhjaV9jb25u
ICpoY2lfbG93X3NlbnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTggdHlwZSwNCitzdGF0aWMg
aW5saW5lIHN0cnVjdCBoY2lfY29ubiAqaGNpX2xvd19zZW50KHN0cnVjdCBoY2lfZGV2ICpoZGV2
LCBfX3U4IHNlbGVjdCwNCiAJCQkJCQkJaW50IGNudCwgaW50ICpxdW90ZSkNCiB7DQogCXN0cnVj
dCBoY2lfY29ubl9oYXNoICpoID0gJmhkZXYtPmNvbm5faGFzaDsNCkBAIC0xODEyLDcgKzE4MTIs
MTAgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgaGNpX2Nvbm4gKmhjaV9sb3dfc2VudChzdHJ1Y3Qg
aGNpX2RldiAqaGRldiwgX191OCB0eXBlLA0KIAkJc3RydWN0IGhjaV9jb25uICpjOw0KIAkJYyA9
IGxpc3RfZW50cnkocCwgc3RydWN0IGhjaV9jb25uLCBsaXN0KTsNCiANCi0JCWlmIChjLT50eXBl
ICE9IHR5cGUgfHwgc2tiX3F1ZXVlX2VtcHR5KCZjLT5kYXRhX3EpKQ0KKwkJaWYgKGxpbmtfbWFz
ayhjLT50eXBlKSAmIH5zZWxlY3QpDQorCQkJY29udGludWU7DQorDQorCQlpZiAoc2tiX3F1ZXVl
X2VtcHR5KCZjLT5kYXRhX3EpKQ0KIAkJCWNvbnRpbnVlOw0KIA0KIAkJaWYgKGMtPnN0YXRlICE9
IEJUX0NPTk5FQ1RFRCAmJiBjLT5zdGF0ZSAhPSBCVF9DT05GSUcpDQpAQCAtMTgzMyw3ICsxODM2
LDcgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgaGNpX2Nvbm4gKmhjaV9sb3dfc2VudChzdHJ1Y3Qg
aGNpX2RldiAqaGRldiwgX191OCB0eXBlLA0KIAlyZXR1cm4gY29ubjsNCiB9DQogDQotc3RhdGlj
IGlubGluZSB2b2lkIGhjaV9saW5rX3R4X3RvKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBfX3U4IHR5
cGUpDQorc3RhdGljIGlubGluZSB2b2lkIGhjaV9saW5rX3R4X3RvKHN0cnVjdCBoY2lfZGV2ICpo
ZGV2LCBfX3U4IHNlbGVjdCkNCiB7DQogCXN0cnVjdCBoY2lfY29ubl9oYXNoICpoID0gJmhkZXYt
PmNvbm5faGFzaDsNCiAJc3RydWN0IGxpc3RfaGVhZCAqcDsNCkBAIC0xODQ0LDcgKzE4NDcsNyBA
QCBzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2xpbmtfdHhfdG8oc3RydWN0IGhjaV9kZXYgKmhkZXYs
IF9fdTggdHlwZSkNCiAJLyogS2lsbCBzdGFsbGVkIGNvbm5lY3Rpb25zICovDQogCWxpc3RfZm9y
X2VhY2gocCwgJmgtPmxpc3QpIHsNCiAJCWMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoY2lfY29u
biwgbGlzdCk7DQotCQlpZiAoYy0+dHlwZSA9PSB0eXBlICYmIGMtPnNlbnQpIHsNCisJCWlmIChs
aW5rX21hc2soYy0+dHlwZSkgJiBzZWxlY3QgJiYgYy0+c2VudCkgew0KIAkJCUJUX0VSUigiJXMg
a2lsbGluZyBzdGFsbGVkIGNvbm5lY3Rpb24gJXMiLA0KIAkJCQloZGV2LT5uYW1lLCBiYXRvc3Ry
KCZjLT5kc3QpKTsNCiAJCQloY2lfYWNsX2Rpc2Nvbm4oYywgMHgxMyk7DQpAQCAtMTg1OCw2ICsx
ODYxLDExIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfc2NoZWRfYWNsKHN0cnVjdCBoY2lfZGV2
ICpoZGV2KQ0KIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOw0KIAlpbnQgcXVvdGUgPSAwOw0KIAlpbnQg
Y250ID0gaGRldi0+YWNsX2NudDsNCisJX191OCBzZWxlY3QgPSBBQ0xfTUFTSzsNCisNCisJLyog
QWxzbyBzZWxlY3QgTEUgbGlua3MgaWYgQUNMIGJ1ZmZlcnMgYXJlIHNoYXJlZCAqLw0KKwlpZiAo
IWhkZXYtPmxlX3BrdHMpDQorCQlzZWxlY3QgfD0gTEVfTUFTSzsNCiANCiAJQlRfREJHKCIlcyIs
IGhkZXYtPm5hbWUpOw0KIA0KQEAgLTE4NjUsMTQgKzE4NzMsMTUgQEAgc3RhdGljIGlubGluZSB2
b2lkIGhjaV9zY2hlZF9hY2woc3RydWN0IGhjaV9kZXYgKmhkZXYpDQogCQkvKiBBQ0wgdHggdGlt
ZW91dCBtdXN0IGJlIGxvbmdlciB0aGFuIG1heGltdW0NCiAJCSAqIGxpbmsgc3VwZXJ2aXNpb24g
dGltZW91dCAoNDAuOSBzZWNvbmRzKSAqLw0KIAkJaWYgKCFjbnQgJiYgdGltZV9hZnRlcihqaWZm
aWVzLCBoZGV2LT5hY2xfbGFzdF90eCArIEhaICogNDUpKQ0KLQkJCWhjaV9saW5rX3R4X3RvKGhk
ZXYsIEFDTF9MSU5LKTsNCisJCQloY2lfbGlua190eF90byhoZGV2LCBzZWxlY3QpOw0KIAl9DQog
DQotCXdoaWxlIChjbnQgJiYgKGNvbm4gPSBoY2lfbG93X3NlbnQoaGRldiwgQUNMX0xJTkssIGNu
dCwgJnF1b3RlKSkpIHsNCisJd2hpbGUgKGNudCAmJiAoY29ubiA9IGhjaV9sb3dfc2VudChoZGV2
LCBzZWxlY3QsIGNudCwgJnF1b3RlKSkpIHsNCiAJCXdoaWxlIChxdW90ZS0tICYmIChza2IgPSBz
a2JfZGVxdWV1ZSgmY29ubi0+ZGF0YV9xKSkpIHsNCiAJCQlCVF9EQkcoInNrYiAlcCBsZW4gJWQi
LCBza2IsIHNrYi0+bGVuKTsNCiANCi0JCQloY2lfY29ubl9lbnRlcl9hY3RpdmVfbW9kZShjb25u
KTsNCisJCQlpZiAoY29ubi0+dHlwZSA9PSBBQ0xfTElOSykNCisJCQkJaGNpX2Nvbm5fZW50ZXJf
YWN0aXZlX21vZGUoY29ubik7DQogDQogCQkJaGNpX3NlbmRfZnJhbWUoc2tiKTsNCiAJCQloZGV2
LT5hY2xfbGFzdF90eCA9IGppZmZpZXM7DQpAQCAtMTg5MSwzMSArMTkwMCwxMSBAQCBzdGF0aWMg
aW5saW5lIHZvaWQgaGNpX3NjaGVkX3NjbyhzdHJ1Y3QgaGNpX2RldiAqaGRldikNCiAJc3RydWN0
IHNrX2J1ZmYgKnNrYjsNCiAJaW50IHF1b3RlID0gMDsNCiAJaW50IGNudCA9IGhkZXYtPnNjb19j
bnQ7DQorCV9fdTggc2VsZWN0ID0gU0NPX01BU0sgfCBFU0NPX01BU0s7DQogDQogCUJUX0RCRygi
JXMiLCBoZGV2LT5uYW1lKTsNCiANCi0Jd2hpbGUgKGNudCAmJiAoY29ubiA9IGhjaV9sb3dfc2Vu
dChoZGV2LCBTQ09fTElOSywgY250LCAmcXVvdGUpKSkgew0KLQkJd2hpbGUgKHF1b3RlLS0gJiYg
KHNrYiA9IHNrYl9kZXF1ZXVlKCZjb25uLT5kYXRhX3EpKSkgew0KLQkJCUJUX0RCRygic2tiICVw
IGxlbiAlZCIsIHNrYiwgc2tiLT5sZW4pOw0KLQkJCWhjaV9zZW5kX2ZyYW1lKHNrYik7DQotDQot
CQkJY29ubi0+c2VudCsrOw0KLQkJCWlmIChjb25uLT5zZW50ID09IH4wKQ0KLQkJCQljb25uLT5z
ZW50ID0gMDsNCi0JCX0NCi0JfQ0KLX0NCi0NCi1zdGF0aWMgaW5saW5lIHZvaWQgaGNpX3NjaGVk
X2VzY28oc3RydWN0IGhjaV9kZXYgKmhkZXYpDQotew0KLQlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm47
DQotCXN0cnVjdCBza19idWZmICpza2I7DQotCWludCBxdW90ZSA9IDA7DQotCWludCBjbnQgPSBo
ZGV2LT5zY29fY250Ow0KLQ0KLQlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7DQotDQotCXdoaWxl
IChjbnQgJiYgKGNvbm4gPSBoY2lfbG93X3NlbnQoaGRldiwgRVNDT19MSU5LLCBjbnQsICZxdW90
ZSkpKSB7DQorCXdoaWxlIChjbnQgJiYgKGNvbm4gPSBoY2lfbG93X3NlbnQoaGRldiwgc2VsZWN0
LCBjbnQsICZxdW90ZSkpKSB7DQogCQl3aGlsZSAocXVvdGUtLSAmJiAoc2tiID0gc2tiX2RlcXVl
dWUoJmNvbm4tPmRhdGFfcSkpKSB7DQogCQkJQlRfREJHKCJza2IgJXAgbGVuICVkIiwgc2tiLCBz
a2ItPmxlbik7DQogCQkJaGNpX3NlbmRfZnJhbWUoc2tiKTsNCkBAIC0xOTMyLDE5ICsxOTIxLDE4
IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfc2NoZWRfbGUoc3RydWN0IGhjaV9kZXYgKmhkZXYp
DQogCXN0cnVjdCBoY2lfY29ubiAqY29ubjsNCiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsNCiAJaW50
IHF1b3RlID0gMDsNCi0JaW50IGNudCA9IGhkZXYtPmxlX3BrdHMgPyBoZGV2LT5sZV9jbnQgOiBo
ZGV2LT5hY2xfY250Ow0KKwlpbnQgY250ID0gaGRldi0+bGVfY250Ow0KIA0KIAlCVF9EQkcoIiVz
IiwgaGRldi0+bmFtZSk7DQogDQogCWlmICghdGVzdF9iaXQoSENJX1JBVywgJmhkZXYtPmZsYWdz
KSkgew0KIAkJLyogTEUgdHggdGltZW91dCBtdXN0IGJlIGxvbmdlciB0aGFuIG1heGltdW0NCiAJ
CSAqIGxpbmsgc3VwZXJ2aXNpb24gdGltZW91dCAoNDAuOSBzZWNvbmRzKSAqLw0KLQkJaWYgKCFo
ZGV2LT5sZV9jbnQgJiYgaGRldi0+bGVfcGt0cyAmJg0KLQkJCQl0aW1lX2FmdGVyKGppZmZpZXMs
IGhkZXYtPmxlX2xhc3RfdHggKyBIWiAqIDQ1KSkNCi0JCQloY2lfbGlua190eF90byhoZGV2LCBM
RV9MSU5LKTsNCisJCWlmICghY250ICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgaGRldi0+bGVfbGFz
dF90eCArIEhaICogNDUpKQ0KKwkJCWhjaV9saW5rX3R4X3RvKGhkZXYsIExFX01BU0spOw0KIAl9
DQogDQotCXdoaWxlIChjbnQgJiYgKGNvbm4gPSBoY2lfbG93X3NlbnQoaGRldiwgTEVfTElOSywg
Y250LCAmcXVvdGUpKSkgew0KKwl3aGlsZSAoY250ICYmIChjb25uID0gaGNpX2xvd19zZW50KGhk
ZXYsIExFX01BU0ssIGNudCwgJnF1b3RlKSkpIHsNCiAJCXdoaWxlIChxdW90ZS0tICYmIChza2Ig
PSBza2JfZGVxdWV1ZSgmY29ubi0+ZGF0YV9xKSkpIHsNCiAJCQlCVF9EQkcoInNrYiAlcCBsZW4g
JWQiLCBza2IsIHNrYi0+bGVuKTsNCiANCkBAIC0xOTU1LDEwICsxOTQzLDcgQEAgc3RhdGljIGlu
bGluZSB2b2lkIGhjaV9zY2hlZF9sZShzdHJ1Y3QgaGNpX2RldiAqaGRldikNCiAJCQljb25uLT5z
ZW50Kys7DQogCQl9DQogCX0NCi0JaWYgKGhkZXYtPmxlX3BrdHMpDQotCQloZGV2LT5sZV9jbnQg
PSBjbnQ7DQotCWVsc2UNCi0JCWhkZXYtPmFjbF9jbnQgPSBjbnQ7DQorCWhkZXYtPmxlX2NudCA9
IGNudDsNCiB9DQogDQogc3RhdGljIHZvaWQgaGNpX3R4X3Rhc2sodW5zaWduZWQgbG9uZyBhcmcp
DQpAQCAtMTk3MywxNCArMTk1OCwxNCBAQCBzdGF0aWMgdm9pZCBoY2lfdHhfdGFzayh1bnNpZ25l
ZCBsb25nIGFyZykNCiANCiAJLyogU2NoZWR1bGUgcXVldWVzIGFuZCBzZW5kIHN0dWZmIHRvIEhD
SSBkcml2ZXIgKi8NCiANCisJLyogQWxzbyBzY2hlZHVsZXMgTEUgbGlua3MgaWYgYWNsIGJ1ZmZl
cnMgYXJlIHNoYXJlZCAqLw0KIAloY2lfc2NoZWRfYWNsKGhkZXYpOw0KIA0KKwkvKiBBbHNvIHNj
aGVkdWxlcyBlc2NvIGxpbmtzICovDQogCWhjaV9zY2hlZF9zY28oaGRldik7DQogDQotCWhjaV9z
Y2hlZF9lc2NvKGhkZXYpOw0KLQ0KLQkvKiBPbmx5IHNjaGVkdWxlIGxlIGxpbmtzIGlmIGRldmlj
ZSBpcyBsZS1jYXBhYmxlICovDQotCWlmIChsbXBfbGVfY2FwYWJsZShoZGV2KSkNCisJLyogT25s
eSBzY2hlZHVsZSBMRSBsaW5rcyBoZXJlIGlmIGFjbCBidWZmZXJzIGFyZSBub3Qgc2hhcmVkICov
DQorCWlmIChoZGV2LT5sZV9wa3RzKQ0KIAkJaGNpX3NjaGVkX2xlKGhkZXYpOw0KIA0KIAkvKiBT
ZW5kIG5leHQgcXVldWVkIHJhdyAodW5rbm93biB0eXBlKSBwYWNrZXQgKi8NCi0tIA0KMS43LjQu
MQ0KDQo=


2011-08-18 08:18:32

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: [RFC v2 4/5] Bluetooth: Schedule links by tx buffer use

Hi Peter,

On Thu, Aug 18, 2011 at 3:37 AM, Peter Hurley <[email protected]> wrote:
> Combine tx link types which use the same tx buffers. So SCO and ESCO
> links are scheduled together and also schedule LE links with ACL
> links *if* the controller uses shared ACL buffers for LE tx.
>
> This also fixes tx timeouts if the controller uses shared ACL buffers
> for LE tx.
>
> Signed-off-by: Peter Hurley <[email protected]>
> ---
> ?include/net/bluetooth/hci.h | ? 10 ++++++
> ?net/bluetooth/hci_core.c ? ?| ? 69 +++++++++++++++++--------------------------
> ?2 files changed, 37 insertions(+), 42 deletions(-)
>
> diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
> index 0c20227..c8319e5 100644
> --- a/include/net/bluetooth/hci.h
> +++ b/include/net/bluetooth/hci.h
> @@ -174,6 +174,16 @@ enum {
> ?/* Low Energy links do not have defined link type. Use invented one */
> ?#define LE_LINK ? ? ? ? ? ? ? ?0x80
>
> +#define LE_MASK ? ? ? ? ? ? ? ?0x80
> +#define SCO_MASK ? ? ? 0x01
> +#define ACL_MASK ? ? ? 0x02
> +#define ESCO_MASK ? ? ?0x04
> +
> +static inline __u8 link_mask(__u8 type)
> +{
> + ? ? ? return type < LE_LINK ? 1 << type : LE_MASK;
> +}
> +
> ?/* LMP features */
> ?#define LMP_3SLOT ? ? ?0x01
> ?#define LMP_5SLOT ? ? ?0x02
> diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
> index b2a1b9a..c9b44c5 100644
> --- a/net/bluetooth/hci_core.c
> +++ b/net/bluetooth/hci_core.c
> @@ -1798,7 +1798,7 @@ EXPORT_SYMBOL(hci_send_sco);
> ?/* ---- HCI TX task (outgoing data) ---- */
>
> ?/* HCI Connection scheduler */
> -static inline struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type,
> +static inline struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 select,
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int cnt, int *quote)
> ?{
> ? ? ? ?struct hci_conn_hash *h = &hdev->conn_hash;
> @@ -1812,7 +1812,10 @@ static inline struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type,
> ? ? ? ? ? ? ? ?struct hci_conn *c;
> ? ? ? ? ? ? ? ?c = list_entry(p, struct hci_conn, list);
>
> - ? ? ? ? ? ? ? if (c->type != type || skb_queue_empty(&c->data_q))
> + ? ? ? ? ? ? ? if (link_mask(c->type) & ~select)
> + ? ? ? ? ? ? ? ? ? ? ? continue;
> +
> + ? ? ? ? ? ? ? if (skb_queue_empty(&c->data_q))
> ? ? ? ? ? ? ? ? ? ? ? ?continue;
>
> ? ? ? ? ? ? ? ?if (c->state != BT_CONNECTED && c->state != BT_CONFIG)
> @@ -1833,7 +1836,7 @@ static inline struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type,
> ? ? ? ?return conn;
> ?}
>
> -static inline void hci_link_tx_to(struct hci_dev *hdev, __u8 type)
> +static inline void hci_link_tx_to(struct hci_dev *hdev, __u8 select)
> ?{
> ? ? ? ?struct hci_conn_hash *h = &hdev->conn_hash;
> ? ? ? ?struct list_head *p;
> @@ -1844,7 +1847,7 @@ static inline void hci_link_tx_to(struct hci_dev *hdev, __u8 type)
> ? ? ? ?/* Kill stalled connections */
> ? ? ? ?list_for_each(p, &h->list) {
> ? ? ? ? ? ? ? ?c = list_entry(p, struct hci_conn, list);
> - ? ? ? ? ? ? ? if (c->type == type && c->sent) {
> + ? ? ? ? ? ? ? if (link_mask(c->type) & select && c->sent) {
> ? ? ? ? ? ? ? ? ? ? ? ?BT_ERR("%s killing stalled connection %s",
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?hdev->name, batostr(&c->dst));
> ? ? ? ? ? ? ? ? ? ? ? ?hci_acl_disconn(c, 0x13);
> @@ -1858,6 +1861,11 @@ static inline void hci_sched_acl(struct hci_dev *hdev)
> ? ? ? ?struct sk_buff *skb;
> ? ? ? ?int quote = 0;
> ? ? ? ?int cnt = hdev->acl_cnt;
> + ? ? ? __u8 select = ACL_MASK;
> +
> + ? ? ? /* Also select LE links if ACL buffers are shared */
> + ? ? ? if (!hdev->le_pkts)
> + ? ? ? ? ? ? ? select |= LE_MASK;
>
> ? ? ? ?BT_DBG("%s", hdev->name);
>
> @@ -1865,14 +1873,15 @@ static inline void hci_sched_acl(struct hci_dev *hdev)
> ? ? ? ? ? ? ? ?/* ACL tx timeout must be longer than maximum
> ? ? ? ? ? ? ? ? * link supervision timeout (40.9 seconds) */
> ? ? ? ? ? ? ? ?if (!cnt && time_after(jiffies, hdev->acl_last_tx + HZ * 45))
> - ? ? ? ? ? ? ? ? ? ? ? hci_link_tx_to(hdev, ACL_LINK);
> + ? ? ? ? ? ? ? ? ? ? ? hci_link_tx_to(hdev, select);
> ? ? ? ?}
>
> - ? ? ? while (cnt && (conn = hci_low_sent(hdev, ACL_LINK, cnt, &quote))) {
> + ? ? ? while (cnt && (conn = hci_low_sent(hdev, select, cnt, &quote))) {
> ? ? ? ? ? ? ? ?while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
> ? ? ? ? ? ? ? ? ? ? ? ?BT_DBG("skb %p len %d", skb, skb->len);
>
> - ? ? ? ? ? ? ? ? ? ? ? hci_conn_enter_active_mode(conn);
> + ? ? ? ? ? ? ? ? ? ? ? if (conn->type == ACL_LINK)
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hci_conn_enter_active_mode(conn);
>
> ? ? ? ? ? ? ? ? ? ? ? ?hci_send_frame(skb);
> ? ? ? ? ? ? ? ? ? ? ? ?hdev->acl_last_tx = jiffies;
> @@ -1891,31 +1900,11 @@ static inline void hci_sched_sco(struct hci_dev *hdev)
> ? ? ? ?struct sk_buff *skb;
> ? ? ? ?int quote = 0;
> ? ? ? ?int cnt = hdev->sco_cnt;
> + ? ? ? __u8 select = SCO_MASK | ESCO_MASK;
>
> ? ? ? ?BT_DBG("%s", hdev->name);
>
> - ? ? ? while (cnt && (conn = hci_low_sent(hdev, SCO_LINK, cnt, &quote))) {
> - ? ? ? ? ? ? ? while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
> - ? ? ? ? ? ? ? ? ? ? ? BT_DBG("skb %p len %d", skb, skb->len);
> - ? ? ? ? ? ? ? ? ? ? ? hci_send_frame(skb);
> -
> - ? ? ? ? ? ? ? ? ? ? ? conn->sent++;
> - ? ? ? ? ? ? ? ? ? ? ? if (conn->sent == ~0)
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? conn->sent = 0;
> - ? ? ? ? ? ? ? }
> - ? ? ? }
> -}
> -
> -static inline void hci_sched_esco(struct hci_dev *hdev)
> -{
> - ? ? ? struct hci_conn *conn;
> - ? ? ? struct sk_buff *skb;
> - ? ? ? int quote = 0;
> - ? ? ? int cnt = hdev->sco_cnt;
> -
> - ? ? ? BT_DBG("%s", hdev->name);
> -
> - ? ? ? while (cnt && (conn = hci_low_sent(hdev, ESCO_LINK, cnt, &quote))) {
> + ? ? ? while (cnt && (conn = hci_low_sent(hdev, select, cnt, &quote))) {
> ? ? ? ? ? ? ? ?while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
> ? ? ? ? ? ? ? ? ? ? ? ?BT_DBG("skb %p len %d", skb, skb->len);
> ? ? ? ? ? ? ? ? ? ? ? ?hci_send_frame(skb);
> @@ -1932,19 +1921,18 @@ static inline void hci_sched_le(struct hci_dev *hdev)
> ? ? ? ?struct hci_conn *conn;
> ? ? ? ?struct sk_buff *skb;
> ? ? ? ?int quote = 0;
> - ? ? ? int cnt = hdev->le_pkts ? hdev->le_cnt : hdev->acl_cnt;
> + ? ? ? int cnt = hdev->le_cnt;
>
> ? ? ? ?BT_DBG("%s", hdev->name);
>
> ? ? ? ?if (!test_bit(HCI_RAW, &hdev->flags)) {
> ? ? ? ? ? ? ? ?/* LE tx timeout must be longer than maximum
> ? ? ? ? ? ? ? ? * link supervision timeout (40.9 seconds) */
> - ? ? ? ? ? ? ? if (!hdev->le_cnt && hdev->le_pkts &&
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? time_after(jiffies, hdev->le_last_tx + HZ * 45))
> - ? ? ? ? ? ? ? ? ? ? ? hci_link_tx_to(hdev, LE_LINK);
> + ? ? ? ? ? ? ? if (!cnt && time_after(jiffies, hdev->le_last_tx + HZ * 45))
> + ? ? ? ? ? ? ? ? ? ? ? hci_link_tx_to(hdev, LE_MASK);
> ? ? ? ?}
>
> - ? ? ? while (cnt && (conn = hci_low_sent(hdev, LE_LINK, cnt, &quote))) {
> + ? ? ? while (cnt && (conn = hci_low_sent(hdev, LE_MASK, cnt, &quote))) {
> ? ? ? ? ? ? ? ?while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
> ? ? ? ? ? ? ? ? ? ? ? ?BT_DBG("skb %p len %d", skb, skb->len);
>
> @@ -1955,10 +1943,7 @@ static inline void hci_sched_le(struct hci_dev *hdev)
> ? ? ? ? ? ? ? ? ? ? ? ?conn->sent++;
> ? ? ? ? ? ? ? ?}
> ? ? ? ?}
> - ? ? ? if (hdev->le_pkts)
> - ? ? ? ? ? ? ? hdev->le_cnt = cnt;
> - ? ? ? else
> - ? ? ? ? ? ? ? hdev->acl_cnt = cnt;
> + ? ? ? hdev->le_cnt = cnt;
> ?}
>
> ?static void hci_tx_task(unsigned long arg)
> @@ -1973,14 +1958,14 @@ static void hci_tx_task(unsigned long arg)
>
> ? ? ? ?/* Schedule queues and send stuff to HCI driver */
>
> + ? ? ? /* Also schedules LE links if acl buffers are shared */
> ? ? ? ?hci_sched_acl(hdev);
>
> + ? ? ? /* Also schedules esco links */
> ? ? ? ?hci_sched_sco(hdev);
>
> - ? ? ? hci_sched_esco(hdev);
> -
> - ? ? ? /* Only schedule le links if device is le-capable */
> - ? ? ? if (lmp_le_capable(hdev))
> + ? ? ? /* Only schedule LE links here if acl buffers are not shared */
> + ? ? ? if (hdev->le_pkts)
> ? ? ? ? ? ? ? ?hci_sched_le(hdev);
>
> ? ? ? ?/* Send next queued raw (unknown type) packet */
> --
> 1.7.4.1
>
>

I wonder if it wouldn't be simpler to just have another type e.g.
sched_type in hci_conn, so when initializing the connection we already
define which sched_type to use e.g. for LE sched_type = hdev->le_pkts
? LE_LINK : ACL_LINK.

--
Luiz Augusto von Dentz