This fixes the wMaxPacketSize of the audio gadget so it is in line with USB Audio Format specification - section 2.3.1.2.1 Cc: Jack Pham <jackp@xxxxxxxxxxxxxx> Cc: Pavel Hofman <pavel.hofman@xxxxxxxxxxx> Fixes: e89bb4288378 ("usb: gadget: u_audio: add real feedback implementation") Signed-off-by: Jerome Brunet <jbrunet@xxxxxxxxxxxx> --- There was a mistake in my previous mail, rounding depends on the synchronisation, not the stream direction. drivers/usb/gadget/function/f_uac2.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c index ae29ff2b2b68..c152efa30def 100644 --- a/drivers/usb/gadget/function/f_uac2.c +++ b/drivers/usb/gadget/function/f_uac2.c @@ -554,7 +554,7 @@ static int set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts, struct usb_endpoint_descriptor *ep_desc, enum usb_device_speed speed, bool is_playback) { - int chmask, srate, ssize; + int chmask, srate, ssize, spf; u16 max_size_bw, max_size_ep; unsigned int factor; @@ -584,11 +584,12 @@ static int set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts, ssize = uac2_opts->c_ssize; } - if (!is_playback && (uac2_opts->c_sync == USB_ENDPOINT_SYNC_ASYNC)) - srate = srate * (1000 + uac2_opts->fb_max) / 1000; + if (uac2_opts->c_sync == USB_ENDPOINT_SYNC_ADAPTIVE) + spf = DIV_ROUND_UP(srate, factor / (1 << (ep_desc->bInterval - 1))); + else + spf = (srate / (factor / (1 << (ep_desc->bInterval - 1)))) + 1; - max_size_bw = num_channels(chmask) * ssize * - DIV_ROUND_UP(srate, factor / (1 << (ep_desc->bInterval - 1))); + max_size_bw = num_channels(chmask) * ssize * spf; ep_desc->wMaxPacketSize = cpu_to_le16(min_t(u16, max_size_bw, max_size_ep)); -- 2.33.0