diff options
| -rw-r--r-- | drivers/usb/chipidea/udc.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index dfec5a176315..b93356834bb5 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c | |||
| @@ -949,6 +949,15 @@ static int isr_setup_status_phase(struct ci_hdrc *ci) | |||
| 949 | int retval; | 949 | int retval; |
| 950 | struct ci_hw_ep *hwep; | 950 | struct ci_hw_ep *hwep; |
| 951 | 951 | ||
| 952 | /* | ||
| 953 | * Unexpected USB controller behavior, caused by bad signal integrity | ||
| 954 | * or ground reference problems, can lead to isr_setup_status_phase | ||
| 955 | * being called with ci->status equal to NULL. | ||
| 956 | * If this situation occurs, you should review your USB hardware design. | ||
| 957 | */ | ||
| 958 | if (WARN_ON_ONCE(!ci->status)) | ||
| 959 | return -EPIPE; | ||
| 960 | |||
| 952 | hwep = (ci->ep0_dir == TX) ? ci->ep0out : ci->ep0in; | 961 | hwep = (ci->ep0_dir == TX) ? ci->ep0out : ci->ep0in; |
| 953 | ci->status->context = ci; | 962 | ci->status->context = ci; |
| 954 | ci->status->complete = isr_setup_status_complete; | 963 | ci->status->complete = isr_setup_status_complete; |
