diff options
-rw-r--r-- | sound/usb/usx2y/usb_stream.c | 23 |
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 | ||
59 | static void init_pipe_urbs(struct usb_stream_kernel *sk, unsigned use_packsize, | 59 | static 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 | ||
92 | static void init_urbs(struct usb_stream_kernel *sk, unsigned use_packsize, | 96 | static 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; |
231 | out: | 242 | out: |
232 | return sk->s; | 243 | return sk->s; |