Re: USB changes for UAS

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux