.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /* |
---|
2 | 3 | * Copyright (C) 2007, 2008 Karsten Wiese <fzu@wemgehoertderstaat.de> |
---|
3 | | - * |
---|
4 | | - * This program is free software; you can redistribute it and/or modify it |
---|
5 | | - * under the terms of the GNU General Public License as published by the |
---|
6 | | - * Free Software Foundation; either version 2 of the License, or (at your |
---|
7 | | - * option) any later version. |
---|
8 | | - * |
---|
9 | | - * This program is distributed in the hope that it will be useful, but |
---|
10 | | - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
---|
11 | | - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
---|
12 | | - * for more details. |
---|
13 | | - * |
---|
14 | | - * You should have received a copy of the GNU General Public License |
---|
15 | | - * along with this program; if not, write to the Free Software Foundation, |
---|
16 | | - * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
---|
17 | 4 | */ |
---|
18 | 5 | |
---|
19 | 6 | #include <linux/usb.h> |
---|
.. | .. |
---|
104 | 91 | |
---|
105 | 92 | for (u = 0; u < USB_STREAM_NURBS; ++u) { |
---|
106 | 93 | sk->inurb[u] = usb_alloc_urb(sk->n_o_ps, GFP_KERNEL); |
---|
| 94 | + if (!sk->inurb[u]) |
---|
| 95 | + return -ENOMEM; |
---|
| 96 | + |
---|
107 | 97 | sk->outurb[u] = usb_alloc_urb(sk->n_o_ps, GFP_KERNEL); |
---|
| 98 | + if (!sk->outurb[u]) |
---|
| 99 | + return -ENOMEM; |
---|
108 | 100 | } |
---|
109 | 101 | |
---|
110 | 102 | if (init_pipe_urbs(sk, use_packsize, sk->inurb, indata, dev, in_pipe) || |
---|
.. | .. |
---|
150 | 142 | if (!s) |
---|
151 | 143 | return; |
---|
152 | 144 | |
---|
153 | | - free_pages((unsigned long)sk->write_page, get_order(s->write_size)); |
---|
154 | | - sk->write_page = NULL; |
---|
155 | | - free_pages((unsigned long)s, get_order(s->read_size)); |
---|
| 145 | + if (sk->write_page) { |
---|
| 146 | + free_pages_exact(sk->write_page, s->write_size); |
---|
| 147 | + sk->write_page = NULL; |
---|
| 148 | + } |
---|
| 149 | + |
---|
| 150 | + free_pages_exact(s, s->read_size); |
---|
156 | 151 | sk->s = NULL; |
---|
157 | 152 | } |
---|
158 | 153 | |
---|
.. | .. |
---|
167 | 162 | int read_size = sizeof(struct usb_stream); |
---|
168 | 163 | int write_size; |
---|
169 | 164 | int usb_frames = dev->speed == USB_SPEED_HIGH ? 8000 : 1000; |
---|
170 | | - int pg; |
---|
171 | 165 | |
---|
172 | 166 | in_pipe = usb_rcvisocpipe(dev, in_endpoint); |
---|
173 | 167 | out_pipe = usb_sndisocpipe(dev, out_endpoint); |
---|
.. | .. |
---|
197 | 191 | goto out; |
---|
198 | 192 | } |
---|
199 | 193 | |
---|
200 | | - pg = get_order(read_size); |
---|
201 | | - sk->s = (void *) __get_free_pages(GFP_KERNEL|__GFP_COMP|__GFP_ZERO| |
---|
202 | | - __GFP_NOWARN, pg); |
---|
| 194 | + sk->s = alloc_pages_exact(read_size, |
---|
| 195 | + GFP_KERNEL | __GFP_ZERO | __GFP_NOWARN); |
---|
203 | 196 | if (!sk->s) { |
---|
204 | | - snd_printk(KERN_WARNING "couldn't __get_free_pages()\n"); |
---|
| 197 | + pr_warn("us122l: couldn't allocate read buffer\n"); |
---|
205 | 198 | goto out; |
---|
206 | 199 | } |
---|
207 | 200 | sk->s->cfg.version = USB_STREAM_INTERFACE_VERSION; |
---|
.. | .. |
---|
216 | 209 | sk->s->period_size = frame_size * period_frames; |
---|
217 | 210 | |
---|
218 | 211 | sk->s->write_size = write_size; |
---|
219 | | - pg = get_order(write_size); |
---|
220 | 212 | |
---|
221 | | - sk->write_page = |
---|
222 | | - (void *)__get_free_pages(GFP_KERNEL|__GFP_COMP|__GFP_ZERO| |
---|
223 | | - __GFP_NOWARN, pg); |
---|
| 213 | + sk->write_page = alloc_pages_exact(write_size, |
---|
| 214 | + GFP_KERNEL | __GFP_ZERO | __GFP_NOWARN); |
---|
224 | 215 | if (!sk->write_page) { |
---|
225 | | - snd_printk(KERN_WARNING "couldn't __get_free_pages()\n"); |
---|
| 216 | + pr_warn("us122l: couldn't allocate write buffer\n"); |
---|
226 | 217 | usb_stream_free(sk); |
---|
227 | 218 | return NULL; |
---|
228 | 219 | } |
---|