From: "Andreas Hindborg (Samsung)" <nmi@metaspace.dk>
To: FUJITA Tomonori <fujita.tomonori@gmail.com>
Cc: netdev@vger.kernel.org, rust-for-linux@vger.kernel.org,
andrew@lunn.ch, miguel.ojeda.sandonis@gmail.com,
tmgross@umich.edu, boqun.feng@gmail.com, wedsonaf@gmail.com,
benno.lossin@proton.me, greg@kroah.com
Subject: Re: [PATCH net-next v5 1/5] rust: core abstractions for network PHY drivers
Date: Fri, 20 Oct 2023 19:26:50 +0200 [thread overview]
Message-ID: <87sf65gpi0.fsf@metaspace.dk> (raw)
In-Reply-To: <20231017113014.3492773-2-fujita.tomonori@gmail.com>
Hi,
FUJITA Tomonori <fujita.tomonori@gmail.com> writes:
<cut>
> +
> + /// Returns true if the link is up.
> + pub fn get_link(&self) -> bool {
> + const LINK_IS_UP: u32 = 1;
> + // SAFETY: `phydev` is pointing to a valid object by the type invariant of `Self`.
> + let phydev = unsafe { *self.0.get() };
> + phydev.link() == LINK_IS_UP
> + }
I would prefer `is_link_up` or `link_is_up`.
> +
> + /// Returns true if auto-negotiation is enabled.
> + pub fn is_autoneg_enabled(&self) -> bool {
> + // SAFETY: `phydev` is pointing to a valid object by the type invariant of `Self`.
> + let phydev = unsafe { *self.0.get() };
> + phydev.autoneg() == bindings::AUTONEG_ENABLE
> + }
> +
> + /// Returns true if auto-negotiation is completed.
> + pub fn is_autoneg_completed(&self) -> bool {
> + const AUTONEG_COMPLETED: u32 = 1;
> + // SAFETY: `phydev` is pointing to a valid object by the type invariant of `Self`.
> + let phydev = unsafe { *self.0.get() };
> + phydev.autoneg_complete() == AUTONEG_COMPLETED
> + }
> +
> + /// Sets the speed of the PHY.
> + pub fn set_speed(&mut self, speed: u32) {
> + let phydev = self.0.get();
> + // SAFETY: `phydev` is pointing to a valid object by the type invariant of `Self`.
> + unsafe { (*phydev).speed = speed as i32 };
> + }
If this function is called with `u32::MAX` `(*phydev).speed` will become -1. Is that OK?
<cut>
> +
> +/// An instance of a PHY driver.
> +///
> +/// Wraps the kernel's `struct phy_driver`.
> +///
> +/// # Invariants
> +///
> +/// `self.0` is always in a valid state.
> +#[repr(transparent)]
> +pub struct DriverType(Opaque<bindings::phy_driver>);
I don't like the name `DriverType`. How about `DriverDesciptor` or
something like that?
<cut>
> +
> +/// Corresponds to functions in `struct phy_driver`.
> +///
> +/// This is used to register a PHY driver.
> +#[vtable]
> +pub trait Driver {
> + /// Defines certain other features this PHY supports.
> + /// It is a combination of the flags in the [`flags`] module.
> + const FLAGS: u32 = 0;
> +
> + /// The friendly name of this PHY type.
> + const NAME: &'static CStr;
> +
> + /// This driver only works for PHYs with IDs which match this field.
> + /// The default id and mask are zero.
> + const PHY_DEVICE_ID: DeviceId = DeviceId::new_with_custom_mask(0, 0);
> +
> + /// Issues a PHY software reset.
> + fn soft_reset(_dev: &mut Device) -> Result {
> + Err(code::ENOTSUPP)
> + }
> +
> + /// Probes the hardware to determine what abilities it has.
> + fn get_features(_dev: &mut Device) -> Result {
> + Err(code::ENOTSUPP)
> + }
> +
> + /// Returns true if this is a suitable driver for the given phydev.
> + /// If not implemented, matching is based on [`Driver::PHY_DEVICE_ID`].
> + fn match_phy_device(_dev: &Device) -> bool {
> + false
> + }
> +
> + /// Configures the advertisement and resets auto-negotiation
> + /// if auto-negotiation is enabled.
> + fn config_aneg(_dev: &mut Device) -> Result {
> + Err(code::ENOTSUPP)
> + }
> +
> + /// Determines the negotiated speed and duplex.
> + fn read_status(_dev: &mut Device) -> Result<u16> {
> + Err(code::ENOTSUPP)
> + }
> +
> + /// Suspends the hardware, saving state if needed.
> + fn suspend(_dev: &mut Device) -> Result {
> + Err(code::ENOTSUPP)
> + }
> +
> + /// Resumes the hardware, restoring state if needed.
> + fn resume(_dev: &mut Device) -> Result {
> + Err(code::ENOTSUPP)
> + }
> +
> + /// Overrides the default MMD read function for reading a MMD register.
> + fn read_mmd(_dev: &mut Device, _devnum: u8, _regnum: u16) -> Result<u16> {
> + Err(code::ENOTSUPP)
> + }
> +
> + /// Overrides the default MMD write function for writing a MMD register.
> + fn write_mmd(_dev: &mut Device, _devnum: u8, _regnum: u16, _val: u16) -> Result {
> + Err(code::ENOTSUPP)
> + }
> +
> + /// Callback for notification of link change.
> + fn link_change_notify(_dev: &mut Device) {}
It is probably an error if these functions are called, and so BUG() would be
appropriate? See the discussion in [1].
[1] https://lore.kernel.org/rust-for-linux/20231019171540.259173-1-benno.lossin@proton.me/
<cut>
> +
> + // macro use only
> + #[doc(hidden)]
> + pub const fn mdio_device_id(&self) -> bindings::mdio_device_id {
> + bindings::mdio_device_id {
> + phy_id: self.id,
> + phy_id_mask: self.mask.as_int(),
> + }
> + }
Would it make sense to move this function to the macro patch?
Best regards,
Andreas
next prev parent reply other threads:[~2023-10-20 17:42 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-17 11:30 [PATCH net-next v5 0/5] Rust abstractions for network PHY drivers FUJITA Tomonori
2023-10-17 11:30 ` [PATCH net-next v5 1/5] rust: core " FUJITA Tomonori
2023-10-18 15:07 ` Benno Lossin
2023-10-19 0:24 ` FUJITA Tomonori
2023-10-19 13:45 ` Benno Lossin
2023-10-19 14:42 ` FUJITA Tomonori
2023-10-19 15:20 ` Benno Lossin
2023-10-19 15:32 ` FUJITA Tomonori
2023-10-19 16:37 ` Benno Lossin
2023-10-19 21:51 ` FUJITA Tomonori
2023-10-21 7:21 ` Benno Lossin
2023-10-20 0:34 ` FUJITA Tomonori
2023-10-20 12:54 ` FUJITA Tomonori
2023-10-21 7:25 ` Benno Lossin
2023-10-21 7:30 ` FUJITA Tomonori
2023-10-21 8:37 ` Benno Lossin
2023-10-21 10:27 ` FUJITA Tomonori
2023-10-21 11:21 ` Benno Lossin
2023-10-21 11:36 ` FUJITA Tomonori
2023-10-21 12:13 ` Benno Lossin
2023-10-21 12:38 ` FUJITA Tomonori
2023-10-21 12:50 ` Benno Lossin
2023-10-21 13:00 ` FUJITA Tomonori
2023-10-21 13:05 ` Benno Lossin
2023-10-21 13:31 ` FUJITA Tomonori
2023-10-21 13:35 ` Benno Lossin
2023-10-21 21:45 ` FUJITA Tomonori
2023-10-23 6:35 ` Benno Lossin
2023-10-23 6:37 ` Benno Lossin
2023-10-21 15:57 ` Andrew Lunn
2023-10-21 16:31 ` Benno Lossin
2023-10-21 15:41 ` Andrew Lunn
2023-10-20 18:42 ` Andrew Lunn
2023-10-21 4:44 ` FUJITA Tomonori
2023-10-21 7:36 ` Benno Lossin
2023-10-21 12:47 ` Miguel Ojeda
2023-10-22 9:47 ` FUJITA Tomonori
2023-10-22 11:37 ` Miguel Ojeda
2023-10-22 15:34 ` Andrew Lunn
2023-10-24 1:37 ` FUJITA Tomonori
2023-10-24 8:48 ` Miguel Ojeda
2023-10-18 20:27 ` Andrew Lunn
2023-10-19 0:41 ` FUJITA Tomonori
2023-10-19 13:57 ` Benno Lossin
2023-10-20 19:50 ` Andrew Lunn
2023-10-21 8:01 ` Benno Lossin
2023-10-21 15:35 ` Andrew Lunn
2023-10-20 17:26 ` Andreas Hindborg (Samsung) [this message]
2023-10-20 17:56 ` Benno Lossin
2023-10-20 19:59 ` Andrew Lunn
2023-10-20 20:30 ` Andreas Hindborg (Samsung)
2023-10-21 3:49 ` FUJITA Tomonori
2023-10-21 4:01 ` FUJITA Tomonori
2023-10-17 11:30 ` [PATCH net-next v5 2/5] rust: net::phy add module_phy_driver macro FUJITA Tomonori
2023-10-17 11:30 ` [PATCH net-next v5 3/5] WIP rust: add second `bindgen` pass for enum exhaustiveness checking FUJITA Tomonori
2023-10-20 11:37 ` Andreas Hindborg (Samsung)
2023-10-20 12:34 ` Miguel Ojeda
2023-10-20 12:35 ` Miguel Ojeda
2023-10-23 8:57 ` Andreas Hindborg (Samsung)
2023-10-21 3:51 ` FUJITA Tomonori
2023-10-21 12:05 ` Miguel Ojeda
2023-10-22 6:30 ` FUJITA Tomonori
2023-10-23 8:58 ` Andreas Hindborg (Samsung)
2023-10-17 11:30 ` [PATCH net-next v5 4/5] MAINTAINERS: add Rust PHY abstractions for ETHERNET PHY LIBRARY FUJITA Tomonori
2023-10-17 11:30 ` [PATCH net-next v5 5/5] net: phy: add Rust Asix PHY driver FUJITA Tomonori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87sf65gpi0.fsf@metaspace.dk \
--to=nmi@metaspace.dk \
--cc=andrew@lunn.ch \
--cc=benno.lossin@proton.me \
--cc=boqun.feng@gmail.com \
--cc=fujita.tomonori@gmail.com \
--cc=greg@kroah.com \
--cc=miguel.ojeda.sandonis@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=tmgross@umich.edu \
--cc=wedsonaf@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.