mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-15 13:15:57 +00:00
staging: most: usb: fix calculation of the extra_len
The final size of the buffer used for the streaming transfer consists of the size for the user payload (buffer_size) and the size for the gaps needed by the controller (extra_len). The current implementation of the hdm_configure_channel() corrects the buffer size down to the next appropriate for the hardware value, that is the whole number of frames, but uses the old unaligned value to calculate the extra_len. Current patch fixes the described problem. Signed-off-by: Andrey Shvetsov <andrey.shvetsov@k2l.de> Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
2c4aaa1fff
commit
f500192890
@ -649,8 +649,6 @@ static int hdm_configure_channel(struct most_interface *iface, int channel,
|
||||
{
|
||||
unsigned int num_frames;
|
||||
unsigned int frame_size;
|
||||
unsigned int temp_size;
|
||||
unsigned int tail_space;
|
||||
struct most_dev *mdev = to_mdev(iface);
|
||||
struct device *dev = &mdev->usb_device->dev;
|
||||
|
||||
@ -685,7 +683,6 @@ static int hdm_configure_channel(struct most_interface *iface, int channel,
|
||||
}
|
||||
|
||||
mdev->padding_active[channel] = true;
|
||||
temp_size = conf->buffer_size;
|
||||
|
||||
frame_size = get_stream_frame_size(conf);
|
||||
if (frame_size == 0 || frame_size > USB_MTU) {
|
||||
@ -693,25 +690,19 @@ static int hdm_configure_channel(struct most_interface *iface, int channel,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (conf->buffer_size % frame_size) {
|
||||
u16 tmp_val;
|
||||
num_frames = conf->buffer_size / frame_size;
|
||||
|
||||
tmp_val = conf->buffer_size / frame_size;
|
||||
conf->buffer_size = tmp_val * frame_size;
|
||||
dev_notice(dev,
|
||||
"Channel %d - rounding buffer size to %d bytes, channel config says %d bytes\n",
|
||||
channel,
|
||||
conf->buffer_size,
|
||||
temp_size);
|
||||
if (conf->buffer_size % frame_size) {
|
||||
u16 old_size = conf->buffer_size;
|
||||
|
||||
conf->buffer_size = num_frames * frame_size;
|
||||
dev_warn(dev, "%s: fixed buffer size (%d -> %d)\n",
|
||||
mdev->suffix[channel], old_size, conf->buffer_size);
|
||||
}
|
||||
|
||||
num_frames = conf->buffer_size / frame_size;
|
||||
tail_space = num_frames * (USB_MTU - frame_size);
|
||||
temp_size += tail_space;
|
||||
|
||||
/* calculate extra length to comply w/ HW padding */
|
||||
conf->extra_len = (DIV_ROUND_UP(temp_size, USB_MTU) * USB_MTU)
|
||||
- conf->buffer_size;
|
||||
conf->extra_len = num_frames * (USB_MTU - frame_size);
|
||||
|
||||
exit:
|
||||
mdev->conf[channel] = *conf;
|
||||
if (conf->data_type == MOST_CH_ASYNC) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user