Skip to content

Commit ddb6b5a

Browse files
jkivilintiwai
authored andcommitted
ALSA: 6fire: fix DMA issues with URB transfer_buffer usage
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. Cc: [email protected] Signed-off-by: Jussi Kivilinna <[email protected]> Tested-by: Torsten Schenk <[email protected]> Signed-off-by: Takashi Iwai <[email protected]>
1 parent 697aeba commit ddb6b5a

File tree

2 files changed

+34
-6
lines changed

2 files changed

+34
-6
lines changed

sound/usb/6fire/comm.c

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,19 +110,37 @@ static int usb6fire_comm_send_buffer(u8 *buffer, struct usb_device *dev)
110110
static int usb6fire_comm_write8(struct comm_runtime *rt, u8 request,
111111
u8 reg, u8 value)
112112
{
113-
u8 buffer[13]; /* 13: maximum length of message */
113+
u8 *buffer;
114+
int ret;
115+
116+
/* 13: maximum length of message */
117+
buffer = kmalloc(13, GFP_KERNEL);
118+
if (!buffer)
119+
return -ENOMEM;
114120

115121
usb6fire_comm_init_buffer(buffer, 0x00, request, reg, value, 0x00);
116-
return usb6fire_comm_send_buffer(buffer, rt->chip->dev);
122+
ret = usb6fire_comm_send_buffer(buffer, rt->chip->dev);
123+
124+
kfree(buffer);
125+
return ret;
117126
}
118127

119128
static int usb6fire_comm_write16(struct comm_runtime *rt, u8 request,
120129
u8 reg, u8 vl, u8 vh)
121130
{
122-
u8 buffer[13]; /* 13: maximum length of message */
131+
u8 *buffer;
132+
int ret;
133+
134+
/* 13: maximum length of message */
135+
buffer = kmalloc(13, GFP_KERNEL);
136+
if (!buffer)
137+
return -ENOMEM;
123138

124139
usb6fire_comm_init_buffer(buffer, 0x00, request, reg, vl, vh);
125-
return usb6fire_comm_send_buffer(buffer, rt->chip->dev);
140+
ret = usb6fire_comm_send_buffer(buffer, rt->chip->dev);
141+
142+
kfree(buffer);
143+
return ret;
126144
}
127145

128146
int usb6fire_comm_init(struct sfire_chip *chip)
@@ -135,6 +153,12 @@ int usb6fire_comm_init(struct sfire_chip *chip)
135153
if (!rt)
136154
return -ENOMEM;
137155

156+
rt->receiver_buffer = kzalloc(COMM_RECEIVER_BUFSIZE, GFP_KERNEL);
157+
if (!rt->receiver_buffer) {
158+
kfree(rt);
159+
return -ENOMEM;
160+
}
161+
138162
urb = &rt->receiver;
139163
rt->serial = 1;
140164
rt->chip = chip;
@@ -153,6 +177,7 @@ int usb6fire_comm_init(struct sfire_chip *chip)
153177
urb->interval = 1;
154178
ret = usb_submit_urb(urb, GFP_KERNEL);
155179
if (ret < 0) {
180+
kfree(rt->receiver_buffer);
156181
kfree(rt);
157182
snd_printk(KERN_ERR PREFIX "cannot create comm data receiver.");
158183
return ret;
@@ -171,6 +196,9 @@ void usb6fire_comm_abort(struct sfire_chip *chip)
171196

172197
void usb6fire_comm_destroy(struct sfire_chip *chip)
173198
{
174-
kfree(chip->comm);
199+
struct comm_runtime *rt = chip->comm;
200+
201+
kfree(rt->receiver_buffer);
202+
kfree(rt);
175203
chip->comm = NULL;
176204
}

sound/usb/6fire/comm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ struct comm_runtime {
2424
struct sfire_chip *chip;
2525

2626
struct urb receiver;
27-
u8 receiver_buffer[COMM_RECEIVER_BUFSIZE];
27+
u8 *receiver_buffer;
2828

2929
u8 serial; /* urb serial */
3030

0 commit comments

Comments
 (0)