--- a/drivers/usb/gadget/function/uvc_video.c +++ b/drivers/usb/gadget/function/uvc_video.c @@ int uvcg_video_enable(struct uvc_video *video) { int ret; + if (!video) { + pr_err("uvcg_video_enable: missing video\n"); + return -EINVAL; + } + + if (!video->uvc || !video->uvc->func.config || + !video->uvc->func.config->cdev) { + pr_err("uvcg_video_enable: missing uvc/func/config video=%p uvc=%p\n", + video, video->uvc); + return -ENODEV; + } + if (video->ep == NULL) { uvcg_info(&video->uvc->func, "Video enable failed, device is uninitialized.\n"); return -ENODEV; } + + if (!video->kworker || !video->async_wq) { + uvcg_err(&video->uvc->func, + "Video enable failed, missing worker(s) kworker=%p async_wq=%p\n", + video->kworker, video->async_wq); + return -EINVAL; + } + + if (!video->queue.queue.dev) { + uvcg_err(&video->uvc->func, + "Video enable failed, missing queue device\n"); + return -EINVAL; + } + + uvcg_info(&video->uvc->func, + "Video enable start: video=%p ep=%p kworker=%p async_wq=%p req_size=%u max_payload=%u requests=%u reqs_per_frame=%u use_sg=%u flags=0x%x\n", + video, video->ep, video->kworker, video->async_wq, + video->req_size, video->max_payload_size, + video->uvc_num_requests, video->reqs_per_frame, + video->queue.use_sg, video->queue.flags); /* * Safe to access request related fields without req_lock because