diff options
author | Johan Hedberg <johan.hedberg@intel.com> | 2012-02-20 16:50:38 -0500 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2012-02-20 17:32:16 -0500 |
commit | 6d80dfd094a7b286e95cdcac79efeb7bbb4e226f (patch) | |
tree | d2ce3d84653d5205bfcceb1ac73297a0381117f8 /net/bluetooth/mgmt.c | |
parent | f963e8e9d3652f4a8065d969206707a1c21ff9b0 (diff) |
Bluetooth: mgmt: Add basic support for Set High Speed command
This patch adds rudimentary support for the Set High Speed command in
the form of a new HCI dev flag (HCI_HS_ENABLED).
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/bluetooth/mgmt.c')
-rw-r--r-- | net/bluetooth/mgmt.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index 86148b182891..edf84c3e6a2b 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c | |||
@@ -418,6 +418,9 @@ static u32 get_current_settings(struct hci_dev *hdev) | |||
418 | if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) | 418 | if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) |
419 | settings |= MGMT_SETTING_SSP; | 419 | settings |= MGMT_SETTING_SSP; |
420 | 420 | ||
421 | if (test_bit(HCI_HS_ENABLED, &hdev->dev_flags)) | ||
422 | settings |= MGMT_SETTING_HS; | ||
423 | |||
421 | return settings; | 424 | return settings; |
422 | } | 425 | } |
423 | 426 | ||
@@ -1093,6 +1096,41 @@ failed: | |||
1093 | return err; | 1096 | return err; |
1094 | } | 1097 | } |
1095 | 1098 | ||
1099 | static int set_hs(struct sock *sk, u16 index, void *data, u16 len) | ||
1100 | { | ||
1101 | struct mgmt_mode *cp = data; | ||
1102 | struct hci_dev *hdev; | ||
1103 | int err; | ||
1104 | |||
1105 | BT_DBG("request for hci%u", index); | ||
1106 | |||
1107 | if (len != sizeof(*cp)) | ||
1108 | return cmd_status(sk, index, MGMT_OP_SET_HS, | ||
1109 | MGMT_STATUS_INVALID_PARAMS); | ||
1110 | |||
1111 | hdev = hci_dev_get(index); | ||
1112 | if (!hdev) | ||
1113 | return cmd_status(sk, index, MGMT_OP_SET_HS, | ||
1114 | MGMT_STATUS_INVALID_PARAMS); | ||
1115 | |||
1116 | if (!enable_hs) { | ||
1117 | err = cmd_status(sk, index, MGMT_OP_SET_HS, | ||
1118 | MGMT_STATUS_NOT_SUPPORTED); | ||
1119 | goto failed; | ||
1120 | } | ||
1121 | |||
1122 | if (cp->val) | ||
1123 | set_bit(HCI_HS_ENABLED, &hdev->dev_flags); | ||
1124 | else | ||
1125 | clear_bit(HCI_HS_ENABLED, &hdev->dev_flags); | ||
1126 | |||
1127 | err = send_settings_rsp(sk, MGMT_OP_SET_HS, hdev); | ||
1128 | |||
1129 | failed: | ||
1130 | hci_dev_put(hdev); | ||
1131 | return err; | ||
1132 | } | ||
1133 | |||
1096 | static int add_uuid(struct sock *sk, u16 index, void *data, u16 len) | 1134 | static int add_uuid(struct sock *sk, u16 index, void *data, u16 len) |
1097 | { | 1135 | { |
1098 | struct mgmt_cp_add_uuid *cp = data; | 1136 | struct mgmt_cp_add_uuid *cp = data; |
@@ -2655,6 +2693,9 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen) | |||
2655 | case MGMT_OP_SET_SSP: | 2693 | case MGMT_OP_SET_SSP: |
2656 | err = set_ssp(sk, index, cp, len); | 2694 | err = set_ssp(sk, index, cp, len); |
2657 | break; | 2695 | break; |
2696 | case MGMT_OP_SET_HS: | ||
2697 | err = set_hs(sk, index, cp, len); | ||
2698 | break; | ||
2658 | case MGMT_OP_ADD_UUID: | 2699 | case MGMT_OP_ADD_UUID: |
2659 | err = add_uuid(sk, index, cp, len); | 2700 | err = add_uuid(sk, index, cp, len); |
2660 | break; | 2701 | break; |