Commit 5114e05a authored by FUJITA Tomonori's avatar FUJITA Tomonori Committed by David S. Miller
Browse files

rust: net::phy unified genphy_read_status function for C22 and C45 registers



Add unified genphy_read_status function for C22 and C45
registers. Instead of having genphy_c22 and genphy_c45 methods, this
unifies genphy_read_status functions for C22 and C45.

Reviewed-by: default avatarTrevor Gross <tmgross@umich.edu>
Reviewed-by: default avatarBenno Lossin <benno.lossin@proton.me>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarFUJITA Tomonori <fujita.tomonori@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b2e47002
Loading
Loading
Loading
Loading
+2 −10
Original line number Diff line number Diff line
@@ -252,16 +252,8 @@ pub fn genphy_suspend(&mut self) -> Result {
    }

    /// Checks the link status and updates current link state.
    pub fn genphy_read_status(&mut self) -> Result<u16> {
        let phydev = self.0.get();
        // SAFETY: `phydev` is pointing to a valid object by the type invariant of `Self`.
        // So it's just an FFI call.
        let ret = unsafe { bindings::genphy_read_status(phydev) };
        if ret < 0 {
            Err(Error::from_errno(ret))
        } else {
            Ok(ret as u16)
        }
    pub fn genphy_read_status<R: reg::Register>(&mut self) -> Result<u16> {
        R::read_status(self)
    }

    /// Updates the link status.
+28 −0
Original line number Diff line number Diff line
@@ -31,6 +31,13 @@ pub trait Sealed {}
///     dev.read(C22::BMCR);
///     // read C45 PMA/PMD control 1 register
///     dev.read(C45::new(Mmd::PMAPMD, 0));
///
///     // Checks the link status as reported by registers in the C22 namespace
///     // and updates current link state.
///     dev.genphy_read_status::<phy::C22>();
///     // Checks the link status as reported by registers in the C45 namespace
///     // and updates current link state.
///     dev.genphy_read_status::<phy::C45>();
/// }
/// ```
pub trait Register: private::Sealed {
@@ -39,6 +46,9 @@ pub trait Register: private::Sealed {

    /// Writes a PHY register.
    fn write(&self, dev: &mut Device, val: u16) -> Result;

    /// Checks the link status and updates current link state.
    fn read_status(dev: &mut Device) -> Result<u16>;
}

/// A single MDIO clause 22 register address (5 bits).
@@ -113,6 +123,15 @@ fn write(&self, dev: &mut Device, val: u16) -> Result {
            bindings::mdiobus_write((*phydev).mdio.bus, (*phydev).mdio.addr, self.0.into(), val)
        })
    }

    fn read_status(dev: &mut Device) -> Result<u16> {
        let phydev = dev.0.get();
        // SAFETY: `phydev` is pointing to a valid object by the type invariant of `Self`.
        // So it's just an FFI call.
        let ret = unsafe { bindings::genphy_read_status(phydev) };
        to_result(ret)?;
        Ok(ret as u16)
    }
}

/// A single MDIO clause 45 register device and address.
@@ -193,4 +212,13 @@ fn write(&self, dev: &mut Device, val: u16) -> Result {
            bindings::phy_write_mmd(phydev, self.devad.0.into(), self.regnum.into(), val)
        })
    }

    fn read_status(dev: &mut Device) -> Result<u16> {
        let phydev = dev.0.get();
        // SAFETY: `phydev` is pointing to a valid object by the type invariant of `Self`.
        // So it's just an FFI call.
        let ret = unsafe { bindings::genphy_c45_read_status(phydev) };
        to_result(ret)?;
        Ok(ret as u16)
    }
}