[alsa-devel] [PATCH] 6fire: fix URB transfer buffer for midi output
Takashi Iwai
tiwai at suse.de
Wed Aug 7 18:34:52 CEST 2013
[Cc'ed to linux-usb ML]
At Wed, 7 Aug 2013 16:51:49 +0200,
Torsten Schenk wrote:
>
> Patch fixes URB transfer buffer allocation for midi output to be DMA-able.
Is this really needed?
That is, can't a transfer buffer be at middle of kmalloc'ed space, but
must be always the head of the kmalloc'ed space?
Takashi
>
> Signed-off-by: Torsten Schenk <torsten.schenk at zoho.com>
> ---
> diff -Nur a/sound/usb/6fire/midi.c b/sound/usb/6fire/midi.c
> --- a/sound/usb/6fire/midi.c 2013-08-07 16:32:10.579639391 +0200
> +++ b/sound/usb/6fire/midi.c 2013-08-07 16:32:31.363378104 +0200
> @@ -19,6 +19,10 @@
> #include "chip.h"
> #include "comm.h"
>
> +enum {
> + MIDI_BUFSIZE = 64
> +};
> +
> static void usb6fire_midi_out_handler(struct urb *urb)
> {
> struct midi_runtime *rt = urb->context;
> @@ -156,6 +160,12 @@
> if (!rt)
> return -ENOMEM;
>
> + rt->out_buffer = kzalloc(MIDI_BUFSIZE, GFP_KERNEL);
> + if (!rt->out_buffer) {
> + kfree(rt);
> + return -ENOMEM;
> + }
> +
> rt->chip = chip;
> rt->in_received = usb6fire_midi_in_received;
> rt->out_buffer[0] = 0x80; /* 'send midi' command */
> @@ -169,6 +179,7 @@
>
> ret = snd_rawmidi_new(chip->card, "6FireUSB", 0, 1, 1, &rt->instance);
> if (ret < 0) {
> + kfree(rt->out_buffer);
> kfree(rt);
> snd_printk(KERN_ERR PREFIX "unable to create midi.\n");
> return ret;
> @@ -197,6 +208,9 @@
>
> void usb6fire_midi_destroy(struct sfire_chip *chip)
> {
> - kfree(chip->midi);
> + struct midi_runtime *rt = chip->midi;
> +
> + kfree(rt->out_buffer);
> + kfree(rt);
> chip->midi = NULL;
> }
> diff -Nur a/sound/usb/6fire/midi.h b/sound/usb/6fire/midi.h
> --- a/sound/usb/6fire/midi.h 2013-08-07 16:32:10.579639391 +0200
> +++ b/sound/usb/6fire/midi.h 2013-08-07 16:32:31.363378104 +0200
> @@ -16,10 +16,6 @@
>
> #include "common.h"
>
> -enum {
> - MIDI_BUFSIZE = 64
> -};
> -
> struct midi_runtime {
> struct sfire_chip *chip;
> struct snd_rawmidi *instance;
> @@ -32,7 +28,7 @@
> struct snd_rawmidi_substream *out;
> struct urb out_urb;
> u8 out_serial; /* serial number of out packet */
> - u8 out_buffer[MIDI_BUFSIZE];
> + u8 *out_buffer;
> int buffer_offset;
>
> void (*in_received)(struct midi_runtime *rt, u8 *data, int length);
>
More information about the Alsa-devel
mailing list