Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp4531236ybp; Mon, 14 Oct 2019 06:12:34 -0700 (PDT) X-Google-Smtp-Source: APXvYqxc6sYxdNxzpjBsSs7F7r8qnanKe/gmJ+91SHE+gqwiSig3s6cqzUqpy1cqeROCh/UU+oOQ X-Received: by 2002:a05:6402:3c5:: with SMTP id t5mr27514354edw.125.1571058754828; Mon, 14 Oct 2019 06:12:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1571058754; cv=none; d=google.com; s=arc-20160816; b=BNk5m6325HCcFkI2Ycg9KJ/iLbsAJxNQ5ISculrf8tyG3Z7oPiFvBQQj4uwJh5t0vK 5aN2GoDWT0d38hTATQt3euqvxE3UimLUy/3rG5UvCJbsVEEOJXSWTkhKPljQSus6QenQ 709bXU5+YIFCG9soFGvLb5aCvw+ZVfCpDLckkfDrWEZtRi/R+ambE38Mlvnj2B+Wkd7D jW6SxZZ6hLlaEBecZ0zHRECphimOK7WP2G15zJO8REZSxkWNngabbfsFjDYnLTLm6U9V 8MvuUOBh4bYn972dqAXEMKQvquG0OCFT4x4MYO8PR/V36IYRRB4dZlrU1F4xS327TvAY o1/A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:to:references:message-id :content-transfer-encoding:cc:date:in-reply-to:from:subject :mime-version; bh=ium6jcucqwZ3aks4cWkMVUrp+Ns8HVw4ofZXM5tXAcg=; b=EGicEizr4o2HyN5qGxZBIhgP/E3qJVfgFFW5FI6kwsp33usDCO+vnbdFSZ3MCiWd5/ 2atUQ4V4SMUZrvZQHdhu65kusAj+b9l5CkjCDwnt4yg76e+T4f9z0VEIZIZ4yxPEIBoq QDcWQpCgBkBxA9i3rtSRNN34b/SuF6lEZuXBqVgvwGNJBDLqkvEZ4c2CjO1+W1TwGuyN TF1ZzclpAhAn46ltqrDV4ltHPIPIOXVn1RvNvNvV9/1k1kOio8UqHs916vsL3qlG1e0r xGIELfoSHfsR9c3lHE9d2ldVrR2NVz4SU4tBNFYqlpckum0RRGYX7+EqqzcsVwCNp7uh cJqw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g18si10693016eje.297.2019.10.14.06.12.00; Mon, 14 Oct 2019 06:12:34 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729817AbfJNNKN convert rfc822-to-8bit (ORCPT + 99 others); Mon, 14 Oct 2019 09:10:13 -0400 Received: from coyote.holtmann.net ([212.227.132.17]:50400 "EHLO mail.holtmann.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725989AbfJNNKN (ORCPT ); Mon, 14 Oct 2019 09:10:13 -0400 Received: from [192.168.1.91] (p4FEFC197.dip0.t-ipconnect.de [79.239.193.151]) by mail.holtmann.org (Postfix) with ESMTPSA id 406ACCED2C; Mon, 14 Oct 2019 15:19:08 +0200 (CEST) Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (Mac OS X Mail 13.0 \(3594.4.19\)) Subject: Re: [PATCH v2] Bluetooth: btusb: hci_event: handle msbc audio over USB Endpoints From: Marcel Holtmann In-Reply-To: Date: Mon, 14 Oct 2019 15:09:39 +0200 Cc: "linux-bluetooth@vger.kernel.org" , "Tumkur Narayan, Chethan" , "Narasimman, Sathish" , "Hegde, Raghuram" , Hsin-Yu Chao Content-Transfer-Encoding: 8BIT Message-Id: References: <1569557518-16750-1-git-send-email-amit.k.bag@intel.com> To: "Bag, Amit K" X-Mailer: Apple Mail (2.3594.4.19) Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Hi Amit, >> For msbc encoded audio stream over usb transport, btusb driver to be set to alternate settings 6 as per BT core spec 5.0. This done from hci_sync_conn_complete_evt. The type of air mode is known during this event. For this reason the btusb is to be notifed about the TRANSPARENT air mode and the ALT setting 6 is selected. >> The changes are made considering some discussion over the similar patch submitted earlier from Kuba Pawlak(link below) https://www.spinics.net/lists/linux-bluetooth/msg64577.html >> >> (am from https://www.spinics.net/lists/linux-bluetooth/msg76982.html) >> >> Signed-off-by: Chethan T N >> Signed-off-by: Sathish Narasimman >> Signed-off-by: Raghuram Hegde >> Signed-off-by: Hsin-Yu Chao >> Signed-off-by: Amit K Bag >> >> Signed-off-by: Amit K Bag >> --- >> drivers/bluetooth/btusb.c | 138 +++++++++++++++++++++++++++++--------------- >> include/net/bluetooth/hci.h | 1 + >> net/bluetooth/hci_event.c | 5 ++ >> 3 files changed, 99 insertions(+), 45 deletions(-) >> >> diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index a9c35ebb30f8..f52acced68f8 100644 >> --- a/drivers/bluetooth/btusb.c >> +++ b/drivers/bluetooth/btusb.c >> @@ -57,6 +57,9 @@ static struct usb_driver btusb_driver; >> #define BTUSB_IFNUM_2 0x80000 >> #define BTUSB_CW6622 0x100000 >> #define BTUSB_MEDIATEK 0x200000 >> +#define BTUSB_ALT6_FLOW_CNTRL 6 >> + >> +static int set_hci_packet_interval_flow = BTUSB_ALT6_FLOW_CNTRL; >> >> static const struct usb_device_id btusb_table[] = { >> /* Generic Bluetooth USB device */ >> @@ -974,6 +977,38 @@ static void btusb_isoc_complete(struct urb *urb) >> } >> } >> >> +static inline void __fill_isoc_descriptor_msbc(struct urb *urb, int len, >> + int mtu) >> +{ >> + int i, offset = 0; >> + >> + /* For msbc ALT 6 setting the host will send the packet at continuous >> + * flow. As per core spec 5, vol 4, part B, table 2.1. For ALT setting >> + * 6 the HCI PACKET INTERVAL should be 7.5ms for every usb packets. >> + * To maintain the rate we send 63bytes of usb packets alternatively for >> + * 7ms and 8ms to maintain the rate as 7.5ms. >> + */ >> + if (set_hci_packet_interval_flow == 6) >> + set_hci_packet_interval_flow = 7; >> + else if (set_hci_packet_interval_flow == 7) >> + set_hci_packet_interval_flow = 6; >> + >> + BT_DBG("len %d mtu %d", len, mtu); >> + >> + for (i = 0; i < set_hci_packet_interval_flow; i++) { >> + urb->iso_frame_desc[i].offset = offset; >> + urb->iso_frame_desc[i].length = offset; >> + } >> + >> + if (len && i < BTUSB_MAX_ISOC_FRAMES) { >> + urb->iso_frame_desc[i].offset = offset; >> + urb->iso_frame_desc[i].length = len; >> + i++; >> + } >> + >> + urb->number_of_packets = i; >> +} >> + >> static inline void __fill_isoc_descriptor(struct urb *urb, int len, int mtu) { >> int i, offset = 0; >> @@ -1376,9 +1411,12 @@ static struct urb *alloc_isoc_urb(struct hci_dev *hdev, struct sk_buff *skb) >> >> urb->transfer_flags = URB_ISO_ASAP; >> >> - __fill_isoc_descriptor(urb, skb->len, >> + if (data->isoc_altsetting == 6) >> + __fill_isoc_descriptor_msbc(urb, skb->len, >> + le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize)); >> + else >> + __fill_isoc_descriptor(urb, skb->len, >> le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize)); >> - >> skb->dev = (void *)hdev; >> >> return urb; >> @@ -1466,18 +1504,6 @@ static int btusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb) >> return -EILSEQ; >> } >> >> -static void btusb_notify(struct hci_dev *hdev, unsigned int evt) -{ >> - struct btusb_data *data = hci_get_drvdata(hdev); >> - >> - BT_DBG("%s evt %d", hdev->name, evt); >> - >> - if (hci_conn_num(hdev, SCO_LINK) != data->sco_num) { >> - data->sco_num = hci_conn_num(hdev, SCO_LINK); >> - schedule_work(&data->work); >> - } >> -} >> - >> static inline int __set_isoc_interface(struct hci_dev *hdev, int altsetting) { >> struct btusb_data *data = hci_get_drvdata(hdev); @@ -1521,6 +1547,58 @@ static inline int __set_isoc_interface(struct hci_dev *hdev, int altsetting) >> return 0; >> } >> >> +static int bt_switch_alt_setting(struct hci_dev *hdev, int new_alts) { >> + struct btusb_data *data = hci_get_drvdata(hdev); >> + int err; >> + >> + if (data->isoc_altsetting != new_alts) { >> + unsigned long flags; >> + >> + clear_bit(BTUSB_ISOC_RUNNING, &data->flags); >> + usb_kill_anchored_urbs(&data->isoc_anchor); >> + >> + /* When isochronous alternate setting needs to be >> + * changed, because SCO connection has been added >> + * or removed, a packet fragment may be left in the >> + * reassembling state. This could lead to wrongly >> + * assembled fragments. >> + * >> + * Clear outstanding fragment when selecting a new >> + * alternate setting. >> + */ >> + spin_lock_irqsave(&data->rxlock, flags); >> + kfree_skb(data->sco_skb); >> + data->sco_skb = NULL; >> + spin_unlock_irqrestore(&data->rxlock, flags); >> + >> + err = __set_isoc_interface(hdev, new_alts); >> + if (err < 0) >> + return err; >> + } >> + if (!test_and_set_bit(BTUSB_ISOC_RUNNING, &data->flags)) { >> + if (btusb_submit_isoc_urb(hdev, GFP_KERNEL) < 0) >> + clear_bit(BTUSB_ISOC_RUNNING, &data->flags); >> + else >> + btusb_submit_isoc_urb(hdev, GFP_KERNEL); >> + } >> + >> + return 0; >> +} >> + >> +static void btusb_notify(struct hci_dev *hdev, unsigned int evt) { >> + struct btusb_data *data = hci_get_drvdata(hdev); >> + >> + BT_DBG("%s evt %d", hdev->name, evt); >> + >> + if (hci_conn_num(hdev, SCO_LINK) != data->sco_num) { >> + data->sco_num = hci_conn_num(hdev, SCO_LINK); >> + schedule_work(&data->work); >> + } >> + >> +} >> + >> static void btusb_work(struct work_struct *work) { >> struct btusb_data *data = container_of(work, struct btusb_data, work); @@ -1547,37 +1625,7 @@ static void btusb_work(struct work_struct *work) >> } else { >> new_alts = data->sco_num; >> } >> - >> - if (data->isoc_altsetting != new_alts) { >> - unsigned long flags; >> - >> - clear_bit(BTUSB_ISOC_RUNNING, &data->flags); >> - usb_kill_anchored_urbs(&data->isoc_anchor); >> - >> - /* When isochronous alternate setting needs to be >> - * changed, because SCO connection has been added >> - * or removed, a packet fragment may be left in the >> - * reassembling state. This could lead to wrongly >> - * assembled fragments. >> - * >> - * Clear outstanding fragment when selecting a new >> - * alternate setting. >> - */ >> - spin_lock_irqsave(&data->rxlock, flags); >> - kfree_skb(data->sco_skb); >> - data->sco_skb = NULL; >> - spin_unlock_irqrestore(&data->rxlock, flags); >> - >> - if (__set_isoc_interface(hdev, new_alts) < 0) >> - return; >> - } >> - >> - if (!test_and_set_bit(BTUSB_ISOC_RUNNING, &data->flags)) { >> - if (btusb_submit_isoc_urb(hdev, GFP_KERNEL) < 0) >> - clear_bit(BTUSB_ISOC_RUNNING, &data->flags); >> - else >> - btusb_submit_isoc_urb(hdev, GFP_KERNEL); >> - } >> + bt_switch_alt_setting(hdev, new_alts); >> } else { >> clear_bit(BTUSB_ISOC_RUNNING, &data->flags); >> usb_kill_anchored_urbs(&data->isoc_anchor); >> diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 5bc1e30dedde..89ac29f1dffa 100644 >> --- a/include/net/bluetooth/hci.h >> +++ b/include/net/bluetooth/hci.h >> @@ -52,6 +52,7 @@ >> #define HCI_NOTIFY_CONN_ADD 1 >> #define HCI_NOTIFY_CONN_DEL 2 >> #define HCI_NOTIFY_VOICE_SETTING 3 >> +#define HCI_NOTIFY_AIR_MODE_TRANSP 4 >> >> /* HCI bus types */ >> #define HCI_VIRTUAL 0 >> diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index c1d3a303d97f..1c268932422c 100644 >> --- a/net/bluetooth/hci_event.c >> +++ b/net/bluetooth/hci_event.c >> @@ -4231,6 +4231,11 @@ static void hci_sync_conn_complete_evt(struct hci_dev *hdev, >> break; >> } >> >> + if (ev->air_mode == SCO_AIRMODE_TRANSP) { >> + if (hdev->notify) >> + hdev->notify(hdev, HCI_NOTIFY_AIR_MODE_TRANSP); >> + } >> + >> hci_connect_cfm(conn, ev->status); >> if (ev->status) >> hci_conn_del(conn); >> > > Anything pending in this patch to be merged. addressing my comments would help. Regards Marcel