Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 06f5b778 authored by Marcel Holtmann's avatar Marcel Holtmann Committed by Johan Hedberg
Browse files

Bluetooth: Add support for setting SSP debug mode



Enabling and disabling SSP debug mode is useful for development. This
adds a debugfs entry that allows to configure the SSP debug mode.

On purpose this has been implemented as debugfs entry and not a public
API since it is really only useful during testing and development.

Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
parent 3497ac84
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1043,6 +1043,8 @@ struct hci_rp_write_remote_amp_assoc {
	__u8     phy_handle;
} __packed;

#define HCI_OP_WRITE_SSP_DEBUG_MODE	0x1804

#define HCI_OP_LE_SET_EVENT_MASK	0x2001
struct hci_cp_le_set_event_mask {
	__u8     mask[8];
+1 −0
Original line number Diff line number Diff line
@@ -169,6 +169,7 @@ struct hci_dev {
	__u8		page_scan_type;
	__u16		le_scan_interval;
	__u16		le_scan_window;
	__u8		ssp_debug_mode;

	__u16		devid_source;
	__u16		devid_vendor;
+53 −1
Original line number Diff line number Diff line
@@ -303,6 +303,55 @@ static int auto_accept_delay_get(void *data, u64 *val)
DEFINE_SIMPLE_ATTRIBUTE(auto_accept_delay_fops, auto_accept_delay_get,
			auto_accept_delay_set, "%llu\n");

static int ssp_debug_mode_set(void *data, u64 val)
{
	struct hci_dev *hdev = data;
	struct sk_buff *skb;
	__u8 mode;
	int err;

	if (val != 0 && val != 1)
		return -EINVAL;

	if (!test_bit(HCI_UP, &hdev->flags))
		return -ENETDOWN;

	hci_req_lock(hdev);
	mode = val;
	skb = __hci_cmd_sync(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE, sizeof(mode),
			     &mode, HCI_CMD_TIMEOUT);
	hci_req_unlock(hdev);

	if (IS_ERR(skb))
		return PTR_ERR(skb);

	err = -bt_to_errno(skb->data[0]);
	kfree_skb(skb);

	if (err < 0)
		return err;

	hci_dev_lock(hdev);
	hdev->ssp_debug_mode = val;
	hci_dev_unlock(hdev);

	return 0;
}

static int ssp_debug_mode_get(void *data, u64 *val)
{
	struct hci_dev *hdev = data;

	hci_dev_lock(hdev);
	*val = hdev->ssp_debug_mode;
	hci_dev_unlock(hdev);

	return 0;
}

DEFINE_SIMPLE_ATTRIBUTE(ssp_debug_mode_fops, ssp_debug_mode_get,
			ssp_debug_mode_set, "%llu\n");

static int idle_timeout_set(void *data, u64 val)
{
	struct hci_dev *hdev = data;
@@ -1199,9 +1248,12 @@ static int __hci_init(struct hci_dev *hdev)
				    hdev, &voice_setting_fops);
	}

	if (lmp_ssp_capable(hdev))
	if (lmp_ssp_capable(hdev)) {
		debugfs_create_file("auto_accept_delay", 0644, hdev->debugfs,
				    hdev, &auto_accept_delay_fops);
		debugfs_create_file("ssp_debug_mode", 0644, hdev->debugfs,
				    hdev, &ssp_debug_mode_fops);
	}

	if (lmp_sniff_capable(hdev)) {
		debugfs_create_file("idle_timeout", 0644, hdev->debugfs,
+2 −0
Original line number Diff line number Diff line
@@ -198,6 +198,8 @@ static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb)

	memset(hdev->scan_rsp_data, 0, sizeof(hdev->scan_rsp_data));
	hdev->scan_rsp_data_len = 0;

	hdev->ssp_debug_mode = 0;
}

static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb)