Lines Matching refs:io

253 static void sg_clean(struct usb_sg_request *io)  in sg_clean()  argument
255 if (io->urbs) { in sg_clean()
256 while (io->entries--) in sg_clean()
257 usb_free_urb(io->urbs[io->entries]); in sg_clean()
258 kfree(io->urbs); in sg_clean()
259 io->urbs = NULL; in sg_clean()
261 io->dev = NULL; in sg_clean()
266 struct usb_sg_request *io = urb->context; in sg_complete() local
269 spin_lock(&io->lock); in sg_complete()
281 if (io->status in sg_complete()
282 && (io->status != -ECONNRESET in sg_complete()
285 dev_err(io->dev->bus->controller, in sg_complete()
287 io->dev->devpath, in sg_complete()
290 status, io->status); in sg_complete()
294 if (io->status == 0 && status && status != -ECONNRESET) { in sg_complete()
297 io->status = status; in sg_complete()
303 spin_unlock(&io->lock); in sg_complete()
304 for (i = 0, found = 0; i < io->entries; i++) { in sg_complete()
305 if (!io->urbs[i] || !io->urbs[i]->dev) in sg_complete()
308 retval = usb_unlink_urb(io->urbs[i]); in sg_complete()
313 dev_err(&io->dev->dev, in sg_complete()
316 } else if (urb == io->urbs[i]) in sg_complete()
319 spin_lock(&io->lock); in sg_complete()
323 io->bytes += urb->actual_length; in sg_complete()
324 io->count--; in sg_complete()
325 if (!io->count) in sg_complete()
326 complete(&io->complete); in sg_complete()
328 spin_unlock(&io->lock); in sg_complete()
359 int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev, in usb_sg_init() argument
367 if (!io || !dev || !sg in usb_sg_init()
373 spin_lock_init(&io->lock); in usb_sg_init()
374 io->dev = dev; in usb_sg_init()
375 io->pipe = pipe; in usb_sg_init()
379 io->entries = 1; in usb_sg_init()
382 io->entries = nents; in usb_sg_init()
386 io->urbs = kmalloc(io->entries * sizeof(*io->urbs), mem_flags); in usb_sg_init()
387 if (!io->urbs) in usb_sg_init()
394 for_each_sg(sg, sg, io->entries, i) { in usb_sg_init()
400 io->entries = i; in usb_sg_init()
403 io->urbs[i] = urb; in usb_sg_init()
410 urb->context = io; in usb_sg_init()
443 io->entries = i + 1; in usb_sg_init()
448 io->urbs[--i]->transfer_flags &= ~URB_NO_INTERRUPT; in usb_sg_init()
451 io->count = io->entries; in usb_sg_init()
452 io->status = 0; in usb_sg_init()
453 io->bytes = 0; in usb_sg_init()
454 init_completion(&io->complete); in usb_sg_init()
458 sg_clean(io); in usb_sg_init()
506 void usb_sg_wait(struct usb_sg_request *io) in usb_sg_wait() argument
509 int entries = io->entries; in usb_sg_wait()
512 spin_lock_irq(&io->lock); in usb_sg_wait()
514 while (i < entries && !io->status) { in usb_sg_wait()
517 io->urbs[i]->dev = io->dev; in usb_sg_wait()
518 retval = usb_submit_urb(io->urbs[i], GFP_ATOMIC); in usb_sg_wait()
523 spin_unlock_irq(&io->lock); in usb_sg_wait()
546 io->urbs[i]->status = retval; in usb_sg_wait()
547 dev_dbg(&io->dev->dev, "%s, submit --> %d\n", in usb_sg_wait()
549 usb_sg_cancel(io); in usb_sg_wait()
551 spin_lock_irq(&io->lock); in usb_sg_wait()
552 if (retval && (io->status == 0 || io->status == -ECONNRESET)) in usb_sg_wait()
553 io->status = retval; in usb_sg_wait()
555 io->count -= entries - i; in usb_sg_wait()
556 if (io->count == 0) in usb_sg_wait()
557 complete(&io->complete); in usb_sg_wait()
558 spin_unlock_irq(&io->lock); in usb_sg_wait()
564 wait_for_completion(&io->complete); in usb_sg_wait()
566 sg_clean(io); in usb_sg_wait()
578 void usb_sg_cancel(struct usb_sg_request *io) in usb_sg_cancel() argument
582 spin_lock_irqsave(&io->lock, flags); in usb_sg_cancel()
585 if (!io->status) { in usb_sg_cancel()
588 io->status = -ECONNRESET; in usb_sg_cancel()
589 spin_unlock(&io->lock); in usb_sg_cancel()
590 for (i = 0; i < io->entries; i++) { in usb_sg_cancel()
593 if (!io->urbs[i]->dev) in usb_sg_cancel()
595 retval = usb_unlink_urb(io->urbs[i]); in usb_sg_cancel()
600 dev_warn(&io->dev->dev, "%s, unlink --> %d\n", in usb_sg_cancel()
603 spin_lock(&io->lock); in usb_sg_cancel()
605 spin_unlock_irqrestore(&io->lock, flags); in usb_sg_cancel()