aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/usb/usx2y/usb_stream.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/sound/usb/usx2y/usb_stream.c b/sound/usb/usx2y/usb_stream.c
index e229abd21652..b0f8979ff2d2 100644
--- a/sound/usb/usx2y/usb_stream.c
+++ b/sound/usb/usx2y/usb_stream.c
@@ -56,7 +56,7 @@ check:
56 lb, s->period_size); 56 lb, s->period_size);
57} 57}
58 58
59static void init_pipe_urbs(struct usb_stream_kernel *sk, unsigned use_packsize, 59static int init_pipe_urbs(struct usb_stream_kernel *sk, unsigned use_packsize,
60 struct urb **urbs, char *transfer, 60 struct urb **urbs, char *transfer,
61 struct usb_device *dev, int pipe) 61 struct usb_device *dev, int pipe)
62{ 62{
@@ -77,6 +77,8 @@ static void init_pipe_urbs(struct usb_stream_kernel *sk, unsigned use_packsize,
77 urb->interval = 1; 77 urb->interval = 1;
78 if (usb_pipeout(pipe)) 78 if (usb_pipeout(pipe))
79 continue; 79 continue;
80 if (usb_urb_ep_type_check(urb))
81 return -EINVAL;
80 82
81 urb->transfer_buffer_length = transfer_length; 83 urb->transfer_buffer_length = transfer_length;
82 desc = urb->iso_frame_desc; 84 desc = urb->iso_frame_desc;
@@ -87,9 +89,11 @@ static void init_pipe_urbs(struct usb_stream_kernel *sk, unsigned use_packsize,
87 desc[p].length = maxpacket; 89 desc[p].length = maxpacket;
88 } 90 }
89 } 91 }
92
93 return 0;
90} 94}
91 95
92static void init_urbs(struct usb_stream_kernel *sk, unsigned use_packsize, 96static int init_urbs(struct usb_stream_kernel *sk, unsigned use_packsize,
93 struct usb_device *dev, int in_pipe, int out_pipe) 97 struct usb_device *dev, int in_pipe, int out_pipe)
94{ 98{
95 struct usb_stream *s = sk->s; 99 struct usb_stream *s = sk->s;
@@ -103,9 +107,12 @@ static void init_urbs(struct usb_stream_kernel *sk, unsigned use_packsize,
103 sk->outurb[u] = usb_alloc_urb(sk->n_o_ps, GFP_KERNEL); 107 sk->outurb[u] = usb_alloc_urb(sk->n_o_ps, GFP_KERNEL);
104 } 108 }
105 109
106 init_pipe_urbs(sk, use_packsize, sk->inurb, indata, dev, in_pipe); 110 if (init_pipe_urbs(sk, use_packsize, sk->inurb, indata, dev, in_pipe) ||
107 init_pipe_urbs(sk, use_packsize, sk->outurb, sk->write_page, dev, 111 init_pipe_urbs(sk, use_packsize, sk->outurb, sk->write_page, dev,
108 out_pipe); 112 out_pipe))
113 return -EINVAL;
114
115 return 0;
109} 116}
110 117
111 118
@@ -226,7 +233,11 @@ struct usb_stream *usb_stream_new(struct usb_stream_kernel *sk,
226 else 233 else
227 sk->freqn = get_usb_high_speed_rate(sample_rate); 234 sk->freqn = get_usb_high_speed_rate(sample_rate);
228 235
229 init_urbs(sk, use_packsize, dev, in_pipe, out_pipe); 236 if (init_urbs(sk, use_packsize, dev, in_pipe, out_pipe) < 0) {
237 usb_stream_free(sk);
238 return NULL;
239 }
240
230 sk->s->state = usb_stream_stopped; 241 sk->s->state = usb_stream_stopped;
231out: 242out:
232 return sk->s; 243 return sk->s;