__u8 cmdreq;
 
        unsigned int sco_num;
+       unsigned int air_mode;
+       bool usb_alt6_packet_flow;
        int isoc_altsetting;
        int suspend_count;
 
        }
 }
 
+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;
+
+       BT_DBG("len %d mtu %d", len, mtu);
+
+       /* 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;
+       }
+
+       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;
 
        urb->transfer_flags  = URB_ISO_ASAP;
 
-       __fill_isoc_descriptor(urb, skb->len,
-                              le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize));
-
+       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;
 
        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);
        }
 }
        return 0;
 }
 
+static int btusb_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);
+
+       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) {
                        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_dev_err(hdev, "Device does not support ALT setting 6");
                }
+
+               if (btusb_switch_alt_setting(hdev, new_alts) < 0)
+                       bt_dev_err(hdev, "set USB alt:(%d) failed!", new_alts);
        } else {
                clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
                usb_kill_anchored_urbs(&data->isoc_anchor);