Source
152
152
spin_unlock_irq(&dev->err_lock);
153
153
154
154
mutex_unlock(&dev->io_mutex);
155
155
156
156
return res;
157
157
}
158
158
159
159
static void skel_read_bulk_callback(struct urb *urb)
160
160
{
161
161
struct usb_skel *dev;
162
+
unsigned long flags;
162
163
163
164
dev = urb->context;
164
165
165
-
spin_lock(&dev->err_lock);
166
+
spin_lock_irqsave(&dev->err_lock, flags);
166
167
/* sync/async unlink faults aren't errors */
167
168
if (urb->status) {
168
169
if (!(urb->status == -ENOENT ||
169
170
urb->status == -ECONNRESET ||
170
171
urb->status == -ESHUTDOWN))
171
172
dev_err(&dev->interface->dev,
172
173
"%s - nonzero write bulk status received: %d\n",
173
174
__func__, urb->status);
174
175
175
176
dev->errors = urb->status;
176
177
} else {
177
178
dev->bulk_in_filled = urb->actual_length;
178
179
}
179
180
dev->ongoing_read = 0;
180
-
spin_unlock(&dev->err_lock);
181
+
spin_unlock_irqrestore(&dev->err_lock, flags);
181
182
182
183
wake_up_interruptible(&dev->bulk_in_wait);
183
184
}
184
185
185
186
static int skel_do_read_io(struct usb_skel *dev, size_t count)
186
187
{
187
188
int rv;
188
189
189
190
/* prepare a read */
190
191
usb_fill_bulk_urb(dev->bulk_in_urb,
324
325
goto retry;
325
326
}
326
327
exit:
327
328
mutex_unlock(&dev->io_mutex);
328
329
return rv;
329
330
}
330
331
331
332
static void skel_write_bulk_callback(struct urb *urb)
332
333
{
333
334
struct usb_skel *dev;
335
+
unsigned long flags;
334
336
335
337
dev = urb->context;
336
338
337
339
/* sync/async unlink faults aren't errors */
338
340
if (urb->status) {
339
341
if (!(urb->status == -ENOENT ||
340
342
urb->status == -ECONNRESET ||
341
343
urb->status == -ESHUTDOWN))
342
344
dev_err(&dev->interface->dev,
343
345
"%s - nonzero write bulk status received: %d\n",
344
346
__func__, urb->status);
345
347
346
-
spin_lock(&dev->err_lock);
348
+
spin_lock_irqsave(&dev->err_lock, flags);
347
349
dev->errors = urb->status;
348
-
spin_unlock(&dev->err_lock);
350
+
spin_unlock_irqrestore(&dev->err_lock, flags);
349
351
}
350
352
351
353
/* free up our allocated buffer */
352
354
usb_free_coherent(urb->dev, urb->transfer_buffer_length,
353
355
urb->transfer_buffer, urb->transfer_dma);
354
356
up(&dev->limit_sem);
355
357
}
356
358
357
359
static ssize_t skel_write(struct file *file, const char *user_buffer,
358
360
size_t count, loff_t *ppos)