diff -u b/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h --- b/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -154,6 +154,7 @@ __u16 interval; __u16 link_policy; __u32 link_mode; + __u8 power_save; unsigned long pend; unsigned int sent; diff -u b/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c --- b/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c @@ -158,6 +158,8 @@ conn->mode = HCI_CM_ACTIVE; conn->state = BT_OPEN; + conn->power_save = 1; + skb_queue_head_init(&conn->data_q); init_timer(&conn->disc_timer); @@ -387,7 +389,7 @@ if (test_bit(HCI_RAW, &hdev->flags)) return; - if (conn->mode != HCI_CM_SNIFF) + if (conn->mode != HCI_CM_SNIFF || !conn->power_save) goto timer; if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) { diff -u b/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c --- b/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -881,7 +881,12 @@ conn->mode = ev->mode; conn->interval = __le16_to_cpu(ev->interval); - clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend); + if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) { + if (conn->mode == HCI_CM_ACTIVE) + conn->power_save = 1; + else + conn->power_save = 0; + } } hci_dev_unlock(hdev);