diff options
| author | Felipe Balbi <balbi@ti.com> | 2012-02-06 11:04:53 +0200 | 
|---|---|---|
| committer | Felipe Balbi <balbi@ti.com> | 2012-02-13 16:02:06 +0200 | 
| commit | f6bafc6a1c9d58f0c234ac5052b9c09b0747348c (patch) | |
| tree | df6da3498cc47ea3c1cfe43d7b35cc72969568af /drivers/usb/dwc3/ep0.c | |
| parent | 3b637367ae40b6d3c20e30cb0cdd059e67bbf848 (diff) | |
| download | olio-linux-3.10-f6bafc6a1c9d58f0c234ac5052b9c09b0747348c.tar.xz olio-linux-3.10-f6bafc6a1c9d58f0c234ac5052b9c09b0747348c.zip  | |
usb: dwc3: convert TRBs into bitshifts
this will get rid of a useless memcpy on
IRQ handling, thus improving driver performance.
Tested with OMAP5430 running g_mass_storage on
SuperSpeed and HighSpeed.
Note that we are removing the little endian access
of the TRB and all accesses will be in System endianness,
if there happens to be a system in BE, bit 12 of GSBUSCFG0
should be set so that HW does byte invariant BE accesses
when fetching TRBs.
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/dwc3/ep0.c')
| -rw-r--r-- | drivers/usb/dwc3/ep0.c | 34 | 
1 files changed, 16 insertions, 18 deletions
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index c20e30c8b69..5a067090f27 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c @@ -76,8 +76,7 @@ static int dwc3_ep0_start_trans(struct dwc3 *dwc, u8 epnum, dma_addr_t buf_dma,  		u32 len, u32 type)  {  	struct dwc3_gadget_ep_cmd_params params; -	struct dwc3_trb_hw		*trb_hw; -	struct dwc3_trb			trb; +	struct dwc3_trb			*trb;  	struct dwc3_ep			*dep;  	int				ret; @@ -88,19 +87,17 @@ static int dwc3_ep0_start_trans(struct dwc3 *dwc, u8 epnum, dma_addr_t buf_dma,  		return 0;  	} -	trb_hw = dwc->ep0_trb; -	memset(&trb, 0, sizeof(trb)); +	trb = dwc->ep0_trb; -	trb.trbctl = type; -	trb.bplh = buf_dma; -	trb.length = len; +	trb->bpl = lower_32_bits(buf_dma); +	trb->bph = upper_32_bits(buf_dma); +	trb->size = len; +	trb->ctrl = type; -	trb.hwo	= 1; -	trb.lst	= 1; -	trb.ioc	= 1; -	trb.isp_imi = 1; - -	dwc3_trb_to_hw(&trb, trb_hw); +	trb->ctrl |= (DWC3_TRB_CTRL_HWO +			| DWC3_TRB_CTRL_LST +			| DWC3_TRB_CTRL_IOC +			| DWC3_TRB_CTRL_ISP_IMI);  	memset(¶ms, 0, sizeof(params));  	params.param0 = upper_32_bits(dwc->ep0_trb_addr); @@ -544,9 +541,10 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc,  {  	struct dwc3_request	*r = NULL;  	struct usb_request	*ur; -	struct dwc3_trb		trb; +	struct dwc3_trb		*trb;  	struct dwc3_ep		*ep0;  	u32			transferred; +	u32			length;  	u8			epnum;  	epnum = event->endpoint_number; @@ -557,16 +555,16 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc,  	r = next_request(&ep0->request_list);  	ur = &r->request; -	dwc3_trb_to_nat(dwc->ep0_trb, &trb); +	trb = dwc->ep0_trb; +	length = trb->size & DWC3_TRB_SIZE_MASK;  	if (dwc->ep0_bounced) { -  		transferred = min_t(u32, ur->length, -				ep0->endpoint.maxpacket - trb.length); +				ep0->endpoint.maxpacket - length);  		memcpy(ur->buf, dwc->ep0_bounce, transferred);  		dwc->ep0_bounced = false;  	} else { -		transferred = ur->length - trb.length; +		transferred = ur->length - length;  		ur->actual += transferred;  	}  |