Bluetooth: Set le data length command and event
[platform/kernel/linux-starfive.git] / net / bluetooth / hci_event.c
index 591d5f7..cc4c4bb 100644 (file)
@@ -1985,12 +1985,22 @@ static u8 hci_cc_le_read_def_data_len(struct hci_dev *hdev, void *data,
 
        bt_dev_dbg(hdev, "status 0x%2.2x", rp->status);
 
+#ifdef TIZEN_BT
+       hci_dev_lock(hdev);
+#else
        if (rp->status)
                return rp->status;
+#endif
 
        hdev->le_def_tx_len = le16_to_cpu(rp->tx_len);
        hdev->le_def_tx_time = le16_to_cpu(rp->tx_time);
 
+#ifdef TIZEN_BT
+       mgmt_le_read_host_suggested_data_length_complete(hdev, rp->status);
+
+       hci_dev_unlock(hdev);
+#endif
+
        return rp->status;
 }
 
@@ -2003,16 +2013,29 @@ static u8 hci_cc_le_write_def_data_len(struct hci_dev *hdev, void *data,
        bt_dev_dbg(hdev, "status 0x%2.2x", rp->status);
 
        if (rp->status)
+#ifndef TIZEN_BT
                return rp->status;
+#else
+               goto unblock;
+#endif
 
        sent = hci_sent_cmd_data(hdev, HCI_OP_LE_WRITE_DEF_DATA_LEN);
        if (!sent)
+#ifndef TIZEN_BT
                return rp->status;
+#else
+               goto unblock;
+#endif
 
        hdev->le_def_tx_len = le16_to_cpu(sent->tx_len);
        hdev->le_def_tx_time = le16_to_cpu(sent->tx_time);
 
        return rp->status;
+#ifdef TIZEN_BT
+unblock:
+       mgmt_le_write_host_suggested_data_length_complete(hdev, rp->status);
+       return rp->status;
+#endif
 }
 
 static u8 hci_cc_le_add_to_resolv_list(struct hci_dev *hdev, void *data,
@@ -2128,14 +2151,23 @@ static u8 hci_cc_le_read_max_data_len(struct hci_dev *hdev, void *data,
 
        bt_dev_dbg(hdev, "status 0x%2.2x", rp->status);
 
+#ifndef TIZEN_BT
        if (rp->status)
                return rp->status;
+#else
+       hci_dev_lock(hdev);
+#endif
 
        hdev->le_max_tx_len = le16_to_cpu(rp->tx_len);
        hdev->le_max_tx_time = le16_to_cpu(rp->tx_time);
        hdev->le_max_rx_len = le16_to_cpu(rp->rx_len);
        hdev->le_max_rx_time = le16_to_cpu(rp->rx_time);
 
+#ifdef TIZEN_BT
+       mgmt_le_read_maximum_data_length_complete(hdev, rp->status);
+       hci_dev_unlock(hdev);
+#endif
+
        return rp->status;
 }
 
@@ -2327,6 +2359,32 @@ static void hci_vendor_specific_evt(struct hci_dev *hdev, void *data,
                break;
        }
 }
+
+static void hci_le_data_length_changed_complete_evt(struct hci_dev *hdev,
+                                                   void *data,
+                                                   struct sk_buff *skb)
+{
+       struct hci_ev_le_data_len_change *ev = (void *)skb->data;
+       struct hci_conn *conn;
+
+       BT_DBG("%s status", hdev->name);
+
+       hci_dev_lock(hdev);
+
+       conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
+       if (conn) {
+               conn->tx_len = le16_to_cpu(ev->tx_len);
+               conn->tx_time = le16_to_cpu(ev->tx_time);
+               conn->rx_len = le16_to_cpu(ev->rx_len);
+               conn->rx_time = le16_to_cpu(ev->rx_time);
+       }
+
+       mgmt_le_data_length_change_complete(hdev, &conn->dst,
+                                           conn->tx_len, conn->tx_time,
+                                           conn->rx_len, conn->rx_time);
+
+       hci_dev_unlock(hdev);
+}
 #endif
 
 static u8 hci_cc_read_rssi(struct hci_dev *hdev, void *data,
@@ -7289,6 +7347,12 @@ static const struct hci_le_ev {
        HCI_LE_EV(HCI_EV_LE_REMOTE_CONN_PARAM_REQ,
                  hci_le_remote_conn_param_req_evt,
                  sizeof(struct hci_ev_le_remote_conn_param_req)),
+#ifdef TIZEN_BT
+       /* [0x07 = HCI_EV_LE_DATA_LEN_CHANGE] */
+       HCI_LE_EV(HCI_EV_LE_DATA_LEN_CHANGE,
+                 hci_le_data_length_changed_complete_evt,
+                 sizeof(struct hci_ev_le_data_len_change)),
+#endif
        /* [0x0a = HCI_EV_LE_ENHANCED_CONN_COMPLETE] */
        HCI_LE_EV(HCI_EV_LE_ENHANCED_CONN_COMPLETE,
                  hci_le_enh_conn_complete_evt,