Skip to content

Commit

Permalink
staging: most: usb: fix calculation of the extra_len
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Andrey Shvetsov authored and Greg Kroah-Hartman committed Apr 8, 2017
1 parent 2c4aaa1 commit f500192
Showing 1 changed file with 9 additions and 18 deletions.
27 changes: 9 additions & 18 deletions drivers/staging/most/hdm-usb/hdm_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -685,33 +683,26 @@ 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) {
dev_warn(dev, "Misconfig: frame size wrong\n");
return -EINVAL;
}

num_frames = conf->buffer_size / frame_size;

if (conf->buffer_size % frame_size) {
u16 tmp_val;

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);
}
u16 old_size = conf->buffer_size;

num_frames = conf->buffer_size / frame_size;
tail_space = num_frames * (USB_MTU - frame_size);
temp_size += tail_space;
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);
}

/* 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) {
Expand Down

0 comments on commit f500192

Please sign in to comment.