[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