On Fri, 30 Apr 2010, Matthew Wilcox wrote: > On Fri, Apr 30, 2010 at 12:02:07PM -0400, Alan Stern wrote: > > I agree. The second patch will be pretty straightforward now, but > > there are still some simplifications to be made in the USB > > scatter-gather and DMA-mapping code that will touch some of the same > > lines of code. If you would like to update your patch to match Greg's > > current tree, I can base the upcoming changes on it. > > How's this version? It builds ... I haven't boot-tested it. > > diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c > index 3aaee28..f642127 100644 > --- a/drivers/usb/core/hcd.c > +++ b/drivers/usb/core/hcd.c > @@ -1278,7 +1278,7 @@ static void unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb) > dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; > if (urb->transfer_flags & URB_DMA_MAP_SG) > dma_unmap_sg(hcd->self.controller, > - urb->sg->sg, > + urb->sg, > urb->num_sgs, > dir); > else if (urb->transfer_flags & URB_DMA_MAP_PAGE) > @@ -1347,7 +1347,7 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, > if (urb->num_sgs) { > int n = dma_map_sg( > hcd->self.controller, > - urb->sg->sg, > + urb->sg, > urb->num_sgs, > dir); > if (n <= 0) > @@ -1360,9 +1360,7 @@ static int map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, > URB_DMA_SG_COMBINED; > } > } else if (urb->sg) { > - struct scatterlist *sg; > - > - sg = (struct scatterlist *) urb->sg; > + struct scatterlist *sg = urb->sg; It would be nice to have a blank line here. > urb->transfer_dma = dma_map_page( > hcd->self.controller, > sg_page(sg), > diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c > index d8329eb..63919b8 100644 > --- a/drivers/usb/core/message.c > +++ b/drivers/usb/core/message.c > @@ -413,7 +413,7 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev, > sg->length; > } > } > - io->urbs[0]->sg = io; > + io->urbs[0]->sg = sg; > io->urbs[0]->num_sgs = io->entries; > io->entries = 1; > } else { > @@ -454,7 +454,7 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev, > } > io->urbs[i]->transfer_buffer_length = len; > > - io->urbs[i]->sg = (struct usb_sg_request *) sg; > + io->urbs[i]->sg = sg; > } > io->urbs[--i]->transfer_flags &= ~URB_NO_INTERRUPT; > } > diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c > index 8952177..11a79c4 100644 > --- a/drivers/usb/host/ehci-q.c > +++ b/drivers/usb/host/ehci-q.c > @@ -663,7 +663,7 @@ qh_urb_transaction ( > */ > i = urb->num_sgs; > if (len > 0 && i > 0) { > - sg = urb->sg->sg; > + sg = urb->sg; > buf = sg_dma_address(sg); > > /* urb->transfer_buffer_length may be smaller than the > diff --git a/drivers/usb/host/whci/qset.c b/drivers/usb/host/whci/qset.c > index b388dd1..ab5a14f 100644 > --- a/drivers/usb/host/whci/qset.c > +++ b/drivers/usb/host/whci/qset.c > @@ -443,7 +443,7 @@ static int qset_add_urb_sg(struct whc *whc, struct whc_qset *qset, struct urb *u > > remaining = urb->transfer_buffer_length; > > - for_each_sg(urb->sg->sg, sg, urb->num_sgs, i) { > + for_each_sg(urb->sg, sg, urb->num_sgs, i) { > dma_addr_t dma_addr; > size_t dma_remaining; > dma_addr_t sp, ep; > @@ -561,7 +561,7 @@ static int qset_add_urb_sg_linearize(struct whc *whc, struct whc_qset *qset, > > remaining = urb->transfer_buffer_length; > > - for_each_sg(urb->sg->sg, sg, urb->sg->nents, i) { > + for_each_sg(urb->sg, sg, urb->num_sgs, i) { > size_t len; > size_t sg_remaining; > void *orig; > diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c > index 084b47f..1582d50 100644 > --- a/drivers/usb/host/xhci-ring.c > +++ b/drivers/usb/host/xhci-ring.c > @@ -1764,7 +1764,7 @@ static unsigned int count_sg_trbs_needed(struct xhci_hcd *xhci, struct urb *urb) > > xhci_dbg(xhci, "count sg list trbs: \n"); > num_trbs = 0; > - for_each_sg(urb->sg->sg, sg, num_sgs, i) { > + for_each_sg(urb->sg, sg, num_sgs, i) { > unsigned int previous_total_trbs = num_trbs; > unsigned int len = sg_dma_len(sg); > > @@ -1927,7 +1927,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, > * the amount of memory allocated for this scatter-gather list. > * 3. TRBs buffers can't cross 64KB boundaries. > */ > - sg = urb->sg->sg; > + sg = urb->sg; > addr = (u64) sg_dma_address(sg); > this_sg_len = sg_dma_len(sg); > trb_buff_len = TRB_MAX_BUFF_SIZE - > diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c > index 8a7968d..e7fa364 100644 > --- a/drivers/usb/mon/mon_bin.c > +++ b/drivers/usb/mon/mon_bin.c > @@ -422,7 +422,7 @@ static unsigned int mon_bin_get_data(const struct mon_reader_bin *rp, > } > > /* Copy up to the first non-addressable segment */ > - for_each_sg(urb->sg->sg, sg, urb->num_sgs, i) { > + for_each_sg(urb->sg, sg, urb->num_sgs, i) { > if (length == 0 || PageHighMem(sg_page(sg))) > break; > this_len = min_t(unsigned int, sg->length, length); > diff --git a/drivers/usb/mon/mon_text.c b/drivers/usb/mon/mon_text.c > index d562602..a545d65 100644 > --- a/drivers/usb/mon/mon_text.c > +++ b/drivers/usb/mon/mon_text.c > @@ -159,7 +159,7 @@ static inline char mon_text_get_data(struct mon_event_text *ep, struct urb *urb, > if (src == NULL) > return 'Z'; /* '0' would be not as pretty. */ > } else { > - struct scatterlist *sg = urb->sg->sg; > + struct scatterlist *sg = urb->sg; > > if (PageHighMem(sg_page(sg))) > return 'D'; > diff --git a/include/linux/usb.h b/include/linux/usb.h > index 599ac15..eb217f4 100644 > --- a/include/linux/usb.h > +++ b/include/linux/usb.h > @@ -1214,7 +1214,7 @@ struct urb { > unsigned int transfer_flags; /* (in) URB_SHORT_NOT_OK | ...*/ > void *transfer_buffer; /* (in) associated data buffer */ > dma_addr_t transfer_dma; /* (in) dma addr for transfer_buffer */ > - struct usb_sg_request *sg; /* (in) scatter gather buffer list */ > + struct scatterlist *sg; /* (in) scatter gather buffer list */ > int num_sgs; /* (in) number of entries in the sg list */ > u32 transfer_buffer_length; /* (in) data buffer length */ > u32 actual_length; /* (return) actual transfer length */ I tried it out (not the USB-3 parts, obviously), and it worked fine. Reviewed-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> Tested-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> Alan Stern -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html