diff options
Diffstat (limited to 'drivers/usb/mtu3')
| -rw-r--r-- | drivers/usb/mtu3/mtu3_gadget.c | 12 | ||||
| -rw-r--r-- | drivers/usb/mtu3/mtu3_qmu.c | 7 | 
2 files changed, 16 insertions, 3 deletions
| diff --git a/drivers/usb/mtu3/mtu3_gadget.c b/drivers/usb/mtu3/mtu3_gadget.c index a9a65b4bbfed..9977600616d7 100644 --- a/drivers/usb/mtu3/mtu3_gadget.c +++ b/drivers/usb/mtu3/mtu3_gadget.c @@ -77,7 +77,7 @@ static int mtu3_ep_enable(struct mtu3_ep *mep)  		if (usb_endpoint_xfer_int(desc) ||  				usb_endpoint_xfer_isoc(desc)) {  			interval = desc->bInterval; -			interval = clamp_val(interval, 1, 16) - 1; +			interval = clamp_val(interval, 1, 16);  			if (usb_endpoint_xfer_isoc(desc) && comp_desc)  				mult = comp_desc->bmAttributes;  		} @@ -89,10 +89,17 @@ static int mtu3_ep_enable(struct mtu3_ep *mep)  		if (usb_endpoint_xfer_isoc(desc) ||  				usb_endpoint_xfer_int(desc)) {  			interval = desc->bInterval; -			interval = clamp_val(interval, 1, 16) - 1; +			interval = clamp_val(interval, 1, 16);  			mult = usb_endpoint_maxp_mult(desc) - 1;  		}  		break; +	case USB_SPEED_FULL: +		if (usb_endpoint_xfer_isoc(desc)) +			interval = clamp_val(desc->bInterval, 1, 16); +		else if (usb_endpoint_xfer_int(desc)) +			interval = clamp_val(desc->bInterval, 1, 255); + +		break;  	default:  		break; /*others are ignored */  	} @@ -235,6 +242,7 @@ struct usb_request *mtu3_alloc_request(struct usb_ep *ep, gfp_t gfp_flags)  	mreq->request.dma = DMA_ADDR_INVALID;  	mreq->epnum = mep->epnum;  	mreq->mep = mep; +	INIT_LIST_HEAD(&mreq->list);  	trace_mtu3_alloc_request(mreq);  	return &mreq->request; diff --git a/drivers/usb/mtu3/mtu3_qmu.c b/drivers/usb/mtu3/mtu3_qmu.c index 3f414f91b589..2ea3157ddb6e 100644 --- a/drivers/usb/mtu3/mtu3_qmu.c +++ b/drivers/usb/mtu3/mtu3_qmu.c @@ -273,6 +273,8 @@ static int mtu3_prepare_tx_gpd(struct mtu3_ep *mep, struct mtu3_request *mreq)  			gpd->dw3_info |= cpu_to_le32(GPD_EXT_FLAG_ZLP);  	} +	/* prevent reorder, make sure GPD's HWO is set last */ +	mb();  	gpd->dw0_info |= cpu_to_le32(GPD_FLAGS_IOC | GPD_FLAGS_HWO);  	mreq->gpd = gpd; @@ -306,6 +308,8 @@ static int mtu3_prepare_rx_gpd(struct mtu3_ep *mep, struct mtu3_request *mreq)  	gpd->next_gpd = cpu_to_le32(lower_32_bits(enq_dma));  	ext_addr |= GPD_EXT_NGP(mtu, upper_32_bits(enq_dma));  	gpd->dw3_info = cpu_to_le32(ext_addr); +	/* prevent reorder, make sure GPD's HWO is set last */ +	mb();  	gpd->dw0_info |= cpu_to_le32(GPD_FLAGS_IOC | GPD_FLAGS_HWO);  	mreq->gpd = gpd; @@ -445,7 +449,8 @@ static void qmu_tx_zlp_error_handler(struct mtu3 *mtu, u8 epnum)  		return;  	}  	mtu3_setbits(mbase, MU3D_EP_TXCR0(mep->epnum), TX_TXPKTRDY); - +	/* prevent reorder, make sure GPD's HWO is set last */ +	mb();  	/* by pass the current GDP */  	gpd_current->dw0_info |= cpu_to_le32(GPD_FLAGS_BPS | GPD_FLAGS_HWO); |