[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <2025090618-smudgy-cringing-a7a4@gregkh>
Date: Sat, 6 Sep 2025 13:14:57 +0200
From: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
To: Daniel Almeida <daniel.almeida@...labora.com>
Cc: Miguel Ojeda <ojeda@...nel.org>, Alex Gaynor <alex.gaynor@...il.com>,
Boqun Feng <boqun.feng@...il.com>, Gary Guo <gary@...yguo.net>,
Björn Roy Baron <bjorn3_gh@...tonmail.com>,
Benno Lossin <lossin@...nel.org>,
Andreas Hindborg <a.hindborg@...nel.org>,
Alice Ryhl <aliceryhl@...gle.com>, Trevor Gross <tmgross@...ch.edu>,
Danilo Krummrich <dakr@...nel.org>, linux-kernel@...r.kernel.org,
rust-for-linux@...r.kernel.org, linux-usb@...r.kernel.org
Subject: Re: [PATCH 2/2] samples: rust: add a USB driver sample
On Mon, Aug 25, 2025 at 03:18:06PM -0300, Daniel Almeida wrote:
> In light of the newly-added Rust abstractions for USB devices and
> drivers, add a sample USB rust driver that serves both to showcase what
> is currently supported, as well as be the only user of the USB
> abstractions for now.
>
> Signed-off-by: Daniel Almeida <daniel.almeida@...labora.com>
> ---
> samples/rust/Kconfig | 11 ++++++++++
> samples/rust/Makefile | 1 +
> samples/rust/rust_driver_usb.rs | 47 +++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 59 insertions(+)
>
> diff --git a/samples/rust/Kconfig b/samples/rust/Kconfig
> index 7f7371a004ee0a8f67dca99c836596709a70c4fa..fb222f93014c921b27a8a9a4293e90a2532faa82 100644
> --- a/samples/rust/Kconfig
> +++ b/samples/rust/Kconfig
> @@ -83,6 +83,17 @@ config SAMPLE_RUST_DRIVER_PLATFORM
>
> If unsure, say N.
>
> +config SAMPLE_RUST_DRIVER_USB
> + tristate "USB Driver"
> + depends on USB
> + help
> + This option builds the Rust USB driver sample.
> +
> + To compile this as a module, choose M here:
> + the module will be called rust_driver_usb.
> +
> + If unsure, say N.
> +
> config SAMPLE_RUST_DRIVER_FAUX
> tristate "Faux Driver"
> help
> diff --git a/samples/rust/Makefile b/samples/rust/Makefile
> index bd2faad63b4f3befe7d1ed5139fe25c7a8b6d7f6..4e7df8a5cd277d101920c4b89a3ac6648b372b28 100644
> --- a/samples/rust/Makefile
> +++ b/samples/rust/Makefile
> @@ -7,6 +7,7 @@ obj-$(CONFIG_SAMPLE_RUST_PRINT) += rust_print.o
> obj-$(CONFIG_SAMPLE_RUST_DMA) += rust_dma.o
> obj-$(CONFIG_SAMPLE_RUST_DRIVER_PCI) += rust_driver_pci.o
> obj-$(CONFIG_SAMPLE_RUST_DRIVER_PLATFORM) += rust_driver_platform.o
> +obj-$(CONFIG_SAMPLE_RUST_DRIVER_USB) += rust_driver_usb.o
> obj-$(CONFIG_SAMPLE_RUST_DRIVER_FAUX) += rust_driver_faux.o
> obj-$(CONFIG_SAMPLE_RUST_DRIVER_AUXILIARY) += rust_driver_auxiliary.o
> obj-$(CONFIG_SAMPLE_RUST_CONFIGFS) += rust_configfs.o
> diff --git a/samples/rust/rust_driver_usb.rs b/samples/rust/rust_driver_usb.rs
> new file mode 100644
> index 0000000000000000000000000000000000000000..5c396f421de7f972985e57af48e8a9da0c558973
> --- /dev/null
> +++ b/samples/rust/rust_driver_usb.rs
> @@ -0,0 +1,47 @@
> +// SPDX-License-Identifier: GPL-2.0
> +// SPDX-FileCopyrightText: Copyright (C) 2025 Collabora Ltd.
> +
> +//! Rust USB driver sample.
> +
> +use kernel::{device, device::Core, prelude::*, sync::aref::ARef, usb};
> +
> +struct SampleDriver {
> + _intf: ARef<usb::Interface>,
> +}
> +
> +kernel::usb_device_table!(
> + USB_TABLE,
> + MODULE_USB_TABLE,
> + <SampleDriver as usb::Driver>::IdInfo,
> + [(usb::DeviceId::from_id(0x1234, 0x5678), ()),]
> +);
> +
> +impl usb::Driver for SampleDriver {
> + type IdInfo = ();
> + const ID_TABLE: usb::IdTable<Self::IdInfo> = &USB_TABLE;
> +
> + fn probe(
> + intf: &usb::Interface<Core>,
> + _id: &usb::DeviceId,
> + _info: &Self::IdInfo,
> + ) -> Result<Pin<KBox<Self>>> {
> + let dev: &device::Device<Core> = intf.as_ref();
> + dev_info!(dev, "Rust USB driver sample probed\n");
> +
> + let drvdata = KBox::new(Self { _intf: intf.into() }, GFP_KERNEL)?;
> + Ok(drvdata.into())
> + }
> +
> + fn disconnect(intf: &usb::Interface<Core>, _data: Pin<&Self>) {
> + let dev: &device::Device<Core> = intf.as_ref();
> + dev_info!(dev, "Rust USB driver sample disconnected\n");
> + }
> +}
> +
> +kernel::module_usb_driver! {
> + type: SampleDriver,
> + name: "rust_driver_usb",
> + authors: ["Daniel Almeida"],
> + description: "Rust USB driver sample",
> + license: "GPL v2",
> +}
Sorry for the delay.
But these bindings really are only for a usb interface probe/disconnect
sequence, right? no real data flow at all?
I recommend looking at the usb-skeleton.c driver, and implementing that
as your sample driver for rust. That will ensure that you actually have
the correct apis implemented and the reference count logic working
properly. You have urb anchors and callbacks and other stuff as well to
ensure that you get right. That driver pretty much should handle
everything that you need to do to write a usb driver for any type of
"real" device.
thanks,
greg k-h
Powered by blists - more mailing lists