u8 instance);
 void mgmt_advertising_removed(struct sock *sk, struct hci_dev *hdev,
                              u8 instance);
+int mgmt_phy_configuration_changed(struct hci_dev *hdev, struct sock *skip);
 
 u8 hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max, u16 latency,
                      u16 to_multiplier);
 
                                 &rp, sizeof(rp));
 }
 
+int mgmt_phy_configuration_changed(struct hci_dev *hdev, struct sock *skip)
+{
+       struct mgmt_ev_phy_configuration_changed ev;
+
+       memset(&ev, 0, sizeof(ev));
+
+       ev.selected_phys = cpu_to_le32(get_selected_phys(hdev));
+
+       return mgmt_event(MGMT_EV_PHY_CONFIGURATION_CHANGED, hdev, &ev,
+                         sizeof(ev), skip);
+}
+
 static void set_default_phy_complete(struct hci_dev *hdev, u8 status,
                                     u16 opcode, struct sk_buff *skb)
 {
                mgmt_cmd_complete(cmd->sk, hdev->id,
                                  MGMT_OP_SET_PHY_CONFIGURATION, 0,
                                  NULL, 0);
+
+               mgmt_phy_configuration_changed(hdev, cmd->sk);
        }
 
        mgmt_pending_remove(cmd);
        struct hci_request req;
        u32 selected_phys, configurable_phys, supported_phys, unconfigure_phys;
        u16 pkt_type = (HCI_DH1 | HCI_DM1);
+       bool changed = false;
        int err;
 
        BT_DBG("sock %p %s", sk, hdev->name);
        else
                pkt_type |= HCI_3DH5;
 
-       if (pkt_type != hdev->pkt_type)
+       if (pkt_type != hdev->pkt_type) {
                hdev->pkt_type = pkt_type;
+               changed = true;
+       }
 
        if ((selected_phys & MGMT_PHY_LE_MASK) ==
            (get_selected_phys(hdev) & MGMT_PHY_LE_MASK)) {
+               if (changed)
+                       mgmt_phy_configuration_changed(hdev, sk);
+
                err = mgmt_cmd_complete(sk, hdev->id,
                                        MGMT_OP_SET_PHY_CONFIGURATION,
                                        0, NULL, 0);