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

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
...@@ -371,79 +371,64 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev, ...@@ -371,79 +371,64 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
spin_lock_init(&io->lock); spin_lock_init(&io->lock);
io->dev = dev; io->dev = dev;
io->pipe = pipe; 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) { if (dev->bus->sg_tablesize > 0) {
io->urbs = kmalloc(sizeof *io->urbs, mem_flags);
use_sg = true; use_sg = true;
io->entries = 1;
} else { } else {
io->urbs = kmalloc(io->entries * sizeof *io->urbs, mem_flags);
use_sg = false; 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) if (!io->urbs)
goto nomem; goto nomem;
urb_flags = 0; urb_flags = URB_NO_INTERRUPT;
if (usb_pipein(pipe)) if (usb_pipein(pipe))
urb_flags |= URB_SHORT_NOT_OK; urb_flags |= URB_SHORT_NOT_OK;
if (use_sg) { for_each_sg(sg, sg, io->entries, i) {
io->urbs[0] = usb_alloc_urb(0, mem_flags); struct urb *urb;
if (!io->urbs[0]) { unsigned len;
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; urb = usb_alloc_urb(0, mem_flags);
io->urbs[0]->context = io; if (!urb) {
io->entries = i;
/* A length of zero means transfer the whole sg list */ goto nomem;
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[i] = urb;
io->urbs[0]->num_sgs = io->entries;
io->entries = 1; urb->dev = NULL;
} else { urb->pipe = pipe;
urb_flags |= URB_NO_INTERRUPT; urb->interval = period;
for_each_sg(sg, sg, io->entries, i) { urb->transfer_flags = urb_flags;
unsigned len; urb->complete = sg_complete;
urb->context = io;
io->urbs[i] = usb_alloc_urb(0, mem_flags); urb->sg = sg;
if (!io->urbs[i]) {
io->entries = i; if (use_sg) {
goto nomem; /* 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 {
io->urbs[i]->dev = NULL;
io->urbs[i]->pipe = pipe;
io->urbs[i]->interval = period;
io->urbs[i]->transfer_flags = urb_flags;
io->urbs[i]->complete = sg_complete;
io->urbs[i]->context = io;
/* /*
* Some systems can't use DMA; they use PIO instead. * Some systems can't use DMA; they use PIO instead.
* For their sakes, transfer_buffer is set whenever * For their sakes, transfer_buffer is set whenever
* possible. * possible.
*/ */
if (!PageHighMem(sg_page(sg))) if (!PageHighMem(sg_page(sg)))
io->urbs[i]->transfer_buffer = sg_virt(sg); urb->transfer_buffer = sg_virt(sg);
else else
io->urbs[i]->transfer_buffer = NULL; urb->transfer_buffer = NULL;
len = sg->length; len = sg->length;
if (length) { if (length) {
...@@ -452,12 +437,10 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev, ...@@ -452,12 +437,10 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
if (length == 0) if (length == 0)
io->entries = i + 1; 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 */ /* transaction state */
io->count = io->entries; io->count = io->entries;
......
...@@ -1469,8 +1469,6 @@ struct usb_sg_request { ...@@ -1469,8 +1469,6 @@ struct usb_sg_request {
struct usb_device *dev; struct usb_device *dev;
int pipe; int pipe;
struct scatterlist *sg;
int nents;
int entries; int entries;
struct urb **urbs; struct urb **urbs;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment