Bluetooth: Store max TX power level for connection
authorAndrzej Kaczmarek <andrzej.kaczmarek@tieto.com>
Wed, 14 May 2014 11:43:05 +0000 (13:43 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 16 May 2014 04:48:07 +0000 (21:48 -0700)
This patch adds support to store local maximum TX power level for
connection when reply for HCI_Read_Transmit_Power_Level is received.

Signed-off-by: Andrzej Kaczmarek <andrzej.kaczmarek@tieto.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
include/net/bluetooth/hci_core.h
net/bluetooth/hci_conn.c
net/bluetooth/hci_event.c

index cbbab6327621b579f19bc1a6782ec39a5c86b3a2..b386bf17e6c2c10808c8306ad7cbb4bb42e4713d 100644 (file)
@@ -382,6 +382,7 @@ struct hci_conn {
        __u16           le_conn_max_interval;
        __s8            rssi;
        __s8            tx_power;
+       __s8            max_tx_power;
        unsigned long   flags;
 
        unsigned long   conn_info_timestamp;
index 74b368bfe1029b1924bbae6867383c6563b0e19b..a987e7def025f69bf56b19817b954ec4e455284c 100644 (file)
@@ -408,6 +408,7 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
        conn->remote_auth = 0xff;
        conn->key_type = 0xff;
        conn->tx_power = HCI_TX_POWER_INVALID;
+       conn->max_tx_power = HCI_TX_POWER_INVALID;
 
        set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
        conn->disc_timeout = HCI_DISCONN_TIMEOUT;
index fa614e3430a73329b83edc61ebc8490f8f6d1324..492d8d5071c79e5783a0ad9defebc334a1377730 100644 (file)
@@ -1282,9 +1282,19 @@ static void hci_cc_read_tx_power(struct hci_dev *hdev, struct sk_buff *skb)
        hci_dev_lock(hdev);
 
        conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle));
-       if (conn && sent->type == 0x00)
+       if (!conn)
+               goto unlock;
+
+       switch (sent->type) {
+       case 0x00:
                conn->tx_power = rp->tx_power;
+               break;
+       case 0x01:
+               conn->max_tx_power = rp->tx_power;
+               break;
+       }
 
+unlock:
        hci_dev_unlock(hdev);
 }