Commit b15bfa4d authored by Tedd Ho-Jeong An's avatar Tedd Ho-Jeong An Committed by Marcel Holtmann
Browse files

Bluetooth: mgmt: Fix Experimental Feature Changed event



This patch fixes the controller index in the Experimental Features
Changed event for the offload_codec and the quality_report features to
use the actual hdev index instead of non-controller index(0xffff) so the
client can receive the event and know which controller the event is for.

Fixes: ad933151 ("Bluetooth: Add offload feature under experimental flag")
Fixes: ae7d925b ("Bluetooth: Support the quality report events")
Signed-off-by: default avatarTedd Ho-Jeong An <tedd.an@intel.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 8b89637d
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -3927,7 +3927,9 @@ static int exp_debug_feature_changed(bool enabled, struct sock *skip)
}
#endif

static int exp_quality_report_feature_changed(bool enabled, struct sock *skip)
static int exp_quality_report_feature_changed(bool enabled,
					      struct hci_dev *hdev,
					      struct sock *skip)
{
	struct mgmt_ev_exp_feature_changed ev;

@@ -3935,7 +3937,7 @@ static int exp_quality_report_feature_changed(bool enabled, struct sock *skip)
	memcpy(ev.uuid, quality_report_uuid, 16);
	ev.flags = cpu_to_le32(enabled ? BIT(0) : 0);

	return mgmt_limited_event(MGMT_EV_EXP_FEATURE_CHANGED, NULL,
	return mgmt_limited_event(MGMT_EV_EXP_FEATURE_CHANGED, hdev,
				  &ev, sizeof(ev),
				  HCI_MGMT_EXP_FEATURE_EVENTS, skip);
}
@@ -4156,14 +4158,15 @@ static int set_quality_report_func(struct sock *sk, struct hci_dev *hdev,
				&rp, sizeof(rp));

	if (changed)
		exp_quality_report_feature_changed(val, sk);
		exp_quality_report_feature_changed(val, hdev, sk);

unlock_quality_report:
	hci_req_sync_unlock(hdev);
	return err;
}

static int exp_offload_codec_feature_changed(bool enabled, struct sock *skip)
static int exp_offload_codec_feature_changed(bool enabled, struct hci_dev *hdev,
					     struct sock *skip)
{
	struct mgmt_ev_exp_feature_changed ev;

@@ -4171,7 +4174,7 @@ static int exp_offload_codec_feature_changed(bool enabled, struct sock *skip)
	memcpy(ev.uuid, offload_codecs_uuid, 16);
	ev.flags = cpu_to_le32(enabled ? BIT(0) : 0);

	return mgmt_limited_event(MGMT_EV_EXP_FEATURE_CHANGED, NULL,
	return mgmt_limited_event(MGMT_EV_EXP_FEATURE_CHANGED, hdev,
				  &ev, sizeof(ev),
				  HCI_MGMT_EXP_FEATURE_EVENTS, skip);
}
@@ -4229,7 +4232,7 @@ static int set_offload_codec_func(struct sock *sk, struct hci_dev *hdev,
				&rp, sizeof(rp));

	if (changed)
		exp_offload_codec_feature_changed(val, sk);
		exp_offload_codec_feature_changed(val, hdev, sk);

	return err;
}