diff options
Diffstat (limited to 'drivers/usb/cdns3/ep0.c')
-rw-r--r-- | drivers/usb/cdns3/ep0.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/usb/cdns3/ep0.c b/drivers/usb/cdns3/ep0.c index 0445da0a5a0c..e71240b386b4 100644 --- a/drivers/usb/cdns3/ep0.c +++ b/drivers/usb/cdns3/ep0.c | |||
@@ -234,9 +234,11 @@ static int cdns3_req_ep0_set_address(struct cdns3_device *priv_dev, | |||
234 | static int cdns3_req_ep0_get_status(struct cdns3_device *priv_dev, | 234 | static int cdns3_req_ep0_get_status(struct cdns3_device *priv_dev, |
235 | struct usb_ctrlrequest *ctrl) | 235 | struct usb_ctrlrequest *ctrl) |
236 | { | 236 | { |
237 | struct cdns3_endpoint *priv_ep; | ||
237 | __le16 *response_pkt; | 238 | __le16 *response_pkt; |
238 | u16 usb_status = 0; | 239 | u16 usb_status = 0; |
239 | u32 recip; | 240 | u32 recip; |
241 | u8 index; | ||
240 | 242 | ||
241 | recip = ctrl->bRequestType & USB_RECIP_MASK; | 243 | recip = ctrl->bRequestType & USB_RECIP_MASK; |
242 | 244 | ||
@@ -262,9 +264,13 @@ static int cdns3_req_ep0_get_status(struct cdns3_device *priv_dev, | |||
262 | case USB_RECIP_INTERFACE: | 264 | case USB_RECIP_INTERFACE: |
263 | return cdns3_ep0_delegate_req(priv_dev, ctrl); | 265 | return cdns3_ep0_delegate_req(priv_dev, ctrl); |
264 | case USB_RECIP_ENDPOINT: | 266 | case USB_RECIP_ENDPOINT: |
265 | /* check if endpoint is stalled */ | 267 | index = cdns3_ep_addr_to_index(ctrl->wIndex); |
268 | priv_ep = priv_dev->eps[index]; | ||
269 | |||
270 | /* check if endpoint is stalled or stall is pending */ | ||
266 | cdns3_select_ep(priv_dev, ctrl->wIndex); | 271 | cdns3_select_ep(priv_dev, ctrl->wIndex); |
267 | if (EP_STS_STALL(readl(&priv_dev->regs->ep_sts))) | 272 | if (EP_STS_STALL(readl(&priv_dev->regs->ep_sts)) || |
273 | (priv_ep->flags & EP_STALL_PENDING)) | ||
268 | usb_status = BIT(USB_ENDPOINT_HALT); | 274 | usb_status = BIT(USB_ENDPOINT_HALT); |
269 | break; | 275 | break; |
270 | default: | 276 | default: |