Message ID | 20240819005345.84255-4-fujita.tomonori@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: phy: add Applied Micro QT2025 PHY driver | expand |
On Sun, Aug 18, 2024 at 8:00 PM FUJITA Tomonori <fujita.tomonori@gmail.com> wrote: > > Implement AsRef<kernel::device::Device> trait for Device. A PHY driver > needs a reference to device::Device to call the firmware API. > > Reviewed-by: Alice Ryhl <aliceryhl@google.com> > Reviewed-by: Andrew Lunn <andrew@lunn.ch> > Reviewed-by: Benno Lossin <benno.lossin@proton.me> > Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com> > --- > rust/kernel/net/phy.rs | 24 +++++++++++++++++------- > 1 file changed, 17 insertions(+), 7 deletions(-) > > diff --git a/rust/kernel/net/phy.rs b/rust/kernel/net/phy.rs > index 5e8137a1972f..ec337cbd391b 100644 > --- a/rust/kernel/net/phy.rs > +++ b/rust/kernel/net/phy.rs > @@ -76,9 +76,11 @@ impl Device { > /// > /// # Safety > /// > - /// For the duration of 'a, the pointer must point at a valid `phy_device`, > - /// and the caller must be in a context where all methods defined on this struct > - /// are safe to call. > + /// For the duration of 'a, Nit, backticks around `'a` > + /// - the pointer must point at a valid `phy_device`, and the caller > + /// must be in a context where all methods defined on this struct > + /// are safe to call. > + /// - `(*ptr).mdio.dev` must be a valid. > unsafe fn from_raw<'a>(ptr: *mut bindings::phy_device) -> &'a mut Self { > // CAST: `Self` is a `repr(transparent)` wrapper around `bindings::phy_device`. > let ptr = ptr.cast::<Self>(); Reviewed-by: Trevor Gross <tmgross@umich.edu>
On Mon, 19 Aug 2024 02:21:03 -0500 Trevor Gross <tmgross@umich.edu> wrote: >> @@ -76,9 +76,11 @@ impl Device { >> /// >> /// # Safety >> /// >> - /// For the duration of 'a, the pointer must point at a valid `phy_device`, >> - /// and the caller must be in a context where all methods defined on this struct >> - /// are safe to call. >> + /// For the duration of 'a, > > Nit, backticks around `'a` Oops, I'll add. >> + /// - the pointer must point at a valid `phy_device`, and the caller >> + /// must be in a context where all methods defined on this struct >> + /// are safe to call. >> + /// - `(*ptr).mdio.dev` must be a valid. >> unsafe fn from_raw<'a>(ptr: *mut bindings::phy_device) -> &'a mut Self { >> // CAST: `Self` is a `repr(transparent)` wrapper around `bindings::phy_device`. >> let ptr = ptr.cast::<Self>(); > > Reviewed-by: Trevor Gross <tmgross@umich.edu> Thanks!
diff --git a/rust/kernel/net/phy.rs b/rust/kernel/net/phy.rs index 5e8137a1972f..ec337cbd391b 100644 --- a/rust/kernel/net/phy.rs +++ b/rust/kernel/net/phy.rs @@ -7,8 +7,7 @@ //! C headers: [`include/linux/phy.h`](srctree/include/linux/phy.h). use crate::{error::*, prelude::*, types::Opaque}; - -use core::marker::PhantomData; +use core::{marker::PhantomData, ptr::addr_of_mut}; /// PHY state machine states. /// @@ -58,8 +57,9 @@ pub enum DuplexMode { /// /// # Invariants /// -/// Referencing a `phy_device` using this struct asserts that you are in -/// a context where all methods defined on this struct are safe to call. +/// - Referencing a `phy_device` using this struct asserts that you are in +/// a context where all methods defined on this struct are safe to call. +/// - This struct always has a valid `self.0.mdio.dev`. /// /// [`struct phy_device`]: srctree/include/linux/phy.h // During the calls to most functions in [`Driver`], the C side (`PHYLIB`) holds a lock that is @@ -76,9 +76,11 @@ impl Device { /// /// # Safety /// - /// For the duration of 'a, the pointer must point at a valid `phy_device`, - /// and the caller must be in a context where all methods defined on this struct - /// are safe to call. + /// For the duration of 'a, + /// - the pointer must point at a valid `phy_device`, and the caller + /// must be in a context where all methods defined on this struct + /// are safe to call. + /// - `(*ptr).mdio.dev` must be a valid. unsafe fn from_raw<'a>(ptr: *mut bindings::phy_device) -> &'a mut Self { // CAST: `Self` is a `repr(transparent)` wrapper around `bindings::phy_device`. let ptr = ptr.cast::<Self>(); @@ -302,6 +304,14 @@ pub fn genphy_read_abilities(&mut self) -> Result { } } +impl AsRef<kernel::device::Device> for Device { + fn as_ref(&self) -> &kernel::device::Device { + let phydev = self.0.get(); + // SAFETY: The struct invariant ensures that `mdio.dev` is valid. + unsafe { kernel::device::Device::as_ref(addr_of_mut!((*phydev).mdio.dev)) } + } +} + /// Defines certain other features this PHY supports (like interrupts). /// /// These flag values are used in [`Driver::FLAGS`].