mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-13 20:59:37 +02:00
usb: gadget: u_audio: Check return codes from usb_ep_enable and config_ep_by_speed.
commit76a7bfc445
upstream. These functions can fail if descriptors are malformed, or missing, for the selected USB speed. Fixes:eb9fecb9e6
("usb: gadget: f_uac2: split out audio core") Fixes:24f779dac8
("usb: gadget: f_uac2/u_audio: add feedback endpoint support") Cc: stable@vger.kernel.org Signed-off-by: Chris Wulff <crwulff@gmail.com> Link: https://lore.kernel.org/r/20240721192314.3532697-2-crwulff@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
54b7f68025
commit
d67546814d
|
@ -592,16 +592,25 @@ int u_audio_start_capture(struct g_audio *audio_dev)
|
||||||
struct usb_ep *ep, *ep_fback;
|
struct usb_ep *ep, *ep_fback;
|
||||||
struct uac_rtd_params *prm;
|
struct uac_rtd_params *prm;
|
||||||
struct uac_params *params = &audio_dev->params;
|
struct uac_params *params = &audio_dev->params;
|
||||||
int req_len, i;
|
int req_len, i, ret;
|
||||||
|
|
||||||
prm = &uac->c_prm;
|
prm = &uac->c_prm;
|
||||||
dev_dbg(dev, "start capture with rate %d\n", prm->srate);
|
dev_dbg(dev, "start capture with rate %d\n", prm->srate);
|
||||||
ep = audio_dev->out_ep;
|
ep = audio_dev->out_ep;
|
||||||
config_ep_by_speed(gadget, &audio_dev->func, ep);
|
ret = config_ep_by_speed(gadget, &audio_dev->func, ep);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(dev, "config_ep_by_speed for out_ep failed (%d)\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
req_len = ep->maxpacket;
|
req_len = ep->maxpacket;
|
||||||
|
|
||||||
prm->ep_enabled = true;
|
prm->ep_enabled = true;
|
||||||
usb_ep_enable(ep);
|
ret = usb_ep_enable(ep);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(dev, "usb_ep_enable failed for out_ep (%d)\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < params->req_number; i++) {
|
for (i = 0; i < params->req_number; i++) {
|
||||||
if (!prm->reqs[i]) {
|
if (!prm->reqs[i]) {
|
||||||
|
@ -629,9 +638,18 @@ int u_audio_start_capture(struct g_audio *audio_dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Setup feedback endpoint */
|
/* Setup feedback endpoint */
|
||||||
config_ep_by_speed(gadget, &audio_dev->func, ep_fback);
|
ret = config_ep_by_speed(gadget, &audio_dev->func, ep_fback);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(dev, "config_ep_by_speed in_ep_fback failed (%d)\n", ret);
|
||||||
|
return ret; // TODO: Clean up out_ep
|
||||||
|
}
|
||||||
|
|
||||||
prm->fb_ep_enabled = true;
|
prm->fb_ep_enabled = true;
|
||||||
usb_ep_enable(ep_fback);
|
ret = usb_ep_enable(ep_fback);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(dev, "usb_ep_enable failed for in_ep_fback (%d)\n", ret);
|
||||||
|
return ret; // TODO: Clean up out_ep
|
||||||
|
}
|
||||||
req_len = ep_fback->maxpacket;
|
req_len = ep_fback->maxpacket;
|
||||||
|
|
||||||
req_fback = usb_ep_alloc_request(ep_fback, GFP_ATOMIC);
|
req_fback = usb_ep_alloc_request(ep_fback, GFP_ATOMIC);
|
||||||
|
@ -687,13 +705,17 @@ int u_audio_start_playback(struct g_audio *audio_dev)
|
||||||
struct uac_params *params = &audio_dev->params;
|
struct uac_params *params = &audio_dev->params;
|
||||||
unsigned int factor;
|
unsigned int factor;
|
||||||
const struct usb_endpoint_descriptor *ep_desc;
|
const struct usb_endpoint_descriptor *ep_desc;
|
||||||
int req_len, i;
|
int req_len, i, ret;
|
||||||
unsigned int p_pktsize;
|
unsigned int p_pktsize;
|
||||||
|
|
||||||
prm = &uac->p_prm;
|
prm = &uac->p_prm;
|
||||||
dev_dbg(dev, "start playback with rate %d\n", prm->srate);
|
dev_dbg(dev, "start playback with rate %d\n", prm->srate);
|
||||||
ep = audio_dev->in_ep;
|
ep = audio_dev->in_ep;
|
||||||
config_ep_by_speed(gadget, &audio_dev->func, ep);
|
ret = config_ep_by_speed(gadget, &audio_dev->func, ep);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(dev, "config_ep_by_speed for in_ep failed (%d)\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ep_desc = ep->desc;
|
ep_desc = ep->desc;
|
||||||
/*
|
/*
|
||||||
|
@ -720,7 +742,11 @@ int u_audio_start_playback(struct g_audio *audio_dev)
|
||||||
uac->p_residue_mil = 0;
|
uac->p_residue_mil = 0;
|
||||||
|
|
||||||
prm->ep_enabled = true;
|
prm->ep_enabled = true;
|
||||||
usb_ep_enable(ep);
|
ret = usb_ep_enable(ep);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(dev, "usb_ep_enable failed for in_ep (%d)\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < params->req_number; i++) {
|
for (i = 0; i < params->req_number; i++) {
|
||||||
if (!prm->reqs[i]) {
|
if (!prm->reqs[i]) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user