Re: [PATCH] usb: gadget: ncm: Fix endianness of wMaxSegmentSize variable in ecm_desc

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jan 18, 2024 at 7:49 AM Krishna Kurapati
<quic_kriskura@xxxxxxxxxxx> wrote:
>
> Recent commit [1] added support for changing max segment size of the NCM
> interface via configfs. But the value of segment size value stored in
> ncm_opts need to be converted to little endian before saving it in
> ecm_desc. Also while initialising the value of segment size in opts during
> instance allocation, the value ETH_FRAME_LEN needs to be assigned directly
> without any conversion as ETH_FRAME_LEN and the variable max_segment_size
> are native endian. The current implementaion modifies it into little endian
> thus breaking things for big endian targets.
>
> Fix endianness while assigning these variables.
> While at it, fix up some stray spaces in comments added in code.
>
> [1]: https://lore.kernel.org/all/20231221153216.18657-1-quic_kriskura@xxxxxxxxxxx/
>
> Fixes: 1900daeefd3e ("usb: gadget: ncm: Add support to update wMaxSegmentSize via configfs")
> Signed-off-by: Krishna Kurapati <quic_kriskura@xxxxxxxxxxx>
> ---
> Since the patch was tested on ARM based QC devices, no issues were seen
> as these devices were little endian. Thanks to Maciej Żenczykowski for
> pointing it out offline over ACK that the patch breaks functionality for
> big endian devices.
>
>  drivers/usb/gadget/function/f_ncm.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/usb/gadget/function/f_ncm.c b/drivers/usb/gadget/function/f_ncm.c
> index a1575a0ca568..ca5d5f564998 100644
> --- a/drivers/usb/gadget/function/f_ncm.c
> +++ b/drivers/usb/gadget/function/f_ncm.c
> @@ -105,8 +105,8 @@ static inline struct f_ncm *func_to_ncm(struct usb_function *f)
>
>  /*
>   * Although max mtu as dictated by u_ether is 15412 bytes, setting
> - * max_segment_sizeto 15426 would not be efficient. If user chooses segment
> - * size to be (>= 8192), then we can't aggregate more than one  buffer in each
> + * max_segment_size to 15426 would not be efficient. If user chooses segment
> + * size to be (>= 8192), then we can't aggregate more than one buffer in each
>   * NTB (assuming each packet coming from network layer is >= 8192 bytes) as ep
>   * maxpacket limit is 16384. So let max_segment_size be limited to 8000 to allow
>   * at least 2 packets to be aggregated reducing wastage of NTB buffer space
> @@ -1489,7 +1489,7 @@ static int ncm_bind(struct usb_configuration *c, struct usb_function *f)
>         ncm_data_intf.bInterfaceNumber = status;
>         ncm_union_desc.bSlaveInterface0 = status;
>
> -       ecm_desc.wMaxSegmentSize = ncm_opts->max_segment_size;
> +       ecm_desc.wMaxSegmentSize = cpu_to_le16(ncm_opts->max_segment_size);
>
>         status = -ENODEV;
>
> @@ -1685,7 +1685,7 @@ static struct usb_function_instance *ncm_alloc_inst(void)
>                 kfree(opts);
>                 return ERR_CAST(net);
>         }
> -       opts->max_segment_size = cpu_to_le16(ETH_FRAME_LEN);
> +       opts->max_segment_size = ETH_FRAME_LEN;
>         INIT_LIST_HEAD(&opts->ncm_os_desc.ext_prop);
>
>         descs[0] = &opts->ncm_os_desc;
> --
> 2.42.0
>
Reviewed-by: Maciej Żenczykowski <maze@xxxxxxxxxx>





[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux