mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-19 07:07:40 +07:00
dfb00a5693
An abstraction of asynchronous transaction for transmission of MIDI
messages was introduced in Linux v4.4. Each driver can utilize this
abstraction to transfer MIDI messages via fixed-length payload of
transaction to a certain unit address. Filling payload of the transaction
is done by callback. In this callback, each driver can return negative
error code, however current implementation assigns the return value to
unsigned variable.
This commit changes type of the variable to fix the bug.
Reported-by: Julia Lawall <Julia.Lawall@lip6.fr>
Cc: <stable@vger.kernel.org> # 4.4+
Fixes: 585d7cba5e
("ALSA: firewire-lib: add helper functions for asynchronous transactions to transfer MIDI messages")
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
83 lines
2.0 KiB
C
83 lines
2.0 KiB
C
#ifndef SOUND_FIREWIRE_LIB_H_INCLUDED
|
|
#define SOUND_FIREWIRE_LIB_H_INCLUDED
|
|
|
|
#include <linux/firewire-constants.h>
|
|
#include <linux/types.h>
|
|
#include <linux/sched.h>
|
|
#include <sound/rawmidi.h>
|
|
|
|
struct fw_unit;
|
|
|
|
#define FW_GENERATION_MASK 0x00ff
|
|
#define FW_FIXED_GENERATION 0x0100
|
|
#define FW_QUIET 0x0200
|
|
|
|
int snd_fw_transaction(struct fw_unit *unit, int tcode,
|
|
u64 offset, void *buffer, size_t length,
|
|
unsigned int flags);
|
|
|
|
/* returns true if retrying the transaction would not make sense */
|
|
static inline bool rcode_is_permanent_error(int rcode)
|
|
{
|
|
return rcode == RCODE_TYPE_ERROR || rcode == RCODE_ADDRESS_ERROR;
|
|
}
|
|
|
|
void snd_fw_schedule_registration(struct fw_unit *unit,
|
|
struct delayed_work *dwork);
|
|
|
|
struct snd_fw_async_midi_port;
|
|
typedef int (*snd_fw_async_midi_port_fill)(
|
|
struct snd_rawmidi_substream *substream,
|
|
u8 *buf);
|
|
|
|
struct snd_fw_async_midi_port {
|
|
struct fw_device *parent;
|
|
struct work_struct work;
|
|
bool idling;
|
|
ktime_t next_ktime;
|
|
bool error;
|
|
|
|
u64 addr;
|
|
struct fw_transaction transaction;
|
|
|
|
u8 *buf;
|
|
unsigned int len;
|
|
|
|
struct snd_rawmidi_substream *substream;
|
|
snd_fw_async_midi_port_fill fill;
|
|
int consume_bytes;
|
|
};
|
|
|
|
int snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port,
|
|
struct fw_unit *unit, u64 addr, unsigned int len,
|
|
snd_fw_async_midi_port_fill fill);
|
|
void snd_fw_async_midi_port_destroy(struct snd_fw_async_midi_port *port);
|
|
|
|
/**
|
|
* snd_fw_async_midi_port_run - run transactions for the async MIDI port
|
|
* @port: the asynchronous MIDI port
|
|
* @substream: the MIDI substream
|
|
*/
|
|
static inline void
|
|
snd_fw_async_midi_port_run(struct snd_fw_async_midi_port *port,
|
|
struct snd_rawmidi_substream *substream)
|
|
{
|
|
if (!port->error) {
|
|
port->substream = substream;
|
|
schedule_work(&port->work);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* snd_fw_async_midi_port_finish - finish the asynchronous MIDI port
|
|
* @port: the asynchronous MIDI port
|
|
*/
|
|
static inline void
|
|
snd_fw_async_midi_port_finish(struct snd_fw_async_midi_port *port)
|
|
{
|
|
port->substream = NULL;
|
|
port->error = false;
|
|
}
|
|
|
|
#endif
|