diff options
-rw-r--r-- | net/bluetooth/mgmt.c | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index b6a33c5e7685..f03b10cf92e3 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c | |||
@@ -1000,6 +1000,29 @@ failed: | |||
1000 | return err; | 1000 | return err; |
1001 | } | 1001 | } |
1002 | 1002 | ||
1003 | static void write_fast_connectable(struct hci_request *req, bool enable) | ||
1004 | { | ||
1005 | struct hci_cp_write_page_scan_activity acp; | ||
1006 | u8 type; | ||
1007 | |||
1008 | if (enable) { | ||
1009 | type = PAGE_SCAN_TYPE_INTERLACED; | ||
1010 | |||
1011 | /* 160 msec page scan interval */ | ||
1012 | acp.interval = __constant_cpu_to_le16(0x0100); | ||
1013 | } else { | ||
1014 | type = PAGE_SCAN_TYPE_STANDARD; /* default */ | ||
1015 | |||
1016 | /* default 1.28 sec page scan */ | ||
1017 | acp.interval = __constant_cpu_to_le16(0x0800); | ||
1018 | } | ||
1019 | |||
1020 | acp.window = __constant_cpu_to_le16(0x0012); | ||
1021 | |||
1022 | hci_req_add(req, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY, sizeof(acp), &acp); | ||
1023 | hci_req_add(req, HCI_OP_WRITE_PAGE_SCAN_TYPE, 1, &type); | ||
1024 | } | ||
1025 | |||
1003 | static void set_connectable_complete(struct hci_dev *hdev, u8 status) | 1026 | static void set_connectable_complete(struct hci_dev *hdev, u8 status) |
1004 | { | 1027 | { |
1005 | struct pending_cmd *cmd; | 1028 | struct pending_cmd *cmd; |
@@ -2937,10 +2960,8 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev, | |||
2937 | void *data, u16 len) | 2960 | void *data, u16 len) |
2938 | { | 2961 | { |
2939 | struct mgmt_mode *cp = data; | 2962 | struct mgmt_mode *cp = data; |
2940 | struct hci_cp_write_page_scan_activity acp; | ||
2941 | struct pending_cmd *cmd; | 2963 | struct pending_cmd *cmd; |
2942 | struct hci_request req; | 2964 | struct hci_request req; |
2943 | u8 type; | ||
2944 | int err; | 2965 | int err; |
2945 | 2966 | ||
2946 | BT_DBG("%s", hdev->name); | 2967 | BT_DBG("%s", hdev->name); |
@@ -2975,21 +2996,6 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev, | |||
2975 | goto unlock; | 2996 | goto unlock; |
2976 | } | 2997 | } |
2977 | 2998 | ||
2978 | if (cp->val) { | ||
2979 | type = PAGE_SCAN_TYPE_INTERLACED; | ||
2980 | |||
2981 | /* 160 msec page scan interval */ | ||
2982 | acp.interval = __constant_cpu_to_le16(0x0100); | ||
2983 | } else { | ||
2984 | type = PAGE_SCAN_TYPE_STANDARD; /* default */ | ||
2985 | |||
2986 | /* default 1.28 sec page scan */ | ||
2987 | acp.interval = __constant_cpu_to_le16(0x0800); | ||
2988 | } | ||
2989 | |||
2990 | /* default 11.25 msec page scan window */ | ||
2991 | acp.window = __constant_cpu_to_le16(0x0012); | ||
2992 | |||
2993 | cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev, | 2999 | cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev, |
2994 | data, len); | 3000 | data, len); |
2995 | if (!cmd) { | 3001 | if (!cmd) { |
@@ -2999,8 +3005,7 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev, | |||
2999 | 3005 | ||
3000 | hci_req_init(&req, hdev); | 3006 | hci_req_init(&req, hdev); |
3001 | 3007 | ||
3002 | hci_req_add(&req, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY, sizeof(acp), &acp); | 3008 | write_fast_connectable(&req, cp->val); |
3003 | hci_req_add(&req, HCI_OP_WRITE_PAGE_SCAN_TYPE, 1, &type); | ||
3004 | 3009 | ||
3005 | err = hci_req_run(&req, fast_connectable_complete); | 3010 | err = hci_req_run(&req, fast_connectable_complete); |
3006 | if (err < 0) { | 3011 | if (err < 0) { |