Linux-Bluetooth Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH v6 2/2] bluetooth:btusb: handle msbc audio over USB Endpoints
@ 2019-12-05  8:32 Sathish Narsimman
  2019-12-10  4:57 ` Sathish Narasimman
  2020-01-04  9:58 ` Marcel Holtmann
  0 siblings, 2 replies; 6+ messages in thread
From: Sathish Narsimman @ 2019-12-05  8:32 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Sathish Narasimman, Chethan T N, Hsin-Yu Chao, Amit K Bag

From: Sathish Narasimman <sathish.narasimman@intel.com>

For msbc encoded audio stream over usb transport, btusb driver
to be set to alternate settings 6 as per BT core spec 5.0. The
type of air mode is used to differenting which alt setting to be
used.
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

Reported-by: kbuild test robot <lkp@intel.com>
Signed-off-by: Sathish Narasimman <sathish.narasimman@intel.com>
Signed-off-by: Chethan T N <chethan.tumkur.narayan@intel.com>
Signed-off-by: Hsin-Yu Chao <hychao@chromium.org>
Signed-off-by: Amit K Bag <amit.k.bag@intel.com>
---
 drivers/bluetooth/btusb.c | 157 +++++++++++++++++++++++++++++---------
 1 file changed, 121 insertions(+), 36 deletions(-)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index d9cd0677d41c..5563569f4473 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -483,6 +483,8 @@ struct btusb_data {
 	__u8 cmdreq;
 
 	unsigned int sco_num;
+	unsigned int air_mode;
+	bool usb_alt6_packet_flow;
 	int isoc_altsetting;
 	int suspend_count;
 
@@ -974,6 +976,42 @@ static void btusb_isoc_complete(struct urb *urb)
 	}
 }
 
+static inline void __fill_isoc_descriptor_msbc(struct urb *urb, int len,
+					       int mtu, struct btusb_data *data)
+{
+	int i, offset = 0;
+	unsigned int interval;
+
+	/* 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 (data->usb_alt6_packet_flow) {
+		interval = 7;
+		data->usb_alt6_packet_flow = false;
+	} else {
+		interval = 6;
+		data->usb_alt6_packet_flow = true;
+	}
+
+	BT_DBG("interval:%d len %d mtu %d", interval, len, mtu);
+
+	for (i = 0; i < interval; 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;
@@ -1377,9 +1415,13 @@ 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),
+			       data);
+	else
+		__fill_isoc_descriptor(urb, skb->len,
 			       le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize));
-
 	skb->dev = (void *)hdev;
 
 	return urb;
@@ -1475,6 +1517,7 @@ static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
 
 	if (hci_conn_num(hdev, SCO_LINK) != data->sco_num) {
 		data->sco_num = hci_conn_num(hdev, SCO_LINK);
+		data->air_mode = evt;
 		schedule_work(&data->work);
 	}
 }
@@ -1522,11 +1565,70 @@ 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 struct usb_host_interface *btusb_find_altsetting(struct btusb_data *data, int alt)
+{
+	struct usb_interface *intf = data->isoc;
+	int i;
+
+	BT_DBG("Looking for Alt no :%d", alt);
+
+	if (intf == NULL) {
+		BT_ERR("INterface NULL");
+		return NULL;
+	}
+
+	for (i = 0; i < intf->num_altsetting; i++) {
+		if (intf->altsetting[i].desc.bAlternateSetting == alt)
+			return &intf->altsetting[i];
+	}
+
+	return NULL;
+}
+
 static void btusb_work(struct work_struct *work)
 {
 	struct btusb_data *data = container_of(work, struct btusb_data, work);
 	struct hci_dev *hdev = data->hdev;
-	int new_alts;
+	int new_alts = 0;
 	int err;
 
 	if (data->sco_num > 0) {
@@ -1541,44 +1643,27 @@ static void btusb_work(struct work_struct *work)
 			set_bit(BTUSB_DID_ISO_RESUME, &data->flags);
 		}
 
-		if (hdev->voice_setting & 0x0020) {
-			static const int alts[3] = { 2, 4, 5 };
-
-			new_alts = alts[data->sco_num - 1];
-		} else {
-			new_alts = data->sco_num;
-		}
-
-		if (data->isoc_altsetting != new_alts) {
-			unsigned long flags;
+		if (data->air_mode == HCI_NOTIFY_ENABLE_SCO_CVSD) {
+			if (hdev->voice_setting & 0x0020) {
+				static const int alts[3] = { 2, 4, 5 };
 
-			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);
+				new_alts = alts[data->sco_num - 1];
+			} else {
+				new_alts = data->sco_num;
+			}
+		} else if (data->air_mode == HCI_NOTIFY_ENABLE_SCO_TRANSP) {
 
-			if (__set_isoc_interface(hdev, new_alts) < 0)
-				return;
-		}
+			data->usb_alt6_packet_flow = true;
 
-		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);
+			/* Check if Alt 6 is supported for Transparent audio*/
+			if (btusb_find_altsetting(data, 6))
+				new_alts = 6;
 			else
-				btusb_submit_isoc_urb(hdev, GFP_KERNEL);
+				BT_ERR("%s Device does not support ALT setting 6", hdev->name);
 		}
+
+		if (bt_switch_alt_setting(hdev, new_alts) < 0)
+			BT_ERR("%s Set USB Alt: %d failed!", hdev->name, new_alts);
 	} else {
 		clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
 		usb_kill_anchored_urbs(&data->isoc_anchor);
-- 
2.17.1


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

* Re: [PATCH v6 2/2] bluetooth:btusb: handle msbc audio over USB Endpoints
  2019-12-05  8:32 [PATCH v6 2/2] bluetooth:btusb: handle msbc audio over USB Endpoints Sathish Narsimman
@ 2019-12-10  4:57 ` Sathish Narasimman
  2019-12-16  4:50   ` Sathish Narasimman
  2020-01-04  9:58 ` Marcel Holtmann
  1 sibling, 1 reply; 6+ messages in thread
From: Sathish Narasimman @ 2019-12-10  4:57 UTC (permalink / raw)
  To: Bluez mailing list
  Cc: Sathish Narasimman, Chethan T N, Hsin-Yu Chao, Amit K Bag,
	Marcel Holtmann, Luiz Augusto von Dentz

Hi,

Any more comments regarding this patch?

On Thu, Dec 5, 2019 at 2:02 PM Sathish Narsimman <nsathish41@gmail.com> wrote:
>
> From: Sathish Narasimman <sathish.narasimman@intel.com>
>
> For msbc encoded audio stream over usb transport, btusb driver
> to be set to alternate settings 6 as per BT core spec 5.0. The
> type of air mode is used to differenting which alt setting to be
> used.
> 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
>
> Reported-by: kbuild test robot <lkp@intel.com>
> Signed-off-by: Sathish Narasimman <sathish.narasimman@intel.com>
> Signed-off-by: Chethan T N <chethan.tumkur.narayan@intel.com>
> Signed-off-by: Hsin-Yu Chao <hychao@chromium.org>
> Signed-off-by: Amit K Bag <amit.k.bag@intel.com>
> ---
>  drivers/bluetooth/btusb.c | 157 +++++++++++++++++++++++++++++---------
>  1 file changed, 121 insertions(+), 36 deletions(-)
>
> diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
> index d9cd0677d41c..5563569f4473 100644
> --- a/drivers/bluetooth/btusb.c
> +++ b/drivers/bluetooth/btusb.c
> @@ -483,6 +483,8 @@ struct btusb_data {
>         __u8 cmdreq;
>
>         unsigned int sco_num;
> +       unsigned int air_mode;
> +       bool usb_alt6_packet_flow;
>         int isoc_altsetting;
>         int suspend_count;
>
> @@ -974,6 +976,42 @@ static void btusb_isoc_complete(struct urb *urb)
>         }
>  }
>
> +static inline void __fill_isoc_descriptor_msbc(struct urb *urb, int len,
> +                                              int mtu, struct btusb_data *data)
> +{
> +       int i, offset = 0;
> +       unsigned int interval;
> +
> +       /* 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 (data->usb_alt6_packet_flow) {
> +               interval = 7;
> +               data->usb_alt6_packet_flow = false;
> +       } else {
> +               interval = 6;
> +               data->usb_alt6_packet_flow = true;
> +       }
> +
> +       BT_DBG("interval:%d len %d mtu %d", interval, len, mtu);
> +
> +       for (i = 0; i < interval; 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;
> @@ -1377,9 +1415,13 @@ 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),
> +                              data);
> +       else
> +               __fill_isoc_descriptor(urb, skb->len,
>                                le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize));
> -
>         skb->dev = (void *)hdev;
>
>         return urb;
> @@ -1475,6 +1517,7 @@ static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
>
>         if (hci_conn_num(hdev, SCO_LINK) != data->sco_num) {
>                 data->sco_num = hci_conn_num(hdev, SCO_LINK);
> +               data->air_mode = evt;
>                 schedule_work(&data->work);
>         }
>  }
> @@ -1522,11 +1565,70 @@ 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 struct usb_host_interface *btusb_find_altsetting(struct btusb_data *data, int alt)
> +{
> +       struct usb_interface *intf = data->isoc;
> +       int i;
> +
> +       BT_DBG("Looking for Alt no :%d", alt);
> +
> +       if (intf == NULL) {
> +               BT_ERR("INterface NULL");
> +               return NULL;
> +       }
> +
> +       for (i = 0; i < intf->num_altsetting; i++) {
> +               if (intf->altsetting[i].desc.bAlternateSetting == alt)
> +                       return &intf->altsetting[i];
> +       }
> +
> +       return NULL;
> +}
> +
>  static void btusb_work(struct work_struct *work)
>  {
>         struct btusb_data *data = container_of(work, struct btusb_data, work);
>         struct hci_dev *hdev = data->hdev;
> -       int new_alts;
> +       int new_alts = 0;
>         int err;
>
>         if (data->sco_num > 0) {
> @@ -1541,44 +1643,27 @@ static void btusb_work(struct work_struct *work)
>                         set_bit(BTUSB_DID_ISO_RESUME, &data->flags);
>                 }
>
> -               if (hdev->voice_setting & 0x0020) {
> -                       static const int alts[3] = { 2, 4, 5 };
> -
> -                       new_alts = alts[data->sco_num - 1];
> -               } else {
> -                       new_alts = data->sco_num;
> -               }
> -
> -               if (data->isoc_altsetting != new_alts) {
> -                       unsigned long flags;
> +               if (data->air_mode == HCI_NOTIFY_ENABLE_SCO_CVSD) {
> +                       if (hdev->voice_setting & 0x0020) {
> +                               static const int alts[3] = { 2, 4, 5 };
>
> -                       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);
> +                               new_alts = alts[data->sco_num - 1];
> +                       } else {
> +                               new_alts = data->sco_num;
> +                       }
> +               } else if (data->air_mode == HCI_NOTIFY_ENABLE_SCO_TRANSP) {
>
> -                       if (__set_isoc_interface(hdev, new_alts) < 0)
> -                               return;
> -               }
> +                       data->usb_alt6_packet_flow = true;
>
> -               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);
> +                       /* Check if Alt 6 is supported for Transparent audio*/
> +                       if (btusb_find_altsetting(data, 6))
> +                               new_alts = 6;
>                         else
> -                               btusb_submit_isoc_urb(hdev, GFP_KERNEL);
> +                               BT_ERR("%s Device does not support ALT setting 6", hdev->name);
>                 }
> +
> +               if (bt_switch_alt_setting(hdev, new_alts) < 0)
> +                       BT_ERR("%s Set USB Alt: %d failed!", hdev->name, new_alts);
>         } else {
>                 clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
>                 usb_kill_anchored_urbs(&data->isoc_anchor);
> --
> 2.17.1
>

Regards
Sathish N

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

* Re: [PATCH v6 2/2] bluetooth:btusb: handle msbc audio over USB Endpoints
  2019-12-10  4:57 ` Sathish Narasimman
@ 2019-12-16  4:50   ` Sathish Narasimman
  0 siblings, 0 replies; 6+ messages in thread
From: Sathish Narasimman @ 2019-12-16  4:50 UTC (permalink / raw)
  To: Bluez mailing list
  Cc: Sathish Narasimman, Chethan T N, Hsin-Yu Chao, Amit K Bag,
	Marcel Holtmann, Luiz Augusto von Dentz

HI,

A gentle reminder

On Tue, Dec 10, 2019 at 10:27 AM Sathish Narasimman
<nsathish41@gmail.com> wrote:
>
> Hi,
>
> Any more comments regarding this patch?
>
> On Thu, Dec 5, 2019 at 2:02 PM Sathish Narsimman <nsathish41@gmail.com> wrote:
> >
> > From: Sathish Narasimman <sathish.narasimman@intel.com>
> >
> > For msbc encoded audio stream over usb transport, btusb driver
> > to be set to alternate settings 6 as per BT core spec 5.0. The
> > type of air mode is used to differenting which alt setting to be
> > used.
> > 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
> >
> > Reported-by: kbuild test robot <lkp@intel.com>
> > Signed-off-by: Sathish Narasimman <sathish.narasimman@intel.com>
> > Signed-off-by: Chethan T N <chethan.tumkur.narayan@intel.com>
> > Signed-off-by: Hsin-Yu Chao <hychao@chromium.org>
> > Signed-off-by: Amit K Bag <amit.k.bag@intel.com>
> > ---
> >  drivers/bluetooth/btusb.c | 157 +++++++++++++++++++++++++++++---------
> >  1 file changed, 121 insertions(+), 36 deletions(-)
> >
> > diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
> > index d9cd0677d41c..5563569f4473 100644
> > --- a/drivers/bluetooth/btusb.c
> > +++ b/drivers/bluetooth/btusb.c
> > @@ -483,6 +483,8 @@ struct btusb_data {
> >         __u8 cmdreq;
> >
> >         unsigned int sco_num;
> > +       unsigned int air_mode;
> > +       bool usb_alt6_packet_flow;
> >         int isoc_altsetting;
> >         int suspend_count;
> >
> > @@ -974,6 +976,42 @@ static void btusb_isoc_complete(struct urb *urb)
> >         }
> >  }
> >
> > +static inline void __fill_isoc_descriptor_msbc(struct urb *urb, int len,
> > +                                              int mtu, struct btusb_data *data)
> > +{
> > +       int i, offset = 0;
> > +       unsigned int interval;
> > +
> > +       /* 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 (data->usb_alt6_packet_flow) {
> > +               interval = 7;
> > +               data->usb_alt6_packet_flow = false;
> > +       } else {
> > +               interval = 6;
> > +               data->usb_alt6_packet_flow = true;
> > +       }
> > +
> > +       BT_DBG("interval:%d len %d mtu %d", interval, len, mtu);
> > +
> > +       for (i = 0; i < interval; 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;
> > @@ -1377,9 +1415,13 @@ 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),
> > +                              data);
> > +       else
> > +               __fill_isoc_descriptor(urb, skb->len,
> >                                le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize));
> > -
> >         skb->dev = (void *)hdev;
> >
> >         return urb;
> > @@ -1475,6 +1517,7 @@ static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
> >
> >         if (hci_conn_num(hdev, SCO_LINK) != data->sco_num) {
> >                 data->sco_num = hci_conn_num(hdev, SCO_LINK);
> > +               data->air_mode = evt;
> >                 schedule_work(&data->work);
> >         }
> >  }
> > @@ -1522,11 +1565,70 @@ 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 struct usb_host_interface *btusb_find_altsetting(struct btusb_data *data, int alt)
> > +{
> > +       struct usb_interface *intf = data->isoc;
> > +       int i;
> > +
> > +       BT_DBG("Looking for Alt no :%d", alt);
> > +
> > +       if (intf == NULL) {
> > +               BT_ERR("INterface NULL");
> > +               return NULL;
> > +       }
> > +
> > +       for (i = 0; i < intf->num_altsetting; i++) {
> > +               if (intf->altsetting[i].desc.bAlternateSetting == alt)
> > +                       return &intf->altsetting[i];
> > +       }
> > +
> > +       return NULL;
> > +}
> > +
> >  static void btusb_work(struct work_struct *work)
> >  {
> >         struct btusb_data *data = container_of(work, struct btusb_data, work);
> >         struct hci_dev *hdev = data->hdev;
> > -       int new_alts;
> > +       int new_alts = 0;
> >         int err;
> >
> >         if (data->sco_num > 0) {
> > @@ -1541,44 +1643,27 @@ static void btusb_work(struct work_struct *work)
> >                         set_bit(BTUSB_DID_ISO_RESUME, &data->flags);
> >                 }
> >
> > -               if (hdev->voice_setting & 0x0020) {
> > -                       static const int alts[3] = { 2, 4, 5 };
> > -
> > -                       new_alts = alts[data->sco_num - 1];
> > -               } else {
> > -                       new_alts = data->sco_num;
> > -               }
> > -
> > -               if (data->isoc_altsetting != new_alts) {
> > -                       unsigned long flags;
> > +               if (data->air_mode == HCI_NOTIFY_ENABLE_SCO_CVSD) {
> > +                       if (hdev->voice_setting & 0x0020) {
> > +                               static const int alts[3] = { 2, 4, 5 };
> >
> > -                       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);
> > +                               new_alts = alts[data->sco_num - 1];
> > +                       } else {
> > +                               new_alts = data->sco_num;
> > +                       }
> > +               } else if (data->air_mode == HCI_NOTIFY_ENABLE_SCO_TRANSP) {
> >
> > -                       if (__set_isoc_interface(hdev, new_alts) < 0)
> > -                               return;
> > -               }
> > +                       data->usb_alt6_packet_flow = true;
> >
> > -               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);
> > +                       /* Check if Alt 6 is supported for Transparent audio*/
> > +                       if (btusb_find_altsetting(data, 6))
> > +                               new_alts = 6;
> >                         else
> > -                               btusb_submit_isoc_urb(hdev, GFP_KERNEL);
> > +                               BT_ERR("%s Device does not support ALT setting 6", hdev->name);
> >                 }
> > +
> > +               if (bt_switch_alt_setting(hdev, new_alts) < 0)
> > +                       BT_ERR("%s Set USB Alt: %d failed!", hdev->name, new_alts);
> >         } else {
> >                 clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
> >                 usb_kill_anchored_urbs(&data->isoc_anchor);
> > --
> > 2.17.1
> >
>
> Regards
> Sathish N

Sathish N

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

* Re: [PATCH v6 2/2] bluetooth:btusb: handle msbc audio over USB Endpoints
  2019-12-05  8:32 [PATCH v6 2/2] bluetooth:btusb: handle msbc audio over USB Endpoints Sathish Narsimman
  2019-12-10  4:57 ` Sathish Narasimman
@ 2020-01-04  9:58 ` Marcel Holtmann
  2020-01-06  8:39   ` chethan tn
  1 sibling, 1 reply; 6+ messages in thread
From: Marcel Holtmann @ 2020-01-04  9:58 UTC (permalink / raw)
  To: Sathish Narsimman
  Cc: BlueZ devel list, Sathish Narasimman, Chethan T N, Hsin-Yu Chao,
	Amit K Bag

Hi Sathish,

> For msbc encoded audio stream over usb transport, btusb driver
> to be set to alternate settings 6 as per BT core spec 5.0. The
> type of air mode is used to differenting which alt setting to be
> used.
> 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
> 
> Reported-by: kbuild test robot <lkp@intel.com>
> Signed-off-by: Sathish Narasimman <sathish.narasimman@intel.com>
> Signed-off-by: Chethan T N <chethan.tumkur.narayan@intel.com>
> Signed-off-by: Hsin-Yu Chao <hychao@chromium.org>
> Signed-off-by: Amit K Bag <amit.k.bag@intel.com>
> ---
> drivers/bluetooth/btusb.c | 157 +++++++++++++++++++++++++++++---------
> 1 file changed, 121 insertions(+), 36 deletions(-)

I would really prefer to have some Tested-by lines from people that can verify that this patch works.

Luiz, do we. Need to address further details for mSBC support?

Regards

Marcel


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

* Re: [PATCH v6 2/2] bluetooth:btusb: handle msbc audio over USB Endpoints
  2020-01-04  9:58 ` Marcel Holtmann
@ 2020-01-06  8:39   ` chethan tn
  2020-02-06  6:08     ` Sathish Narasimman
  0 siblings, 1 reply; 6+ messages in thread
From: chethan tn @ 2020-01-06  8:39 UTC (permalink / raw)
  To: Marcel Holtmann
  Cc: Sathish Narsimman, BlueZ devel list, Sathish Narasimman,
	Chethan T N, Hsin-Yu Chao, Amit K Bag

Hi Marcel,
>
> Hi Sathish,
>
> > For msbc encoded audio stream over usb transport, btusb driver
> > to be set to alternate settings 6 as per BT core spec 5.0. The
> > type of air mode is used to differenting which alt setting to be
> > used.
> > 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
> >
> > Reported-by: kbuild test robot <lkp@intel.com>
> > Signed-off-by: Sathish Narasimman <sathish.narasimman@intel.com>
> > Signed-off-by: Chethan T N <chethan.tumkur.narayan@intel.com>
> > Signed-off-by: Hsin-Yu Chao <hychao@chromium.org>
> > Signed-off-by: Amit K Bag <amit.k.bag@intel.com>
> > ---
> > drivers/bluetooth/btusb.c | 157 +++++++++++++++++++++++++++++---------
> > 1 file changed, 121 insertions(+), 36 deletions(-)
>
> I would really prefer to have some Tested-by lines from people that can verify that this patch works.
The patch is verified on Chrome OS( 4.14 and 4.19 Chrome kernel) and
Ubuntu with intel controllers. However it is always good to test with
some other controller as well.
>
> Luiz, do we. Need to address further details for mSBC support?
>
> Regards
>
> Marcel
>
Thanks and Regards
Chethan

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

* Re: [PATCH v6 2/2] bluetooth:btusb: handle msbc audio over USB Endpoints
  2020-01-06  8:39   ` chethan tn
@ 2020-02-06  6:08     ` Sathish Narasimman
  0 siblings, 0 replies; 6+ messages in thread
From: Sathish Narasimman @ 2020-02-06  6:08 UTC (permalink / raw)
  To: chethan tn
  Cc: Marcel Holtmann, BlueZ devel list, Sathish Narasimman,
	Chethan T N, Hsin-Yu Chao, Amit K Bag

gentle reminder.

On Mon, Jan 6, 2020 at 2:09 PM chethan tn <chethantn@gmail.com> wrote:
>
> Hi Marcel,
> >
> > Hi Sathish,
> >
> > > For msbc encoded audio stream over usb transport, btusb driver
> > > to be set to alternate settings 6 as per BT core spec 5.0. The
> > > type of air mode is used to differenting which alt setting to be
> > > used.
> > > 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
> > >
> > > Reported-by: kbuild test robot <lkp@intel.com>
> > > Signed-off-by: Sathish Narasimman <sathish.narasimman@intel.com>
> > > Signed-off-by: Chethan T N <chethan.tumkur.narayan@intel.com>
> > > Signed-off-by: Hsin-Yu Chao <hychao@chromium.org>
> > > Signed-off-by: Amit K Bag <amit.k.bag@intel.com>
> > > ---
> > > drivers/bluetooth/btusb.c | 157 +++++++++++++++++++++++++++++---------
> > > 1 file changed, 121 insertions(+), 36 deletions(-)
> >
> > I would really prefer to have some Tested-by lines from people that can verify that this patch works.
> The patch is verified on Chrome OS( 4.14 and 4.19 Chrome kernel) and
> Ubuntu with intel controllers. However it is always good to test with
> some other controller as well.
> >
> > Luiz, do we. Need to address further details for mSBC support?
> >
> > Regards
> >
> > Marcel
> >
> Thanks and Regards
> Chethan

Regards
Sathish N

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

end of thread, back to index

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-05  8:32 [PATCH v6 2/2] bluetooth:btusb: handle msbc audio over USB Endpoints Sathish Narsimman
2019-12-10  4:57 ` Sathish Narasimman
2019-12-16  4:50   ` Sathish Narasimman
2020-01-04  9:58 ` Marcel Holtmann
2020-01-06  8:39   ` chethan tn
2020-02-06  6:08     ` Sathish Narasimman

Linux-Bluetooth Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-bluetooth/0 linux-bluetooth/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-bluetooth linux-bluetooth/ https://lore.kernel.org/linux-bluetooth \
		linux-bluetooth@vger.kernel.org
	public-inbox-index linux-bluetooth

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-bluetooth


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git