linux-bluetooth.vger.kernel.org archive mirror
 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).