All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC v2 4/5] Bluetooth: Schedule links by tx buffer use
@ 2011-08-18  0:37 Peter Hurley
  2011-08-18  8:18 ` Luiz Augusto von Dentz
  0 siblings, 1 reply; 2+ messages in thread
From: Peter Hurley @ 2011-08-18  0:37 UTC (permalink / raw)
  To: linux-bluetooth

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=

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [RFC v2 4/5] Bluetooth: Schedule links by tx buffer use
  2011-08-18  0:37 [RFC v2 4/5] Bluetooth: Schedule links by tx buffer use Peter Hurley
@ 2011-08-18  8:18 ` Luiz Augusto von Dentz
  0 siblings, 0 replies; 2+ messages in thread
From: Luiz Augusto von Dentz @ 2011-08-18  8:18 UTC (permalink / raw)
  To: Peter Hurley; +Cc: linux-bluetooth

Hi Peter,

On Thu, Aug 18, 2011 at 3:37 AM, Peter Hurley <peter@hurleysoftware.com> 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 <peter@hurleysoftware.com>
> ---
>  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

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2011-08-18  8:18 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-08-18  0:37 [RFC v2 4/5] Bluetooth: Schedule links by tx buffer use Peter Hurley
2011-08-18  8:18 ` Luiz Augusto von Dentz

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.