Commit f5001928 authored by Andrey Shvetsov's avatar Andrey Shvetsov Committed by Greg Kroah-Hartman

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: default avatarAndrey Shvetsov <andrey.shvetsov@k2l.de>
Signed-off-by: default avatarChristian Gromm <christian.gromm@microchip.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2c4aaa1f
...@@ -649,8 +649,6 @@ static int hdm_configure_channel(struct most_interface *iface, int channel, ...@@ -649,8 +649,6 @@ static int hdm_configure_channel(struct most_interface *iface, int channel,
{ {
unsigned int num_frames; unsigned int num_frames;
unsigned int frame_size; unsigned int frame_size;
unsigned int temp_size;
unsigned int tail_space;
struct most_dev *mdev = to_mdev(iface); struct most_dev *mdev = to_mdev(iface);
struct device *dev = &mdev->usb_device->dev; struct device *dev = &mdev->usb_device->dev;
...@@ -685,7 +683,6 @@ static int hdm_configure_channel(struct most_interface *iface, int channel, ...@@ -685,7 +683,6 @@ static int hdm_configure_channel(struct most_interface *iface, int channel,
} }
mdev->padding_active[channel] = true; mdev->padding_active[channel] = true;
temp_size = conf->buffer_size;
frame_size = get_stream_frame_size(conf); frame_size = get_stream_frame_size(conf);
if (frame_size == 0 || frame_size > USB_MTU) { if (frame_size == 0 || frame_size > USB_MTU) {
...@@ -693,25 +690,19 @@ static int hdm_configure_channel(struct most_interface *iface, int channel, ...@@ -693,25 +690,19 @@ static int hdm_configure_channel(struct most_interface *iface, int channel,
return -EINVAL; return -EINVAL;
} }
num_frames = conf->buffer_size / frame_size;
if (conf->buffer_size % frame_size) { if (conf->buffer_size % frame_size) {
u16 tmp_val; u16 old_size = conf->buffer_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);
}
num_frames = conf->buffer_size / frame_size; conf->buffer_size = num_frames * frame_size;
tail_space = num_frames * (USB_MTU - frame_size); dev_warn(dev, "%s: fixed buffer size (%d -> %d)\n",
temp_size += tail_space; mdev->suffix[channel], old_size, conf->buffer_size);
}
/* calculate extra length to comply w/ HW padding */ /* calculate extra length to comply w/ HW padding */
conf->extra_len = (DIV_ROUND_UP(temp_size, USB_MTU) * USB_MTU) conf->extra_len = num_frames * (USB_MTU - frame_size);
- conf->buffer_size;
exit: exit:
mdev->conf[channel] = *conf; mdev->conf[channel] = *conf;
if (conf->data_type == MOST_CH_ASYNC) { if (conf->data_type == MOST_CH_ASYNC) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment