rust/bindings/bindings_helper.h | 1 + rust/helpers/helpers.c | 1 + rust/helpers/usb.c | 8 + rust/kernel/lib.rs | 2 + rust/kernel/usb.rs | 457 ++++++++++++++++++++++++++++++++++++++++ samples/rust/Kconfig | 11 + samples/rust/Makefile | 1 + samples/rust/rust_driver_usb.rs | 47 +++++ 8 files changed, 528 insertions(+)
This adds initial support for USB Rust drivers, not only because I see a widespread use of module_usb_driver() in media (which is a subsystem I aim to support) but also because I want to learn about USB in general and this is a nice opportunity to start doing so. I tried to keep things as consistent with pci.rs and platform.rs as possible and tested it by manually binding a device (i.e.: my Logitech mouse) to the sample driver via: /sys/bus/usb/drivers/rust_driver_usb/new_id This initial patch is therefore comprised of the same patterns that are known to work for pci and platform already. Physically disconnecting the device also worked, i.e.: nothing bad showed up in dmesg. Note that I did not touch MAINTAINERS at all. The objective is to kickstart the discussion of what to do there here in v1. --- Daniel Almeida (2): rust: usb: add basic USB abstractions samples: rust: add a USB driver sample rust/bindings/bindings_helper.h | 1 + rust/helpers/helpers.c | 1 + rust/helpers/usb.c | 8 + rust/kernel/lib.rs | 2 + rust/kernel/usb.rs | 457 ++++++++++++++++++++++++++++++++++++++++ samples/rust/Kconfig | 11 + samples/rust/Makefile | 1 + samples/rust/rust_driver_usb.rs | 47 +++++ 8 files changed, 528 insertions(+) --- base-commit: 44d454fcffa8b08d6d66df132121c1d387fa85db change-id: 20250825-b4-usb-dd0fe44fd78b Best regards, -- Daniel Almeida <daniel.almeida@collabora.com>
On Mon, Aug 25, 2025 at 03:18:04PM -0300, Daniel Almeida wrote: > This adds initial support for USB Rust drivers, not only because I see a > widespread use of module_usb_driver() in media (which is a subsystem I > aim to support) but also because I want to learn about USB in general > and this is a nice opportunity to start doing so. > > I tried to keep things as consistent with pci.rs and platform.rs as > possible and tested it by manually binding a device (i.e.: my Logitech > mouse) to the sample driver via: > > /sys/bus/usb/drivers/rust_driver_usb/new_id > > This initial patch is therefore comprised of the same patterns that are > known to work for pci and platform already. > > Physically disconnecting the device also worked, i.e.: nothing bad > showed up in dmesg. > > Note that I did not touch MAINTAINERS at all. The objective is to > kickstart the discussion of what to do there here in v1. Ok, as this seems to now be at least building properly for me, I have taken it into my char-misc branch for the next -rc1 merge window. BUT it has shown that it still needs some work to get "correct" and it really doesn't do much quite yet, so I have applied the patch below to pretty much just "disable" it entirely from the build at this point in time. I'll go and revert this commit after -rc1 is out, in my usb-next branch, so that we can start to build on top of it and ensure that it doesn't break, but for 6.18, I don't think it's quite ready to be there. Yes, this is not a normal way that bindings will probably be merged into the tree, but as I consulted deeply with the USB maintainer about this topic while eating some good Paris pizza and French wine this week while at the Kernel Recipes conference, I think that this deserves an exception as they agree this can be merged now and they will be responsible for any fallout.[1] thanks, greg k-h From c1785be6395031f92b62badb27665f80f0a7794c Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Date: Thu, 25 Sep 2025 14:42:40 +0200 Subject: USB: disable rust bindings from the build for now The rust USB bindings as submitted are a good start, but they don't really seem to be correct in a number of minor places, so just disable them from the build entirely at this point in time. When they are ready to be re-enabled, this commit can be reverted. Cc: Daniel Almeida <daniel.almeida@collabora.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> --- rust/bindings/bindings_helper.h | 1 - rust/helpers/helpers.c | 1 - rust/kernel/lib.rs | 2 -- samples/rust/Kconfig | 2 +- 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helper.h index 41cd42cd286f..9b3a4ab95818 100644 --- a/rust/bindings/bindings_helper.h +++ b/rust/bindings/bindings_helper.h @@ -74,7 +74,6 @@ #include <linux/slab.h> #include <linux/task_work.h> #include <linux/tracepoint.h> -#include <linux/usb.h> #include <linux/wait.h> #include <linux/workqueue.h> #include <linux/xarray.h> diff --git a/rust/helpers/helpers.c b/rust/helpers/helpers.c index 04103ab1a349..8e8277bdddca 100644 --- a/rust/helpers/helpers.c +++ b/rust/helpers/helpers.c @@ -48,7 +48,6 @@ #include "task.c" #include "time.c" #include "uaccess.c" -#include "usb.c" #include "vmalloc.c" #include "wait.c" #include "workqueue.c" diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index 004ca70b816d..99dbb7b2812e 100644 --- a/rust/kernel/lib.rs +++ b/rust/kernel/lib.rs @@ -127,8 +127,6 @@ pub mod tracepoint; pub mod transmute; pub mod types; -#[cfg(CONFIG_USB = "y")] -pub mod usb; pub mod uaccess; pub mod workqueue; pub mod xarray; diff --git a/samples/rust/Kconfig b/samples/rust/Kconfig index 6d6e4d8c88cb..865a62a93ddc 100644 --- a/samples/rust/Kconfig +++ b/samples/rust/Kconfig @@ -85,7 +85,7 @@ config SAMPLE_RUST_DRIVER_PLATFORM config SAMPLE_RUST_DRIVER_USB tristate "USB Driver" - depends on USB = y + depends on USB = y && BROKEN help This option builds the Rust USB driver sample. -- 2.51.0 [1] For those not getting the sarcasm here, I'm that maintainer, and yes, Paris has some very good pizza :)
On Thu Sep 25, 2025 at 2:52 PM CEST, Greg Kroah-Hartman wrote: > Yes, this is not a normal way that bindings will probably be merged into > the tree, but as I consulted deeply with the USB maintainer about this > topic while eating some good Paris pizza and French wine this week while > at the Kernel Recipes conference, I think that this deserves an > exception as they agree this can be merged now and they will be > responsible for any fallout.[1] If you rather have it "staging" in-tree that's of course up to you. :) But, I'd prefer not to expose the incorrect conversion between a &usb::Interface<Ctx> and a &usb::Device<Ctx> for a full release in Linus' tree. Besides other implications, this conversation also implies that &usb::Device<Core> can be derived from &usb::Interface<Core>, which semantically means that if the USB interface's device lock is held we infer that the device lock of the USB device is held as well. I know the code isn't even built, but I don't want people reading the code to take wrong conclusions from that. Also, it's dead code anyways, so maybe just apply the following hunk? Thanks, Danilo diff --git a/rust/kernel/usb.rs b/rust/kernel/usb.rs index 8899e7520b58..9bc3478cf561 100644 --- a/rust/kernel/usb.rs +++ b/rust/kernel/usb.rs @@ -340,18 +340,6 @@ fn as_ref(&self) -> &device::Device<Ctx> { } } -impl<Ctx: device::DeviceContext> AsRef<Device<Ctx>> for Interface<Ctx> { - fn as_ref(&self) -> &Device<Ctx> { - // SAFETY: `self.as_raw()` is valid by the type invariants. For a valid interface, - // the helper should always return a valid USB device pointer. - let usb_dev = unsafe { bindings::interface_to_usbdev(self.as_raw()) }; - - // SAFETY: The helper returns a valid interface pointer that shares the - // same `DeviceContext`. - unsafe { &*(usb_dev.cast()) } - } -} - // SAFETY: Instances of `Interface` are always reference-counted. unsafe impl AlwaysRefCounted for Interface { fn inc_ref(&self) {
On Thu, Sep 25, 2025 at 03:29:25PM +0200, Danilo Krummrich wrote: > On Thu Sep 25, 2025 at 2:52 PM CEST, Greg Kroah-Hartman wrote: > > Yes, this is not a normal way that bindings will probably be merged into > > the tree, but as I consulted deeply with the USB maintainer about this > > topic while eating some good Paris pizza and French wine this week while > > at the Kernel Recipes conference, I think that this deserves an > > exception as they agree this can be merged now and they will be > > responsible for any fallout.[1] > > If you rather have it "staging" in-tree that's of course up to you. :) > > But, I'd prefer not to expose the incorrect conversion between a > &usb::Interface<Ctx> and a &usb::Device<Ctx> for a full release in Linus' tree. > > Besides other implications, this conversation also implies that > &usb::Device<Core> can be derived from &usb::Interface<Core>, which semantically > means that if the USB interface's device lock is held we infer that the device > lock of the USB device is held as well. > > I know the code isn't even built, but I don't want people reading the code to > take wrong conclusions from that. > > Also, it's dead code anyways, so maybe just apply the following hunk? > > Thanks, > Danilo > > diff --git a/rust/kernel/usb.rs b/rust/kernel/usb.rs > index 8899e7520b58..9bc3478cf561 100644 > --- a/rust/kernel/usb.rs > +++ b/rust/kernel/usb.rs > @@ -340,18 +340,6 @@ fn as_ref(&self) -> &device::Device<Ctx> { > } > } > > -impl<Ctx: device::DeviceContext> AsRef<Device<Ctx>> for Interface<Ctx> { > - fn as_ref(&self) -> &Device<Ctx> { > - // SAFETY: `self.as_raw()` is valid by the type invariants. For a valid interface, > - // the helper should always return a valid USB device pointer. > - let usb_dev = unsafe { bindings::interface_to_usbdev(self.as_raw()) }; > - > - // SAFETY: The helper returns a valid interface pointer that shares the > - // same `DeviceContext`. > - unsafe { &*(usb_dev.cast()) } > - } > -} > - > // SAFETY: Instances of `Interface` are always reference-counted. > unsafe impl AlwaysRefCounted for Interface { > fn inc_ref(&self) { Cool, I'll be glad to apply this, can you resend it with a real signed-off-by line? And we can always submit fixes during the -rc cycle for 6.18, for stuff like this, so there's no immediate rush at the moment to get this "perfect". thanks, greg k-h
Hi Greg, > On 25 Sep 2025, at 14:52, Greg Kroah-Hartman <gregkh@linuxfoundation.org> wrote: > > On Mon, Aug 25, 2025 at 03:18:04PM -0300, Daniel Almeida wrote: >> This adds initial support for USB Rust drivers, not only because I see a >> widespread use of module_usb_driver() in media (which is a subsystem I >> aim to support) but also because I want to learn about USB in general >> and this is a nice opportunity to start doing so. >> >> I tried to keep things as consistent with pci.rs and platform.rs as >> possible and tested it by manually binding a device (i.e.: my Logitech >> mouse) to the sample driver via: >> >> /sys/bus/usb/drivers/rust_driver_usb/new_id >> >> This initial patch is therefore comprised of the same patterns that are >> known to work for pci and platform already. >> >> Physically disconnecting the device also worked, i.e.: nothing bad >> showed up in dmesg. >> >> Note that I did not touch MAINTAINERS at all. The objective is to >> kickstart the discussion of what to do there here in v1. > > Ok, as this seems to now be at least building properly for me, I have > taken it into my char-misc branch for the next -rc1 merge window. > > BUT it has shown that it still needs some work to get "correct" and it > really doesn't do much quite yet, so I have applied the patch below to > pretty much just "disable" it entirely from the build at this point in > time. > > I'll go and revert this commit after -rc1 is out, in my usb-next branch, > so that we can start to build on top of it and ensure that it doesn't > break, but for 6.18, I don't think it's quite ready to be there. Cool, I’ll follow up with the fixes required, and slowly build the features needed for usb-skeleton as we discussed. Give me a couple of weeks though, I need to get myself out of conference hell first :) Btw, thanks for the reviews, Danilo! — Daniel
On Mon, Aug 25, 2025 at 03:18:04PM -0300, Daniel Almeida wrote: > This adds initial support for USB Rust drivers, not only because I see a > widespread use of module_usb_driver() in media (which is a subsystem I > aim to support) but also because I want to learn about USB in general > and this is a nice opportunity to start doing so. > > I tried to keep things as consistent with pci.rs and platform.rs as > possible and tested it by manually binding a device (i.e.: my Logitech > mouse) to the sample driver via: > > /sys/bus/usb/drivers/rust_driver_usb/new_id > > This initial patch is therefore comprised of the same patterns that are > known to work for pci and platform already. > > Physically disconnecting the device also worked, i.e.: nothing bad > showed up in dmesg. > > Note that I did not touch MAINTAINERS at all. The objective is to > kickstart the discussion of what to do there here in v1. I tried to apply these, but I get the following build error when adding to the char-misc-testing tree: ld.lld: error: undefined symbol: usb_get_intf >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 >>> rust/kernel.o:(<kernel::usb::Interface as kernel::sync::aref::AlwaysRefCounted>::inc_ref) in archive vmlinux.a >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 >>> rust/kernel.o:(<kernel::sync::aref::ARef<kernel::usb::Interface> as core::convert::From<&kernel::usb::Interface<kernel::device::CoreInternal>>>::from) in archive vmlinux.a ld.lld: error: undefined symbol: usb_put_intf >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 >>> rust/kernel.o:(<kernel::usb::Interface as kernel::sync::aref::AlwaysRefCounted>::dec_ref) in archive vmlinux.a ld.lld: error: undefined symbol: usb_get_dev >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 >>> rust/kernel.o:(<kernel::usb::Device as kernel::sync::aref::AlwaysRefCounted>::inc_ref) in archive vmlinux.a >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 >>> rust/kernel.o:(<kernel::sync::aref::ARef<kernel::usb::Device> as core::convert::From<&kernel::usb::Device<kernel::device::CoreInternal>>>::from) in archive vmlinux.a ld.lld: error: undefined symbol: usb_put_dev >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 >>> rust/kernel.o:(<kernel::usb::Device as kernel::sync::aref::AlwaysRefCounted>::dec_ref) in archive vmlinux.a Any hints? thanks, greg k-h
On Tue, Sep 23, 2025 at 2:05 PM Greg Kroah-Hartman <gregkh@linuxfoundation.org> wrote: > > I tried to apply these By the way, a `MAINTAINERS` entry is needed, according to the log. Cheers, Miguel
Hi Miguel, > On 23 Sep 2025, at 14:56, Miguel Ojeda <miguel.ojeda.sandonis@gmail.com> wrote: > > On Tue, Sep 23, 2025 at 2:05 PM Greg Kroah-Hartman > <gregkh@linuxfoundation.org> wrote: >> >> I tried to apply these > > By the way, a `MAINTAINERS` entry is needed, according to the log. > > Cheers, > Miguel > Yeah, I did not add that on purpose. What’s the preferred approach here? I wonder if we can add the Rust files to the USB SUBSYSTEM entry? I can maintain the sample driver under a separate entry, for example. I’m open to any other arrangements. — Daniel
On Tue, Sep 23, 2025 at 3:25 PM Daniel Almeida <daniel.almeida@collabora.com> wrote: > > Yeah, I did not add that on purpose. What’s the preferred approach here? I > wonder if we can add the Rust files to the USB SUBSYSTEM entry? I can maintain > the sample driver under a separate entry, for example. > > I’m open to any other arrangements. Up to the subsystem maintainers, so Greg in this case I assume. In general, maintainers may want to maintain it themselves (thus adding the files is fine as you say); otherwise, they may prefer to have you as co-maintainer, or perhaps a new sub-entry with you as maintainer for the Rust part, etc. Thanks! Cheers, Miguel
On Tue, Sep 23, 2025 at 2:05 PM Greg Kroah-Hartman <gregkh@linuxfoundation.org> wrote: > > On Mon, Aug 25, 2025 at 03:18:04PM -0300, Daniel Almeida wrote: > > This adds initial support for USB Rust drivers, not only because I see a > > widespread use of module_usb_driver() in media (which is a subsystem I > > aim to support) but also because I want to learn about USB in general > > and this is a nice opportunity to start doing so. > > > > I tried to keep things as consistent with pci.rs and platform.rs as > > possible and tested it by manually binding a device (i.e.: my Logitech > > mouse) to the sample driver via: > > > > /sys/bus/usb/drivers/rust_driver_usb/new_id > > > > This initial patch is therefore comprised of the same patterns that are > > known to work for pci and platform already. > > > > Physically disconnecting the device also worked, i.e.: nothing bad > > showed up in dmesg. > > > > Note that I did not touch MAINTAINERS at all. The objective is to > > kickstart the discussion of what to do there here in v1. > > I tried to apply these, but I get the following build error when adding > to the char-misc-testing tree: > > ld.lld: error: undefined symbol: usb_get_intf > >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > >>> rust/kernel.o:(<kernel::usb::Interface as kernel::sync::aref::AlwaysRefCounted>::inc_ref) in archive vmlinux.a > >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > >>> rust/kernel.o:(<kernel::sync::aref::ARef<kernel::usb::Interface> as core::convert::From<&kernel::usb::Interface<kernel::device::CoreInternal>>>::from) in archive vmlinux.a > > ld.lld: error: undefined symbol: usb_put_intf > >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > >>> rust/kernel.o:(<kernel::usb::Interface as kernel::sync::aref::AlwaysRefCounted>::dec_ref) in archive vmlinux.a > > ld.lld: error: undefined symbol: usb_get_dev > >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > >>> rust/kernel.o:(<kernel::usb::Device as kernel::sync::aref::AlwaysRefCounted>::inc_ref) in archive vmlinux.a > >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > >>> rust/kernel.o:(<kernel::sync::aref::ARef<kernel::usb::Device> as core::convert::From<&kernel::usb::Device<kernel::device::CoreInternal>>>::from) in archive vmlinux.a > > ld.lld: error: undefined symbol: usb_put_dev > >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > >>> rust/kernel.o:(<kernel::usb::Device as kernel::sync::aref::AlwaysRefCounted>::dec_ref) in archive vmlinux.a > > > Any hints? Did you enable CONFIG_USB? Alice
On Tue, Sep 23, 2025 at 02:29:00PM +0200, Alice Ryhl wrote: > On Tue, Sep 23, 2025 at 2:05 PM Greg Kroah-Hartman > <gregkh@linuxfoundation.org> wrote: > > > > On Mon, Aug 25, 2025 at 03:18:04PM -0300, Daniel Almeida wrote: > > > This adds initial support for USB Rust drivers, not only because I see a > > > widespread use of module_usb_driver() in media (which is a subsystem I > > > aim to support) but also because I want to learn about USB in general > > > and this is a nice opportunity to start doing so. > > > > > > I tried to keep things as consistent with pci.rs and platform.rs as > > > possible and tested it by manually binding a device (i.e.: my Logitech > > > mouse) to the sample driver via: > > > > > > /sys/bus/usb/drivers/rust_driver_usb/new_id > > > > > > This initial patch is therefore comprised of the same patterns that are > > > known to work for pci and platform already. > > > > > > Physically disconnecting the device also worked, i.e.: nothing bad > > > showed up in dmesg. > > > > > > Note that I did not touch MAINTAINERS at all. The objective is to > > > kickstart the discussion of what to do there here in v1. > > > > I tried to apply these, but I get the following build error when adding > > to the char-misc-testing tree: > > > > ld.lld: error: undefined symbol: usb_get_intf > > >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > > >>> rust/kernel.o:(<kernel::usb::Interface as kernel::sync::aref::AlwaysRefCounted>::inc_ref) in archive vmlinux.a > > >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > > >>> rust/kernel.o:(<kernel::sync::aref::ARef<kernel::usb::Interface> as core::convert::From<&kernel::usb::Interface<kernel::device::CoreInternal>>>::from) in archive vmlinux.a > > > > ld.lld: error: undefined symbol: usb_put_intf > > >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > > >>> rust/kernel.o:(<kernel::usb::Interface as kernel::sync::aref::AlwaysRefCounted>::dec_ref) in archive vmlinux.a > > > > ld.lld: error: undefined symbol: usb_get_dev > > >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > > >>> rust/kernel.o:(<kernel::usb::Device as kernel::sync::aref::AlwaysRefCounted>::inc_ref) in archive vmlinux.a > > >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > > >>> rust/kernel.o:(<kernel::sync::aref::ARef<kernel::usb::Device> as core::convert::From<&kernel::usb::Device<kernel::device::CoreInternal>>>::from) in archive vmlinux.a > > > > ld.lld: error: undefined symbol: usb_put_dev > > >>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > > >>> rust/kernel.o:(<kernel::usb::Device as kernel::sync::aref::AlwaysRefCounted>::dec_ref) in archive vmlinux.a > > > > > > Any hints? > > Did you enable CONFIG_USB? Yes, CONFIG_USB=m
[…] >> >> I tried to apply these, but I get the following build error when adding >> to the char-misc-testing tree: >> >> ld.lld: error: undefined symbol: usb_get_intf >>>>> referenced by kernel.1a949e63ee2acc6a-cgu.0 >>>>> rust/kernel.o:(<kernel::usb::Interface as kernel::sync::aref::AlwaysRefCounted>::inc_ref) in archive vmlinux.a >>>>> referenced by kernel.1a949e63ee2acc6a-cgu.0 >>>>> rust/kernel.o:(<kernel::sync::aref::ARef<kernel::usb::Interface> as core::convert::From<&kernel::usb::Interface<kernel::device::CoreInternal>>>::from) in archive vmlinux.a >> >> ld.lld: error: undefined symbol: usb_put_intf >>>>> referenced by kernel.1a949e63ee2acc6a-cgu.0 >>>>> rust/kernel.o:(<kernel::usb::Interface as kernel::sync::aref::AlwaysRefCounted>::dec_ref) in archive vmlinux.a >> >> ld.lld: error: undefined symbol: usb_get_dev >>>>> referenced by kernel.1a949e63ee2acc6a-cgu.0 >>>>> rust/kernel.o:(<kernel::usb::Device as kernel::sync::aref::AlwaysRefCounted>::inc_ref) in archive vmlinux.a >>>>> referenced by kernel.1a949e63ee2acc6a-cgu.0 >>>>> rust/kernel.o:(<kernel::sync::aref::ARef<kernel::usb::Device> as core::convert::From<&kernel::usb::Device<kernel::device::CoreInternal>>>::from) in archive vmlinux.a >> >> ld.lld: error: undefined symbol: usb_put_dev >>>>> referenced by kernel.1a949e63ee2acc6a-cgu.0 >>>>> rust/kernel.o:(<kernel::usb::Device as kernel::sync::aref::AlwaysRefCounted>::dec_ref) in archive vmlinux.a >> >> >> Any hints? > > Did you enable CONFIG_USB? > > Alice +#[cfg(CONFIG_USB)] +pub mod usb; Hmm, but the USB module is gated by #[cfg(CONFIG_USB) in lib.rs, so not having CONFIG_USB enabled should not return any errors and instead skip the USB bindings completely. I wonder if this has to be CONFIG_USB=y? — Daniel
On Tue, Sep 23, 2025 at 02:34:27PM +0200, Daniel Almeida wrote: > […] > > >> > >> I tried to apply these, but I get the following build error when adding > >> to the char-misc-testing tree: > >> > >> ld.lld: error: undefined symbol: usb_get_intf > >>>>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > >>>>> rust/kernel.o:(<kernel::usb::Interface as kernel::sync::aref::AlwaysRefCounted>::inc_ref) in archive vmlinux.a > >>>>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > >>>>> rust/kernel.o:(<kernel::sync::aref::ARef<kernel::usb::Interface> as core::convert::From<&kernel::usb::Interface<kernel::device::CoreInternal>>>::from) in archive vmlinux.a > >> > >> ld.lld: error: undefined symbol: usb_put_intf > >>>>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > >>>>> rust/kernel.o:(<kernel::usb::Interface as kernel::sync::aref::AlwaysRefCounted>::dec_ref) in archive vmlinux.a > >> > >> ld.lld: error: undefined symbol: usb_get_dev > >>>>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > >>>>> rust/kernel.o:(<kernel::usb::Device as kernel::sync::aref::AlwaysRefCounted>::inc_ref) in archive vmlinux.a > >>>>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > >>>>> rust/kernel.o:(<kernel::sync::aref::ARef<kernel::usb::Device> as core::convert::From<&kernel::usb::Device<kernel::device::CoreInternal>>>::from) in archive vmlinux.a > >> > >> ld.lld: error: undefined symbol: usb_put_dev > >>>>> referenced by kernel.1a949e63ee2acc6a-cgu.0 > >>>>> rust/kernel.o:(<kernel::usb::Device as kernel::sync::aref::AlwaysRefCounted>::dec_ref) in archive vmlinux.a > >> > >> > >> Any hints? > > > > Did you enable CONFIG_USB? > > > > Alice > > +#[cfg(CONFIG_USB)] > +pub mod usb; > > Hmm, but the USB module is gated by #[cfg(CONFIG_USB) in lib.rs, so not having > CONFIG_USB enabled should not return any errors and instead skip the USB > bindings completely. > > I wonder if this has to be CONFIG_USB=y? It passes if CONFIG_USB=y, but it is good to keep the USB subsystem as a module if at all possible :) thanks, greg k-h
On Tue, Sep 23, 2025 at 2:34 PM Daniel Almeida <daniel.almeida@collabora.com> wrote: > > Hmm, but the USB module is gated by #[cfg(CONFIG_USB) in lib.rs, so not having > CONFIG_USB enabled should not return any errors and instead skip the USB > bindings completely. > > I wonder if this has to be CONFIG_USB=y? Yes, the `kernel` crate is built-in and it is trying to call something from a module. Cheers, Miguel
On Mon, Aug 25, 2025 at 03:18:04PM -0300, Daniel Almeida wrote: > This adds initial support for USB Rust drivers, not only because I see a > widespread use of module_usb_driver() in media (which is a subsystem I > aim to support) but also because I want to learn about USB in general > and this is a nice opportunity to start doing so. Oh wow, I wasn't expecting this, nice! I'm at a conference all this week so I can't review this just yet, give me a week please. But I am happy to see this happen, thanks for doing it. greg k-h
© 2016 - 2025 Red Hat, Inc.