Rust for Linux List
 help / color / mirror / Atom feed
* [PATCH RFC v2 0/4] rust: usb: abstractions towards the port of usbsevseg.c to Rust
@ 2026-08-11  9:42 Alexandru Radovici
  2026-08-11  9:42 ` [PATCH RFC v2 1/4] rust: usb: add endpoint abstraction Alexandru Radovici
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Alexandru Radovici @ 2026-08-11  9:42 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Miguel Ojeda, Boqun Feng, Gary Guo,
	Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl,
	Trevor Gross, Danilo Krummrich, Daniel Almeida, Tamir Duberstein,
	Alexandre Courbot, Onur Özkan, Rafael J. Wysocki
  Cc: linux-kernel, linux-usb, rust-for-linux, driver-core,
	Alexandru Radovici

My end goal is to port the usbsevseg.c USB driver to Rust. That driver is
small enough to make a useful first target; the remaining piece it
needs is sysfs attribute support for USB devices, which I plan to send
separately.

Porting the driver requires:
- retrieving endpoints and sending control messages API (this series)
- enabling sysfs attributes API for USB devices (future patch)

These patches add the USB and sysfs abstractions needed to port
drivers/usb/misc/usbsevseg.c to Rust: retrieving an interface's
endpoints, and sending and receiving control messages.

Patch 1 adds `AlternateEndpoint`, along with `AlternateSetting`
and the accessors needed to reach one. Patch 2 adds the
control transfer methods and the `Request` type describing a setup packet.
Patch 3 adds the sysfs abstractions. Patch 4 adds the sysfs abstractions
to `usb::Driver`.

The part I would most like feedback on is the typestate design in patch
1. `HostEndpoint` is generic over a direction and a transfer type, both
sealed 1-ZST markers, so a function can require e.g.
`&HostEndpoint<In, Bulk>` and skip checking the descriptor itself. Control
endpoints get a `Bidirectional` marker rather than a direction, since
bit 7 of bEndpointAddress is ignored for them. I am not sure whether
this earns its complexity for the drivers we expect, or whether plain
run-time check would be better.

Only `as_control()`, `as_in()` and `as_out()` are implemented so far;
`as_bulk()`, `as_interrupt()` and `as_isochronous()` are skiped for now 
as no current user needs them.

I am not sure about the soundness of the sysfs absgtractions, especially
the lifetime annotations of `DEVICE_GROUPS`.
Feedback for this would be greatly appreciated.

Signed-off-by: Alexandru Radovici <alexandru.radovici@wyliodrin.com>
---
Changes in v2:
- add sysfs abstractions
- add DEVICE_GROUPS abstractions to usb::Driver using sysfs
- rename the `control_` methods correctly
- use `Duration` instead of `i32` for control functions timeout
- fix control function 0 value timeout from "for ever" to `USB_MAX_SYNCHRONOUS_TIMEOUT` 
- add `#[inline]` to short functions
- use `u16::from_le` to read `wMaxPacketSize`
- rename `Generic` generic type to `Dir`
- impl `max_nak_rate` for `HostEndpoint<Bidirectional, Control>`
- make data `&mut [u8]` for `control_message_receive`
- Link to v1: https://lore.kernel.org/r/20260801-rust-usb_control_msg-v1-0-655bb444b52c@wyliodrin.com

---
Alexandru Radovici (4):
      rust: usb: add endpoint abstraction
      rust: usb: add control message send and receive
      rust: sysfs: add abstractions for device attributes
      rust: usb: allow drivers to expose sysfs attributes

 rust/kernel/device.rs           |   2 +-
 rust/kernel/lib.rs              |   2 +
 rust/kernel/sysfs.rs            | 602 ++++++++++++++++++++++++++++++++++++++++
 rust/kernel/usb.rs              | 227 ++++++++++++++-
 rust/kernel/usb/control.rs      | 367 ++++++++++++++++++++++++
 rust/kernel/usb/endpoint.rs     | 516 ++++++++++++++++++++++++++++++++++
 samples/rust/rust_driver_usb.rs |  14 +
 7 files changed, 1725 insertions(+), 5 deletions(-)
---
base-commit: 8ba098e6b6ff0db8edf28528d1552be261af30d4
change-id: 20260801-rust-usb_control_msg-ee34e002b818

Best regards,
-- 
Alexandru Radovici <alexandru.radovici@wyliodrin.com>


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-08-11  9:42 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-11  9:42 [PATCH RFC v2 0/4] rust: usb: abstractions towards the port of usbsevseg.c to Rust Alexandru Radovici
2026-08-11  9:42 ` [PATCH RFC v2 1/4] rust: usb: add endpoint abstraction Alexandru Radovici
2026-08-11  9:42 ` [PATCH RFC v2 2/4] rust: usb: add control message send and receive Alexandru Radovici
2026-08-11  9:42 ` [PATCH RFC v2 3/4] rust: sysfs: add abstractions for device attributes Alexandru Radovici
2026-08-11  9:42 ` [PATCH RFC v2 4/4] rust: usb: allow drivers to expose sysfs attributes Alexandru Radovici

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox