lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20230612081054.17200-9-tiwai@suse.de>
Date:   Mon, 12 Jun 2023 10:10:52 +0200
From:   Takashi Iwai <tiwai@...e.de>
To:     alsa-devel@...a-project.org
Cc:     linux-kernel@...r.kernel.org
Subject: [PATCH 08/10] ALSA: seq: ump: Notify UMP protocol change to sequencer

UMP v1.1 supports the protocol switch via a UMP Stream message.  When
it's received, we need to take care of the midi_version field in the
corresponding sequencer client, too.

This patch introduces a new ops to notify the protocol change to
snd_seq_ump_ops for handling it.

Signed-off-by: Takashi Iwai <tiwai@...e.de>
---
 include/sound/ump.h             |  1 +
 sound/core/seq/seq_ump_client.c | 10 ++++++++++
 sound/core/ump.c                | 13 +++++++++++++
 3 files changed, 24 insertions(+)

diff --git a/include/sound/ump.h b/include/sound/ump.h
index 0e9c048346fa..68478e7be3b4 100644
--- a/include/sound/ump.h
+++ b/include/sound/ump.h
@@ -72,6 +72,7 @@ struct snd_seq_ump_ops {
 			      const u32 *data, int words);
 	int (*notify_fb_change)(struct snd_ump_endpoint *ump,
 				struct snd_ump_block *fb);
+	int (*switch_protocol)(struct snd_ump_endpoint *ump);
 };
 
 struct snd_ump_block {
diff --git a/sound/core/seq/seq_ump_client.c b/sound/core/seq/seq_ump_client.c
index 901a670dcb36..fe21c801af74 100644
--- a/sound/core/seq/seq_ump_client.c
+++ b/sound/core/seq/seq_ump_client.c
@@ -439,9 +439,19 @@ static int seq_ump_notify_fb_change(struct snd_ump_endpoint *ump,
 	return 0;
 }
 
+/* UMP protocol change notification; just update the midi_version field */
+static int seq_ump_switch_protocol(struct snd_ump_endpoint *ump)
+{
+	if (!ump->seq_client)
+		return -ENODEV;
+	setup_client_midi_version(ump->seq_client);
+	return 0;
+}
+
 static const struct snd_seq_ump_ops seq_ump_ops = {
 	.input_receive = seq_ump_input_receive,
 	.notify_fb_change = seq_ump_notify_fb_change,
+	.switch_protocol = seq_ump_switch_protocol,
 };
 
 /* create a sequencer client and ports for the given UMP endpoint */
diff --git a/sound/core/ump.c b/sound/core/ump.c
index c0cda12bce10..f364bb290d3a 100644
--- a/sound/core/ump.c
+++ b/sound/core/ump.c
@@ -657,14 +657,27 @@ static int ump_handle_product_id_msg(struct snd_ump_endpoint *ump,
 				 buf->raw, 2);
 }
 
+/* notify the protocol change to sequencer */
+static void seq_notify_protocol(struct snd_ump_endpoint *ump)
+{
+#if IS_ENABLED(CONFIG_SND_SEQUENCER)
+	if (ump->seq_ops && ump->seq_ops->switch_protocol)
+		ump->seq_ops->switch_protocol(ump);
+#endif /* CONFIG_SND_SEQUENCER */
+}
+
 /* handle EP stream config message; update the UMP protocol */
 static int ump_handle_stream_cfg_msg(struct snd_ump_endpoint *ump,
 				     const union snd_ump_stream_msg *buf)
 {
+	unsigned int old_protocol = ump->info.protocol;
+
 	ump->info.protocol =
 		(buf->stream_cfg.protocol << 8) | buf->stream_cfg.jrts;
 	ump_dbg(ump, "Current protocol = %x (caps = %x)\n",
 		ump->info.protocol, ump->info.protocol_caps);
+	if (ump->parsed && ump->info.protocol != old_protocol)
+		seq_notify_protocol(ump);
 	return 1; /* finished */
 }
 
-- 
2.35.3

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ