All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] 6fire: fix DMA issues with URB transfer_buffer usage
@ 2013-08-06 11:53 Jussi Kivilinna
       [not found] ` <20130806115324.23908.18291.stgit-bi+AKbBUZKagILUCTcTcHdKyNwTtLsGr@public.gmane.org>
  0 siblings, 1 reply; 5+ messages in thread
From: Jussi Kivilinna @ 2013-08-06 11:53 UTC (permalink / raw)
  To: alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw
  Cc: Takashi Iwai, linux-usb-u79uwXL29TY76Z2rM5mHXA, Jaroslav Kysela

Patch fixes 6fire not to use stack as URB transfer_buffer. URB buffers need to
be DMA-able, which stack is not. Furthermore, transfer_buffer should not be
allocated as part of larger device structure because DMA coherency issues and
patch fixes this issue too.

Patch is only compile tested.

Cc: stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Signed-off-by: Jussi Kivilinna <jussi.kivilinna-X3B1VOXEql0@public.gmane.org>
---
 sound/usb/6fire/comm.c |   38 +++++++++++++++++++++++++++++++++-----
 sound/usb/6fire/comm.h |    2 +-
 2 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/sound/usb/6fire/comm.c b/sound/usb/6fire/comm.c
index 9e6e3ff..23452ee 100644
--- a/sound/usb/6fire/comm.c
+++ b/sound/usb/6fire/comm.c
@@ -110,19 +110,37 @@ static int usb6fire_comm_send_buffer(u8 *buffer, struct usb_device *dev)
 static int usb6fire_comm_write8(struct comm_runtime *rt, u8 request,
 		u8 reg, u8 value)
 {
-	u8 buffer[13]; /* 13: maximum length of message */
+	u8 *buffer;
+	int ret;
+
+	/* 13: maximum length of message */
+	buffer = kmalloc(13, GFP_KERNEL);
+	if (!buffer)
+		return -ENOMEM;
 
 	usb6fire_comm_init_buffer(buffer, 0x00, request, reg, value, 0x00);
-	return usb6fire_comm_send_buffer(buffer, rt->chip->dev);
+	ret = usb6fire_comm_send_buffer(buffer, rt->chip->dev);
+
+	kfree(buffer);
+	return ret;
 }
 
 static int usb6fire_comm_write16(struct comm_runtime *rt, u8 request,
 		u8 reg, u8 vl, u8 vh)
 {
-	u8 buffer[13]; /* 13: maximum length of message */
+	u8 *buffer;
+	int ret;
+
+	/* 13: maximum length of message */
+	buffer = kmalloc(13, GFP_KERNEL);
+	if (!buffer)
+		return -ENOMEM;
 
 	usb6fire_comm_init_buffer(buffer, 0x00, request, reg, vl, vh);
-	return usb6fire_comm_send_buffer(buffer, rt->chip->dev);
+	ret = usb6fire_comm_send_buffer(buffer, rt->chip->dev);
+
+	kfree(buffer);
+	return ret;
 }
 
 int usb6fire_comm_init(struct sfire_chip *chip)
@@ -135,6 +153,12 @@ int usb6fire_comm_init(struct sfire_chip *chip)
 	if (!rt)
 		return -ENOMEM;
 
+	rt->receiver_buffer = kzalloc(COMM_RECEIVER_BUFSIZE, GFP_KERNEL);
+	if (!rt->receiver_buffer) {
+		kfree(rt);
+		return -ENOMEM;
+	}
+
 	urb = &rt->receiver;
 	rt->serial = 1;
 	rt->chip = chip;
@@ -153,6 +177,7 @@ int usb6fire_comm_init(struct sfire_chip *chip)
 	urb->interval = 1;
 	ret = usb_submit_urb(urb, GFP_KERNEL);
 	if (ret < 0) {
+		kfree(rt->receiver_buffer);
 		kfree(rt);
 		snd_printk(KERN_ERR PREFIX "cannot create comm data receiver.");
 		return ret;
@@ -171,6 +196,9 @@ void usb6fire_comm_abort(struct sfire_chip *chip)
 
 void usb6fire_comm_destroy(struct sfire_chip *chip)
 {
-	kfree(chip->comm);
+	struct comm_runtime *rt = chip->comm;
+
+	kfree(rt->receiver_buffer);
+	kfree(rt);
 	chip->comm = NULL;
 }
diff --git a/sound/usb/6fire/comm.h b/sound/usb/6fire/comm.h
index 6a0840b..780d5ed 100644
--- a/sound/usb/6fire/comm.h
+++ b/sound/usb/6fire/comm.h
@@ -24,7 +24,7 @@ struct comm_runtime {
 	struct sfire_chip *chip;
 
 	struct urb receiver;
-	u8 receiver_buffer[COMM_RECEIVER_BUFSIZE];
+	u8 *receiver_buffer;
 
 	u8 serial; /* urb serial */
 

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [alsa-devel] [PATCH] 6fire: fix DMA issues with URB transfer_buffer usage
       [not found] ` <20130806115324.23908.18291.stgit-bi+AKbBUZKagILUCTcTcHdKyNwTtLsGr@public.gmane.org>
@ 2013-08-07 12:43   ` Takashi Iwai
  2013-08-07 13:59     ` Torsten Schenk
  0 siblings, 1 reply; 5+ messages in thread
From: Takashi Iwai @ 2013-08-07 12:43 UTC (permalink / raw)
  To: Jussi Kivilinna
  Cc: Torsten Schenk, alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw,
	linux-usb-u79uwXL29TY76Z2rM5mHXA

At Tue, 06 Aug 2013 14:53:24 +0300,
Jussi Kivilinna wrote:
> 
> Patch fixes 6fire not to use stack as URB transfer_buffer. URB buffers need to
> be DMA-able, which stack is not. Furthermore, transfer_buffer should not be
> allocated as part of larger device structure because DMA coherency issues and
> patch fixes this issue too.
> 
> Patch is only compile tested.

The changes look OK, but I'd like to let it checked with a real
hardware before putting to stable kernel.

Torsten, could you check this?


thanks,

Takashi

> 
> Cc: stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> Signed-off-by: Jussi Kivilinna <jussi.kivilinna-X3B1VOXEql0@public.gmane.org>
> ---
>  sound/usb/6fire/comm.c |   38 +++++++++++++++++++++++++++++++++-----
>  sound/usb/6fire/comm.h |    2 +-
>  2 files changed, 34 insertions(+), 6 deletions(-)
> 
> diff --git a/sound/usb/6fire/comm.c b/sound/usb/6fire/comm.c
> index 9e6e3ff..23452ee 100644
> --- a/sound/usb/6fire/comm.c
> +++ b/sound/usb/6fire/comm.c
> @@ -110,19 +110,37 @@ static int usb6fire_comm_send_buffer(u8 *buffer, struct usb_device *dev)
>  static int usb6fire_comm_write8(struct comm_runtime *rt, u8 request,
>  		u8 reg, u8 value)
>  {
> -	u8 buffer[13]; /* 13: maximum length of message */
> +	u8 *buffer;
> +	int ret;
> +
> +	/* 13: maximum length of message */
> +	buffer = kmalloc(13, GFP_KERNEL);
> +	if (!buffer)
> +		return -ENOMEM;
>  
>  	usb6fire_comm_init_buffer(buffer, 0x00, request, reg, value, 0x00);
> -	return usb6fire_comm_send_buffer(buffer, rt->chip->dev);
> +	ret = usb6fire_comm_send_buffer(buffer, rt->chip->dev);
> +
> +	kfree(buffer);
> +	return ret;
>  }
>  
>  static int usb6fire_comm_write16(struct comm_runtime *rt, u8 request,
>  		u8 reg, u8 vl, u8 vh)
>  {
> -	u8 buffer[13]; /* 13: maximum length of message */
> +	u8 *buffer;
> +	int ret;
> +
> +	/* 13: maximum length of message */
> +	buffer = kmalloc(13, GFP_KERNEL);
> +	if (!buffer)
> +		return -ENOMEM;
>  
>  	usb6fire_comm_init_buffer(buffer, 0x00, request, reg, vl, vh);
> -	return usb6fire_comm_send_buffer(buffer, rt->chip->dev);
> +	ret = usb6fire_comm_send_buffer(buffer, rt->chip->dev);
> +
> +	kfree(buffer);
> +	return ret;
>  }
>  
>  int usb6fire_comm_init(struct sfire_chip *chip)
> @@ -135,6 +153,12 @@ int usb6fire_comm_init(struct sfire_chip *chip)
>  	if (!rt)
>  		return -ENOMEM;
>  
> +	rt->receiver_buffer = kzalloc(COMM_RECEIVER_BUFSIZE, GFP_KERNEL);
> +	if (!rt->receiver_buffer) {
> +		kfree(rt);
> +		return -ENOMEM;
> +	}
> +
>  	urb = &rt->receiver;
>  	rt->serial = 1;
>  	rt->chip = chip;
> @@ -153,6 +177,7 @@ int usb6fire_comm_init(struct sfire_chip *chip)
>  	urb->interval = 1;
>  	ret = usb_submit_urb(urb, GFP_KERNEL);
>  	if (ret < 0) {
> +		kfree(rt->receiver_buffer);
>  		kfree(rt);
>  		snd_printk(KERN_ERR PREFIX "cannot create comm data receiver.");
>  		return ret;
> @@ -171,6 +196,9 @@ void usb6fire_comm_abort(struct sfire_chip *chip)
>  
>  void usb6fire_comm_destroy(struct sfire_chip *chip)
>  {
> -	kfree(chip->comm);
> +	struct comm_runtime *rt = chip->comm;
> +
> +	kfree(rt->receiver_buffer);
> +	kfree(rt);
>  	chip->comm = NULL;
>  }
> diff --git a/sound/usb/6fire/comm.h b/sound/usb/6fire/comm.h
> index 6a0840b..780d5ed 100644
> --- a/sound/usb/6fire/comm.h
> +++ b/sound/usb/6fire/comm.h
> @@ -24,7 +24,7 @@ struct comm_runtime {
>  	struct sfire_chip *chip;
>  
>  	struct urb receiver;
> -	u8 receiver_buffer[COMM_RECEIVER_BUFSIZE];
> +	u8 *receiver_buffer;
>  
>  	u8 serial; /* urb serial */
>  
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw@public.gmane.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] 6fire: fix DMA issues with URB transfer_buffer usage
  2013-08-07 12:43   ` [alsa-devel] " Takashi Iwai
@ 2013-08-07 13:59     ` Torsten Schenk
       [not found]       ` <20130807155907.dfea021b3b73fcac33e4323d-ytc+IHgoah0@public.gmane.org>
  0 siblings, 1 reply; 5+ messages in thread
From: Torsten Schenk @ 2013-08-07 13:59 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: Jussi Kivilinna, alsa-devel, Torsten Schenk, linux-usb

On Wed, 07 Aug 2013 14:43:43 +0200
Takashi Iwai <tiwai@suse.de> wrote:

> At Tue, 06 Aug 2013 14:53:24 +0300,
> Jussi Kivilinna wrote:
> > 
> > Patch fixes 6fire not to use stack as URB transfer_buffer. URB
> > buffers need to be DMA-able, which stack is not. Furthermore,
> > transfer_buffer should not be allocated as part of larger device
> > structure because DMA coherency issues and patch fixes this issue
> > too.

Thanks for the information. There is another section where this applies
in midi.c/midi.h. I can post a patch later.

> > 
> > Patch is only compile tested.
> 
> The changes look OK, but I'd like to let it checked with a real
> hardware before putting to stable kernel.
> 
> Torsten, could you check this?

The patch works nicely.

I'm just wondering if instead of calling kmalloc() every time it'd be
better to put a global sender_buffer and a mutex into the comm_runtime
struct and lock it every time a writeX is performed. This also would
have the advantage that message blocks would never overlap which
currently is possible.

I can prepare a patch on top of this one and send it later, if you
agree.

Thanks,
Torsten

> 
> 
> thanks,
> 
> Takashi
> 
> > 
> > Cc: stable@vger.kernel.org
> > Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
> > ---
> >  sound/usb/6fire/comm.c |   38 ++++++++++++++++++++++++++++++++
> > +----- sound/usb/6fire/comm.h |    2 +-
> >  2 files changed, 34 insertions(+), 6 deletions(-)
> > 
> > diff --git a/sound/usb/6fire/comm.c b/sound/usb/6fire/comm.c
> > index 9e6e3ff..23452ee 100644
> > --- a/sound/usb/6fire/comm.c
> > +++ b/sound/usb/6fire/comm.c
> > @@ -110,19 +110,37 @@ static int usb6fire_comm_send_buffer(u8
> > *buffer, struct usb_device *dev) static int usb6fire_comm_write8
> > (struct comm_runtime *rt, u8 request, u8 reg, u8 value)
> >  {
> > -	u8 buffer[13]; /* 13: maximum length of message */
> > +	u8 *buffer;
> > +	int ret;
> > +
> > +	/* 13: maximum length of message */
> > +	buffer = kmalloc(13, GFP_KERNEL);
> > +	if (!buffer)
> > +		return -ENOMEM;
> >  
> >  	usb6fire_comm_init_buffer(buffer, 0x00, request, reg,
> > value, 0x00);
> > -	return usb6fire_comm_send_buffer(buffer, rt->chip->dev);
> > +	ret = usb6fire_comm_send_buffer(buffer, rt->chip->dev);
> > +
> > +	kfree(buffer);
> > +	return ret;
> >  }
> >  
> >  static int usb6fire_comm_write16(struct comm_runtime *rt, u8
> > request, u8 reg, u8 vl, u8 vh)
> >  {
> > -	u8 buffer[13]; /* 13: maximum length of message */
> > +	u8 *buffer;
> > +	int ret;
> > +
> > +	/* 13: maximum length of message */
> > +	buffer = kmalloc(13, GFP_KERNEL);
> > +	if (!buffer)
> > +		return -ENOMEM;
> >  
> >  	usb6fire_comm_init_buffer(buffer, 0x00, request, reg, vl,
> > vh);
> > -	return usb6fire_comm_send_buffer(buffer, rt->chip->dev);
> > +	ret = usb6fire_comm_send_buffer(buffer, rt->chip->dev);
> > +
> > +	kfree(buffer);
> > +	return ret;
> >  }
> >  
> >  int usb6fire_comm_init(struct sfire_chip *chip)
> > @@ -135,6 +153,12 @@ int usb6fire_comm_init(struct sfire_chip *chip)
> >  	if (!rt)
> >  		return -ENOMEM;
> >  
> > +	rt->receiver_buffer = kzalloc(COMM_RECEIVER_BUFSIZE,
> > GFP_KERNEL);
> > +	if (!rt->receiver_buffer) {
> > +		kfree(rt);
> > +		return -ENOMEM;
> > +	}
> > +
> >  	urb = &rt->receiver;
> >  	rt->serial = 1;
> >  	rt->chip = chip;
> > @@ -153,6 +177,7 @@ int usb6fire_comm_init(struct sfire_chip *chip)
> >  	urb->interval = 1;
> >  	ret = usb_submit_urb(urb, GFP_KERNEL);
> >  	if (ret < 0) {
> > +		kfree(rt->receiver_buffer);
> >  		kfree(rt);
> >  		snd_printk(KERN_ERR PREFIX "cannot create comm
> > data receiver."); return ret;
> > @@ -171,6 +196,9 @@ void usb6fire_comm_abort(struct sfire_chip
> > *chip) 
> >  void usb6fire_comm_destroy(struct sfire_chip *chip)
> >  {
> > -	kfree(chip->comm);
> > +	struct comm_runtime *rt = chip->comm;
> > +
> > +	kfree(rt->receiver_buffer);
> > +	kfree(rt);
> >  	chip->comm = NULL;
> >  }
> > diff --git a/sound/usb/6fire/comm.h b/sound/usb/6fire/comm.h
> > index 6a0840b..780d5ed 100644
> > --- a/sound/usb/6fire/comm.h
> > +++ b/sound/usb/6fire/comm.h
> > @@ -24,7 +24,7 @@ struct comm_runtime {
> >  	struct sfire_chip *chip;
> >  
> >  	struct urb receiver;
> > -	u8 receiver_buffer[COMM_RECEIVER_BUFSIZE];
> > +	u8 *receiver_buffer;
> >  
> >  	u8 serial; /* urb serial */
> >  
> > 
> > _______________________________________________
> > Alsa-devel mailing list
> > Alsa-devel@alsa-project.org
> > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> > 
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [alsa-devel] [PATCH] 6fire: fix DMA issues with URB transfer_buffer usage
       [not found]       ` <20130807155907.dfea021b3b73fcac33e4323d-ytc+IHgoah0@public.gmane.org>
@ 2013-08-07 14:05         ` Takashi Iwai
  2013-08-07 14:50         ` Jussi Kivilinna
  1 sibling, 0 replies; 5+ messages in thread
From: Takashi Iwai @ 2013-08-07 14:05 UTC (permalink / raw)
  To: Torsten Schenk
  Cc: Jussi Kivilinna, alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw,
	linux-usb-u79uwXL29TY76Z2rM5mHXA

At Wed, 7 Aug 2013 15:59:07 +0200,
Torsten Schenk wrote:
> 
> On Wed, 07 Aug 2013 14:43:43 +0200
> Takashi Iwai <tiwai-l3A5Bk7waGM@public.gmane.org> wrote:
> 
> > At Tue, 06 Aug 2013 14:53:24 +0300,
> > Jussi Kivilinna wrote:
> > > 
> > > Patch fixes 6fire not to use stack as URB transfer_buffer. URB
> > > buffers need to be DMA-able, which stack is not. Furthermore,
> > > transfer_buffer should not be allocated as part of larger device
> > > structure because DMA coherency issues and patch fixes this issue
> > > too.
> 
> Thanks for the information. There is another section where this applies
> in midi.c/midi.h. I can post a patch later.

Yes, please.

> > > Patch is only compile tested.
> > 
> > The changes look OK, but I'd like to let it checked with a real
> > hardware before putting to stable kernel.
> > 
> > Torsten, could you check this?
> 
> The patch works nicely.

OK, I queued the patch to sound git tree now.

> I'm just wondering if instead of calling kmalloc() every time it'd be
> better to put a global sender_buffer and a mutex into the comm_runtime
> struct and lock it every time a writeX is performed. This also would
> have the advantage that message blocks would never overlap which
> currently is possible.
> 
> I can prepare a patch on top of this one and send it later, if you
> agree.

Yes, it'd be much better.


thanks,

Takashi

> 
> Thanks,
> Torsten
> 
> > 
> > 
> > thanks,
> > 
> > Takashi
> > 
> > > 
> > > Cc: stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> > > Signed-off-by: Jussi Kivilinna <jussi.kivilinna-X3B1VOXEql0@public.gmane.org>
> > > ---
> > >  sound/usb/6fire/comm.c |   38 ++++++++++++++++++++++++++++++++
> > > +----- sound/usb/6fire/comm.h |    2 +-
> > >  2 files changed, 34 insertions(+), 6 deletions(-)
> > > 
> > > diff --git a/sound/usb/6fire/comm.c b/sound/usb/6fire/comm.c
> > > index 9e6e3ff..23452ee 100644
> > > --- a/sound/usb/6fire/comm.c
> > > +++ b/sound/usb/6fire/comm.c
> > > @@ -110,19 +110,37 @@ static int usb6fire_comm_send_buffer(u8
> > > *buffer, struct usb_device *dev) static int usb6fire_comm_write8
> > > (struct comm_runtime *rt, u8 request, u8 reg, u8 value)
> > >  {
> > > -	u8 buffer[13]; /* 13: maximum length of message */
> > > +	u8 *buffer;
> > > +	int ret;
> > > +
> > > +	/* 13: maximum length of message */
> > > +	buffer = kmalloc(13, GFP_KERNEL);
> > > +	if (!buffer)
> > > +		return -ENOMEM;
> > >  
> > >  	usb6fire_comm_init_buffer(buffer, 0x00, request, reg,
> > > value, 0x00);
> > > -	return usb6fire_comm_send_buffer(buffer, rt->chip->dev);
> > > +	ret = usb6fire_comm_send_buffer(buffer, rt->chip->dev);
> > > +
> > > +	kfree(buffer);
> > > +	return ret;
> > >  }
> > >  
> > >  static int usb6fire_comm_write16(struct comm_runtime *rt, u8
> > > request, u8 reg, u8 vl, u8 vh)
> > >  {
> > > -	u8 buffer[13]; /* 13: maximum length of message */
> > > +	u8 *buffer;
> > > +	int ret;
> > > +
> > > +	/* 13: maximum length of message */
> > > +	buffer = kmalloc(13, GFP_KERNEL);
> > > +	if (!buffer)
> > > +		return -ENOMEM;
> > >  
> > >  	usb6fire_comm_init_buffer(buffer, 0x00, request, reg, vl,
> > > vh);
> > > -	return usb6fire_comm_send_buffer(buffer, rt->chip->dev);
> > > +	ret = usb6fire_comm_send_buffer(buffer, rt->chip->dev);
> > > +
> > > +	kfree(buffer);
> > > +	return ret;
> > >  }
> > >  
> > >  int usb6fire_comm_init(struct sfire_chip *chip)
> > > @@ -135,6 +153,12 @@ int usb6fire_comm_init(struct sfire_chip *chip)
> > >  	if (!rt)
> > >  		return -ENOMEM;
> > >  
> > > +	rt->receiver_buffer = kzalloc(COMM_RECEIVER_BUFSIZE,
> > > GFP_KERNEL);
> > > +	if (!rt->receiver_buffer) {
> > > +		kfree(rt);
> > > +		return -ENOMEM;
> > > +	}
> > > +
> > >  	urb = &rt->receiver;
> > >  	rt->serial = 1;
> > >  	rt->chip = chip;
> > > @@ -153,6 +177,7 @@ int usb6fire_comm_init(struct sfire_chip *chip)
> > >  	urb->interval = 1;
> > >  	ret = usb_submit_urb(urb, GFP_KERNEL);
> > >  	if (ret < 0) {
> > > +		kfree(rt->receiver_buffer);
> > >  		kfree(rt);
> > >  		snd_printk(KERN_ERR PREFIX "cannot create comm
> > > data receiver."); return ret;
> > > @@ -171,6 +196,9 @@ void usb6fire_comm_abort(struct sfire_chip
> > > *chip) 
> > >  void usb6fire_comm_destroy(struct sfire_chip *chip)
> > >  {
> > > -	kfree(chip->comm);
> > > +	struct comm_runtime *rt = chip->comm;
> > > +
> > > +	kfree(rt->receiver_buffer);
> > > +	kfree(rt);
> > >  	chip->comm = NULL;
> > >  }
> > > diff --git a/sound/usb/6fire/comm.h b/sound/usb/6fire/comm.h
> > > index 6a0840b..780d5ed 100644
> > > --- a/sound/usb/6fire/comm.h
> > > +++ b/sound/usb/6fire/comm.h
> > > @@ -24,7 +24,7 @@ struct comm_runtime {
> > >  	struct sfire_chip *chip;
> > >  
> > >  	struct urb receiver;
> > > -	u8 receiver_buffer[COMM_RECEIVER_BUFSIZE];
> > > +	u8 *receiver_buffer;
> > >  
> > >  	u8 serial; /* urb serial */
> > >  
> > > 
> > > _______________________________________________
> > > Alsa-devel mailing list
> > > Alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw@public.gmane.org
> > > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> > > 
> > 
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [alsa-devel] [PATCH] 6fire: fix DMA issues with URB transfer_buffer usage
       [not found]       ` <20130807155907.dfea021b3b73fcac33e4323d-ytc+IHgoah0@public.gmane.org>
  2013-08-07 14:05         ` [alsa-devel] " Takashi Iwai
@ 2013-08-07 14:50         ` Jussi Kivilinna
  1 sibling, 0 replies; 5+ messages in thread
From: Jussi Kivilinna @ 2013-08-07 14:50 UTC (permalink / raw)
  To: Torsten Schenk
  Cc: Takashi Iwai, alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw,
	linux-usb-u79uwXL29TY76Z2rM5mHXA

On 07.08.2013 16:59, Torsten Schenk wrote:
> On Wed, 07 Aug 2013 14:43:43 +0200
> Takashi Iwai <tiwai-l3A5Bk7waGM@public.gmane.org> wrote:
> 
>> At Tue, 06 Aug 2013 14:53:24 +0300,
>> Jussi Kivilinna wrote:
>>>
>>> Patch fixes 6fire not to use stack as URB transfer_buffer. URB
>>> buffers need to be DMA-able, which stack is not. Furthermore,
>>> transfer_buffer should not be allocated as part of larger device
>>> structure because DMA coherency issues and patch fixes this issue
>>> too.
> 
> Thanks for the information. There is another section where this applies
> in midi.c/midi.h. I can post a patch later.

Appearently in pcm.c/pcm.h too:
 http://lxr.free-electrons.com/source/sound/usb/6fire/pcm.c#L571
 http://lxr.free-electrons.com/source/sound/usb/6fire/pcm.h#L35

-Jussi

> 
>>>
>>> Patch is only compile tested.
>>
>> The changes look OK, but I'd like to let it checked with a real
>> hardware before putting to stable kernel.
>>
>> Torsten, could you check this?
> 
> The patch works nicely.
> 
> I'm just wondering if instead of calling kmalloc() every time it'd be
> better to put a global sender_buffer and a mutex into the comm_runtime
> struct and lock it every time a writeX is performed. This also would
> have the advantage that message blocks would never overlap which
> currently is possible.
> 
> I can prepare a patch on top of this one and send it later, if you
> agree.
> 
> Thanks,
> Torsten
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-08-07 14:50 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-06 11:53 [PATCH] 6fire: fix DMA issues with URB transfer_buffer usage Jussi Kivilinna
     [not found] ` <20130806115324.23908.18291.stgit-bi+AKbBUZKagILUCTcTcHdKyNwTtLsGr@public.gmane.org>
2013-08-07 12:43   ` [alsa-devel] " Takashi Iwai
2013-08-07 13:59     ` Torsten Schenk
     [not found]       ` <20130807155907.dfea021b3b73fcac33e4323d-ytc+IHgoah0@public.gmane.org>
2013-08-07 14:05         ` [alsa-devel] " Takashi Iwai
2013-08-07 14:50         ` Jussi Kivilinna

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.