| From a37b5c7271033c976d22122887d0a466def77d85 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 2 Aug 2019 13:52:14 +0200 |
| Subject: ALSA: usb-audio: Skip bSynchAddress endpoint check if it is invalid |
| |
| From: Ard van Breemen <ard@kwaak.net> |
| |
| [ Upstream commit 1b34121d9f26d272b0b2334209af6b6fc82d4bf1 ] |
| |
| The Linux kernel assumes that get_endpoint(alts,0) and |
| get_endpoint(alts,1) are eachothers feedback endpoints. |
| To reassure that validity it will test bsynchaddress to comply with that |
| assumption. But if the bsyncaddress is 0 (invalid), it will flag that as |
| a wrong assumption and return an error. |
| Fix: Skip the test if bSynchAddress is 0. |
| Note: those with a valid bSynchAddress should have a code quirck added. |
| |
| Signed-off-by: Ard van Breemen <ard@kwaak.net> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| sound/usb/pcm.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c |
| index 497bad9f27898..9bc995f9b4e17 100644 |
| --- a/sound/usb/pcm.c |
| +++ b/sound/usb/pcm.c |
| @@ -470,6 +470,7 @@ static int set_sync_endpoint(struct snd_usb_substream *subs, |
| } |
| ep = get_endpoint(alts, 1)->bEndpointAddress; |
| if (get_endpoint(alts, 0)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE && |
| + get_endpoint(alts, 0)->bSynchAddress != 0 && |
| ((is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress | USB_DIR_IN)) || |
| (!is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress & ~USB_DIR_IN)))) { |
| dev_err(&dev->dev, |
| -- |
| 2.20.1 |
| |