staging: most: usb: fix calculation of the extra_len
authorAndrey Shvetsov <andrey.shvetsov@k2l.de>
Fri, 7 Apr 2017 13:38:38 +0000 (15:38 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 8 Apr 2017 10:41:40 +0000 (12:41 +0200)
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>
drivers/staging/most/hdm-usb/hdm_usb.c

index 65211d1824b72f42f5bacd5e8ededb190d766de3..6e94ee2b4fb3a0ee74654ea8b6ebaddf8504ce97 100644 (file)
@@ -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;
        }
 
+       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) {