Skip to contentSkip to conversation

Bluetooth: Schedule links by tx buffer use

RFC In review Peter Hurley 2 participants 2 messages Aug 18, 2011 Bluetooth drivers

lore
Share & tools
lore
#0 lore raw

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=

#1 lore raw

Hi Peter,

Quoted 198 lines · Peter Hurley

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.

---
 include/net/bluetooth/hci.h |   10 ++++++ net/bluetooth/hci_core.c    |   69 +++++++++++++++++--------------------------

 2 files changed, 37 insertions(+), 42 deletions(-)
include/net/bluetooth/hci.h +10 -0
index 0c20227..c8319e5 100644
@@ -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
net/bluetooth/hci_core.c +27 -43
index b2a1b9a..c9b44c5 100644
@@ -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 */
--
Quoted 3 lines

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.

Signature · 1 line
Luiz Augusto von Dentz