diff options
Diffstat (limited to 'net/bluetooth/mgmt.c')
-rw-r--r-- | net/bluetooth/mgmt.c | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index a4f928ddc28a..bd61318b647c 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c | |||
@@ -2896,11 +2896,39 @@ static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data, | |||
2896 | return err; | 2896 | return err; |
2897 | } | 2897 | } |
2898 | 2898 | ||
2899 | static void fast_connectable_complete(struct hci_dev *hdev, u8 status) | ||
2900 | { | ||
2901 | struct pending_cmd *cmd; | ||
2902 | |||
2903 | BT_DBG("status 0x%02x", status); | ||
2904 | |||
2905 | hci_dev_lock(hdev); | ||
2906 | |||
2907 | cmd = mgmt_pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev); | ||
2908 | if (!cmd) | ||
2909 | goto unlock; | ||
2910 | |||
2911 | if (status) { | ||
2912 | cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, | ||
2913 | mgmt_status(status)); | ||
2914 | } else { | ||
2915 | send_settings_rsp(cmd->sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev); | ||
2916 | new_settings(hdev, cmd->sk); | ||
2917 | } | ||
2918 | |||
2919 | mgmt_pending_remove(cmd); | ||
2920 | |||
2921 | unlock: | ||
2922 | hci_dev_unlock(hdev); | ||
2923 | } | ||
2924 | |||
2899 | static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev, | 2925 | static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev, |
2900 | void *data, u16 len) | 2926 | void *data, u16 len) |
2901 | { | 2927 | { |
2902 | struct mgmt_mode *cp = data; | 2928 | struct mgmt_mode *cp = data; |
2903 | struct hci_cp_write_page_scan_activity acp; | 2929 | struct hci_cp_write_page_scan_activity acp; |
2930 | struct pending_cmd *cmd; | ||
2931 | struct hci_request req; | ||
2904 | u8 type; | 2932 | u8 type; |
2905 | int err; | 2933 | int err; |
2906 | 2934 | ||
@@ -2939,25 +2967,28 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev, | |||
2939 | /* default 11.25 msec page scan window */ | 2967 | /* default 11.25 msec page scan window */ |
2940 | acp.window = __constant_cpu_to_le16(0x0012); | 2968 | acp.window = __constant_cpu_to_le16(0x0012); |
2941 | 2969 | ||
2942 | err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY, sizeof(acp), | 2970 | cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev, |
2943 | &acp); | 2971 | data, len); |
2944 | if (err < 0) { | 2972 | if (!cmd) { |
2945 | err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, | 2973 | err = -ENOMEM; |
2946 | MGMT_STATUS_FAILED); | 2974 | goto unlock; |
2947 | goto done; | ||
2948 | } | 2975 | } |
2949 | 2976 | ||
2950 | err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE, 1, &type); | 2977 | hci_req_init(&req, hdev); |
2978 | |||
2979 | hci_req_add(&req, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY, sizeof(acp), &acp); | ||
2980 | hci_req_add(&req, HCI_OP_WRITE_PAGE_SCAN_TYPE, 1, &type); | ||
2981 | |||
2982 | err = hci_req_run(&req, fast_connectable_complete); | ||
2951 | if (err < 0) { | 2983 | if (err < 0) { |
2952 | err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, | 2984 | err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, |
2953 | MGMT_STATUS_FAILED); | 2985 | MGMT_STATUS_FAILED); |
2954 | goto done; | 2986 | mgmt_pending_remove(cmd); |
2955 | } | 2987 | } |
2956 | 2988 | ||
2957 | err = cmd_complete(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, 0, | 2989 | unlock: |
2958 | NULL, 0); | ||
2959 | done: | ||
2960 | hci_dev_unlock(hdev); | 2990 | hci_dev_unlock(hdev); |
2991 | |||
2961 | return err; | 2992 | return err; |
2962 | } | 2993 | } |
2963 | 2994 | ||