summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorFelipe Balbi <balbi@ti.com>2011-09-30 11:58:36 +0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-10-04 21:25:50 +0400
commit2646021e1d5235c6c2143d27405fb057e5560d2b (patch)
treeec5d96210bd7f8f364d505aa02d97077f5025ad0 /drivers/usb
parent5b253d88cc6c65a23cefc457a5a4ef139913c5fc (diff)
downloadlinux-2646021e1d5235c6c2143d27405fb057e5560d2b.tar.xz
usb: dwc3: ep0: Make USB30CV happy with SetAddress
According to USB 3.0 Specification, a SetAddress() while device is in Configured State has an unspecified behavior (see Section 9.4.6). Still USB30CV wasn't happy with my Stall reply. To make that thing happy, just accept the SetAddress() always. No problems have been observed thus far. Signed-off-by: Felipe Balbi <balbi@ti.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/dwc3/ep0.c31
1 files changed, 9 insertions, 22 deletions
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
index b66d96905728..e058961a547c 100644
--- a/drivers/usb/dwc3/ep0.c
+++ b/drivers/usb/dwc3/ep0.c
@@ -421,7 +421,6 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc,
static int dwc3_ep0_set_address(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
{
- int ret = 0;
u32 addr;
u32 reg;
@@ -429,29 +428,17 @@ static int dwc3_ep0_set_address(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
if (addr > 127)
return -EINVAL;
- switch (dwc->dev_state) {
- case DWC3_DEFAULT_STATE:
- case DWC3_ADDRESS_STATE:
- /*
- * Not sure if we should program DevAddr now or later
- */
- reg = dwc3_readl(dwc->regs, DWC3_DCFG);
- reg &= ~(DWC3_DCFG_DEVADDR_MASK);
- reg |= DWC3_DCFG_DEVADDR(addr);
- dwc3_writel(dwc->regs, DWC3_DCFG, reg);
-
- if (addr)
- dwc->dev_state = DWC3_ADDRESS_STATE;
- else
- dwc->dev_state = DWC3_DEFAULT_STATE;
- break;
+ reg = dwc3_readl(dwc->regs, DWC3_DCFG);
+ reg &= ~(DWC3_DCFG_DEVADDR_MASK);
+ reg |= DWC3_DCFG_DEVADDR(addr);
+ dwc3_writel(dwc->regs, DWC3_DCFG, reg);
- case DWC3_CONFIGURED_STATE:
- ret = -EINVAL;
- break;
- }
+ if (addr)
+ dwc->dev_state = DWC3_ADDRESS_STATE;
+ else
+ dwc->dev_state = DWC3_DEFAULT_STATE;
- return ret;
+ return 0;
}
static int dwc3_ep0_delegate_req(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)