Re: [PATCH 01/11] usb: ch9: Add sublink speed struct

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

 



Greg Kroah-Hartman wrote:
> On Fri, Jul 17, 2020 at 07:06:10AM +0000, Thinh Nguyen wrote:
>> Greg Kroah-Hartman wrote:
>>> On Thu, Jul 16, 2020 at 02:58:36PM -0700, Thinh Nguyen wrote:
>>>> USB 3.2 specification supports dual-lane for super-speed-plus. USB
>>>> devices may operate at different sublink speeds. To avoid using magic
>>>> numbers and capture the sublink speed better, introduce the
>>>> usb_sublink_speed structure and various sublink speed attribute enum.
>>>>
>>>> See SSP BOS descriptor in USB 3.2 specification section 9.6.2.5
>>>>
>>>> Signed-off-by: Thinh Nguyen <thinhn@xxxxxxxxxxxx>
>>>> ---
>>>>    include/uapi/linux/usb/ch9.h | 42 ++++++++++++++++++++++++++++++++++++++++++
>>>>    1 file changed, 42 insertions(+)
>>>>
>>>> diff --git a/include/uapi/linux/usb/ch9.h b/include/uapi/linux/usb/ch9.h
>>>> index 2b623f36af6b..d4fd403a3664 100644
>>>> --- a/include/uapi/linux/usb/ch9.h
>>>> +++ b/include/uapi/linux/usb/ch9.h
>>>> @@ -1145,6 +1145,48 @@ enum usb_device_speed {
>>>>    	USB_SPEED_SUPER_PLUS,			/* usb 3.1 */
>>>>    };
>>>>    
>>>> +/* USB 3.2 sublink speed attributes */
>>>> +
>>>> +enum usb_lane_speed_exponent {
>>>> +	USB_LSE_BPS = 0,
>>>> +	USB_LSE_KBPS = 1,
>>>> +	USB_LSE_MBPS = 2,
>>>> +	USB_LSE_GBPS = 3,
>>>> +};
>>>> +
>>>> +enum usb_sublink_type {
>>>> +	USB_ST_SYMMETRIC_RX = 0,
>>>> +	USB_ST_ASYMMETRIC_RX = 1,
>>>> +	USB_ST_SYMMETRIC_TX = 2,
>>>> +	USB_ST_ASYMMETRIC_TX = 3,
>>>> +};
>>>> +
>>>> +enum usb_link_protocol {
>>>> +	USB_LP_SS = 0,
>>>> +	USB_LP_SSP = 1,
>>>> +};
>>>> +
>>>> +/**
>>>> + * struct usb_sublink_speed - sublink speed attribute
>>>> + * @id: sublink speed attribute ID (SSID)
>>>> + * @mantissa: lane speed mantissa
>>>> + * @exponent: lane speed exponent
>>>> + * @sublink type: sublink type
>>>> + * @protocol: sublink protocol
>>>> + *
>>>> + * Super-speed-plus supports multiple lanes. Use the sublink speed attributes to
>>>> + * describe the sublink speed.
>>>> + *
>>>> + * See USB 3.2 spec section 9.6.2.6 for super-speed-plus capability for more
>>>> + * information.
>>>> + */
>>>> +struct usb_sublink_speed {
>>>> +	u8				id;
>>>> +	u16				mantissa;
>>> You have to use the proper data types for crossing the user/kernel
>>> boundry here.  That would be __u8 and __u16, right?
>>>
>>>> +	enum usb_lane_speed_exponent	exponent;
>>>> +	enum usb_sublink_type		type;
>>>> +	enum usb_link_protocol		protocol;
>>> Are you _sure_ that an enum is the correct size for these fields?  How
>>> can you guarantee this?  We do not use enums in this way for any other
>>> field in this file for a reason...
>>>
>>> And did you look at the layout of this structure to verify it actually
>>> matches what is on the wire with USB?  I think you need to add a packed
>>> attribute to guarantee it.
>> This struct is not intended to be packed to be sent over the bus. It's a
>> simple struct for host and gadget driver use only. I intended to use
>> enum to make it more clear not to be used that way. From your question,
>> it's obviously not clear.
> Then why are you putting it in this file?  This file is only for things
> that are described in the USB spec that need to cross the user/kernel
> boundry.

Ok, it seemed to fit here. I'll place it under /include/linux/usb.h then?

>
>> Otherwise, it may look something like this:
>> struct usb_sublink_speed {
>>           __u8    ssid:4;
>>           __u8    lse:2;
>>           __u8    st:2;
>>           __u8    rsvd:6;
>>           __u8    lp:2;
> Are you sure those bit fields will work on big-endian systems?

No. Because of the way the bitfields are placed, it's a path to 
unnecessary headache/bugs with boundary and endianness checks. That's 
why I decided to go with the other solution.

Thanks,
Thinh




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

  Powered by Linux