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:47:03AM +0000, Thinh Nguyen wrote:
>> 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?
> include/linux/usb/ch9.h perhaps?

Sure. I'll place it there.

>>>> 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.
> That's good, but again, this is a uapi file, not a "normal" include file
> in the kernel, you have to be careful about this.
>

Will do. Thanks for the quick responses.

BR,
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