Message ID | 20240731042136.201327-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 Wed, Jul 31, 2024 at 6:22 AM 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. > > Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com> > --- > rust/kernel/net/phy.rs | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/rust/kernel/net/phy.rs b/rust/kernel/net/phy.rs > index 99a142348a34..561f0e357f31 100644 > --- a/rust/kernel/net/phy.rs > +++ b/rust/kernel/net/phy.rs > @@ -302,6 +302,15 @@ 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 we may access > + // this field without additional synchronization. > + unsafe { kernel::device::Device::as_ref(&mut (*phydev).mdio.dev) } This is a case where I would recommend use of the `addr_of_mut!` macro. The type of the mutable reference will be `&mut bindings::device` without a `Opaque` wrapper around the referent, and the lack of `Opaque` raises questions about uniqueness guarantees. Using `addr_of_mut!` sidesteps those questions. With `addr_of_mut!` and no intermediate mutable reference you may add: Reviewed-by: Alice Ryhl <aliceryhl@google.com> Alice
On Wed, 31 Jul 2024 10:38:11 +0200 Alice Ryhl <aliceryhl@google.com> wrote: >> +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 we may access >> + // this field without additional synchronization. >> + unsafe { kernel::device::Device::as_ref(&mut (*phydev).mdio.dev) } > > This is a case where I would recommend use of the `addr_of_mut!` > macro. The type of the mutable reference will be `&mut > bindings::device` without a `Opaque` wrapper around the referent, and > the lack of `Opaque` raises questions about uniqueness guarantees. > Using `addr_of_mut!` sidesteps those questions. > > With `addr_of_mut!` and no intermediate mutable reference you may add: > > Reviewed-by: Alice Ryhl <aliceryhl@google.com> Understood. I will use addr_of_mut! in v3. Thanks a lot!
diff --git a/rust/kernel/net/phy.rs b/rust/kernel/net/phy.rs index 99a142348a34..561f0e357f31 100644 --- a/rust/kernel/net/phy.rs +++ b/rust/kernel/net/phy.rs @@ -302,6 +302,15 @@ 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 we may access + // this field without additional synchronization. + unsafe { kernel::device::Device::as_ref(&mut (*phydev).mdio.dev) } + } +} + /// Defines certain other features this PHY supports (like interrupts). /// /// These flag values are used in [`Driver::FLAGS`].
Implement AsRef<kernel::device::Device> trait for Device. A PHY driver needs a reference to device::Device to call the firmware API. Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com> --- rust/kernel/net/phy.rs | 9 +++++++++ 1 file changed, 9 insertions(+)