* [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.