Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-block.git] / net / bluetooth / hci_conn.c
index c9b8fa544785df83d1afa02629b6be00a7325934..ee5e59839b0294a6db0ea95f9f3eda4db0e4c503 100644 (file)
@@ -309,7 +309,7 @@ void hci_sco_setup(struct hci_conn *conn, __u8 status)
                else
                        hci_add_sco(sco, conn->handle);
        } else {
-               hci_proto_connect_cfm(sco, status);
+               hci_connect_cfm(sco, status);
                hci_conn_del(sco);
        }
 }
@@ -571,7 +571,7 @@ struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src)
 
        list_for_each_entry(d, &hci_dev_list, list) {
                if (!test_bit(HCI_UP, &d->flags) ||
-                   test_bit(HCI_USER_CHANNEL, &d->dev_flags) ||
+                   hci_dev_test_flag(d, HCI_USER_CHANNEL) ||
                    d->dev_type != HCI_BREDR)
                        continue;
 
@@ -618,7 +618,7 @@ void hci_le_conn_failed(struct hci_conn *conn, u8 status)
        mgmt_connect_failed(hdev, &conn->dst, conn->type, conn->dst_type,
                            status);
 
-       hci_proto_connect_cfm(conn, status);
+       hci_connect_cfm(conn, status);
 
        hci_conn_del(conn);
 
@@ -700,7 +700,7 @@ static void hci_req_directed_advertising(struct hci_request *req,
         * and write a new random address. The flag will be set back on
         * as soon as the SET_ADV_ENABLE HCI command completes.
         */
-       clear_bit(HCI_LE_ADV, &hdev->dev_flags);
+       hci_dev_clear_flag(hdev, HCI_LE_ADV);
 
        /* Set require_privacy to false so that the remote device has a
         * chance of identifying us.
@@ -733,6 +733,14 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
        struct hci_request req;
        int err;
 
+       /* Let's make sure that le is enabled.*/
+       if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) {
+               if (lmp_le_capable(hdev))
+                       return ERR_PTR(-ECONNREFUSED);
+
+               return ERR_PTR(-EOPNOTSUPP);
+       }
+
        /* Some devices send ATT messages as soon as the physical link is
         * established. To be able to handle these ATT messages, the user-
         * space first establishes the connection and then starts the pairing
@@ -791,7 +799,7 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
         * anyway have to disable it in order to start directed
         * advertising.
         */
-       if (test_bit(HCI_LE_ADV, &hdev->dev_flags)) {
+       if (hci_dev_test_flag(hdev, HCI_LE_ADV)) {
                u8 enable = 0x00;
                hci_req_add(&req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable),
                            &enable);
@@ -802,7 +810,7 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
                /* If we're active scanning most controllers are unable
                 * to initiate advertising. Simply reject the attempt.
                 */
-               if (test_bit(HCI_LE_SCAN, &hdev->dev_flags) &&
+               if (hci_dev_test_flag(hdev, HCI_LE_SCAN) &&
                    hdev->le_scan_type == LE_SCAN_ACTIVE) {
                        skb_queue_purge(&req.cmd_q);
                        hci_conn_del(conn);
@@ -832,9 +840,9 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
         * handler for scan disabling knows to set the correct discovery
         * state.
         */
-       if (test_bit(HCI_LE_SCAN, &hdev->dev_flags)) {
+       if (hci_dev_test_flag(hdev, HCI_LE_SCAN)) {
                hci_req_add_le_scan_disable(&req);
-               set_bit(HCI_LE_SCAN_INTERRUPTED, &hdev->dev_flags);
+               hci_dev_set_flag(hdev, HCI_LE_SCAN_INTERRUPTED);
        }
 
        hci_req_add_le_create_conn(&req, conn);
@@ -856,8 +864,12 @@ struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst,
 {
        struct hci_conn *acl;
 
-       if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
+       if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
+               if (lmp_bredr_capable(hdev))
+                       return ERR_PTR(-ECONNREFUSED);
+
                return ERR_PTR(-EOPNOTSUPP);
+       }
 
        acl = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst);
        if (!acl) {
@@ -930,7 +942,7 @@ int hci_conn_check_link_mode(struct hci_conn *conn)
         * Connections is used and the link is encrypted with AES-CCM
         * using a P-256 authenticated combination key.
         */
-       if (test_bit(HCI_SC_ONLY, &conn->hdev->flags)) {
+       if (hci_dev_test_flag(conn->hdev, HCI_SC_ONLY)) {
                if (!hci_conn_sc_enabled(conn) ||
                    !test_bit(HCI_CONN_AES_CCM, &conn->flags) ||
                    conn->key_type != HCI_LK_AUTH_COMBINATION_P256)
@@ -1139,7 +1151,7 @@ void hci_conn_hash_flush(struct hci_dev *hdev)
        list_for_each_entry_safe(c, n, &h->list, list) {
                c->state = BT_CLOSED;
 
-               hci_proto_disconn_cfm(c, HCI_ERROR_LOCAL_HOST_TERM);
+               hci_disconn_cfm(c, HCI_ERROR_LOCAL_HOST_TERM);
                hci_conn_del(c);
        }
 }