Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0ba169af authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman
Browse files

USB: simplify usb_sg_init()



This patch (as1377) simplifies the code in usb_sg_init(), without
changing its functionality.  It also removes a couple of unused fields
from the usb_sg_request structure.

Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent a9914127
Loading
Loading
Loading
Loading
+38 −55
Original line number Diff line number Diff line
@@ -371,79 +371,64 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
	spin_lock_init(&io->lock);
	io->dev = dev;
	io->pipe = pipe;
	io->sg = sg;
	io->nents = nents;
	io->entries = nents;

	/* initialize all the urbs we'll use */
	if (dev->bus->sg_tablesize > 0) {
		io->urbs = kmalloc(sizeof *io->urbs, mem_flags);
		use_sg = true;
		io->entries = 1;
	} else {
		io->urbs = kmalloc(io->entries * sizeof *io->urbs, mem_flags);
		use_sg = false;
		io->entries = nents;
	}

	/* initialize all the urbs we'll use */
	io->urbs = kmalloc(io->entries * sizeof *io->urbs, mem_flags);
	if (!io->urbs)
		goto nomem;

	urb_flags = 0;
	urb_flags = URB_NO_INTERRUPT;
	if (usb_pipein(pipe))
		urb_flags |= URB_SHORT_NOT_OK;

	if (use_sg) {
		io->urbs[0] = usb_alloc_urb(0, mem_flags);
		if (!io->urbs[0]) {
			io->entries = 0;
			goto nomem;
		}

		io->urbs[0]->dev = NULL;
		io->urbs[0]->pipe = pipe;
		io->urbs[0]->interval = period;
		io->urbs[0]->transfer_flags = urb_flags;

		io->urbs[0]->complete = sg_complete;
		io->urbs[0]->context = io;

		/* A length of zero means transfer the whole sg list */
		io->urbs[0]->transfer_buffer_length = length;
		if (length == 0) {
			for_each_sg(sg, sg, io->entries, i) {
				io->urbs[0]->transfer_buffer_length +=
					sg->length;
			}
		}
		io->urbs[0]->sg = sg;
		io->urbs[0]->num_sgs = io->entries;
		io->entries = 1;
	} else {
		urb_flags |= URB_NO_INTERRUPT;
	for_each_sg(sg, sg, io->entries, i) {
		struct urb *urb;
		unsigned len;

			io->urbs[i] = usb_alloc_urb(0, mem_flags);
			if (!io->urbs[i]) {
		urb = usb_alloc_urb(0, mem_flags);
		if (!urb) {
			io->entries = i;
			goto nomem;
		}
		io->urbs[i] = urb;

			io->urbs[i]->dev = NULL;
			io->urbs[i]->pipe = pipe;
			io->urbs[i]->interval = period;
			io->urbs[i]->transfer_flags = urb_flags;
		urb->dev = NULL;
		urb->pipe = pipe;
		urb->interval = period;
		urb->transfer_flags = urb_flags;
		urb->complete = sg_complete;
		urb->context = io;
		urb->sg = sg;

			io->urbs[i]->complete = sg_complete;
			io->urbs[i]->context = io;
		if (use_sg) {
			/* There is no single transfer buffer */
			urb->transfer_buffer = NULL;
			urb->num_sgs = nents;

			/* A length of zero means transfer the whole sg list */
			len = length;
			if (len == 0) {
				for_each_sg(sg, sg, nents, i)
					len += sg->length;
			}
		} else {
			/*
			 * Some systems can't use DMA; they use PIO instead.
			 * For their sakes, transfer_buffer is set whenever
			 * possible.
			 */
			if (!PageHighMem(sg_page(sg)))
				io->urbs[i]->transfer_buffer = sg_virt(sg);
				urb->transfer_buffer = sg_virt(sg);
			else
				io->urbs[i]->transfer_buffer = NULL;
				urb->transfer_buffer = NULL;

			len = sg->length;
			if (length) {
@@ -452,12 +437,10 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
				if (length == 0)
					io->entries = i + 1;
			}
			io->urbs[i]->transfer_buffer_length = len;

			io->urbs[i]->sg = sg;
		}
		io->urbs[--i]->transfer_flags &= ~URB_NO_INTERRUPT;
		urb->transfer_buffer_length = len;
	}
	io->urbs[--i]->transfer_flags &= ~URB_NO_INTERRUPT;

	/* transaction state */
	io->count = io->entries;
+0 −2
Original line number Diff line number Diff line
@@ -1469,8 +1469,6 @@ struct usb_sg_request {

	struct usb_device	*dev;
	int			pipe;
	struct scatterlist	*sg;
	int			nents;

	int			entries;
	struct urb		**urbs;