On Thu, Dec 5, 2024 at 3:16 PM Danilo Krummrich <dakr@xxxxxxxxxx> wrote: > > Implement the basic PCI abstractions required to write a basic PCI > driver. This includes the following data structures: > > The `pci::Driver` trait represents the interface to the driver and > provides `pci::Driver::probe` for the driver to implement. > > The `pci::Device` abstraction represents a `struct pci_dev` and provides > abstractions for common functions, such as `pci::Device::set_master`. > > In order to provide the PCI specific parts to a generic > `driver::Registration` the `driver::RegistrationOps` trait is implemented > by `pci::Adapter`. > > `pci::DeviceId` implements PCI device IDs based on the generic > `device_id::RawDevceId` abstraction. > > Co-developed-by: FUJITA Tomonori <fujita.tomonori@xxxxxxxxx> > Signed-off-by: FUJITA Tomonori <fujita.tomonori@xxxxxxxxx> > Signed-off-by: Danilo Krummrich <dakr@xxxxxxxxxx> > +impl<T: Driver + 'static> Adapter<T> { > + extern "C" fn probe_callback( > + pdev: *mut bindings::pci_dev, > + id: *const bindings::pci_device_id, > + ) -> core::ffi::c_int { > + // SAFETY: The PCI bus only ever calls the probe callback with a valid pointer to a > + // `struct pci_dev`. > + let dev = unsafe { device::Device::get_device(&mut (*pdev).dev) }; It shouldn't be necessary to increment the refcount here. Also, the mutable reference is illegal because it references a C type without a Opaque wrapper. Please use the addr_of_mut! macro instead of a mutable reference. Alice