Commit f65a3218 authored by FUJITA Tomonori's avatar FUJITA Tomonori Committed by Danilo Krummrich
Browse files

rust: net::phy represent DeviceId as transparent wrapper over mdio_device_id



Refactor the DeviceId struct to be a #[repr(transparent)] wrapper
around the C struct bindings::mdio_device_id.

This refactoring is a preparation for enabling the PHY abstractions to
use the RawDeviceId trait.

Acked-by: default avatarJakub Kicinski <kuba@kernel.org>
Reviewed-by: default avatarTrevor Gross <tmgross@umich.edu>
Signed-off-by: default avatarFUJITA Tomonori <fujita.tomonori@gmail.com>
Link: https://lore.kernel.org/r/20250711040947.1252162-3-fujita.tomonori@gmail.com


Signed-off-by: default avatarDanilo Krummrich <dakr@kernel.org>
parent 8d84b320
Loading
Loading
Loading
Loading
+28 −27
Original line number Diff line number Diff line
@@ -507,7 +507,7 @@ pub const fn create_phy_driver<T: Driver>() -> DriverVTable {
    DriverVTable(Opaque::new(bindings::phy_driver {
        name: T::NAME.as_char_ptr().cast_mut(),
        flags: T::FLAGS,
        phy_id: T::PHY_DEVICE_ID.id,
        phy_id: T::PHY_DEVICE_ID.id(),
        phy_id_mask: T::PHY_DEVICE_ID.mask_as_int(),
        soft_reset: if T::HAS_SOFT_RESET {
            Some(Adapter::<T>::soft_reset_callback)
@@ -691,42 +691,41 @@ fn drop(&mut self) {
///
/// Represents the kernel's `struct mdio_device_id`. This is used to find an appropriate
/// PHY driver.
pub struct DeviceId {
    id: u32,
    mask: DeviceMask,
}
#[repr(transparent)]
#[derive(Clone, Copy)]
pub struct DeviceId(bindings::mdio_device_id);

impl DeviceId {
    /// Creates a new instance with the exact match mask.
    pub const fn new_with_exact_mask(id: u32) -> Self {
        DeviceId {
            id,
            mask: DeviceMask::Exact,
        }
        Self(bindings::mdio_device_id {
            phy_id: id,
            phy_id_mask: DeviceMask::Exact.as_int(),
        })
    }

    /// Creates a new instance with the model match mask.
    pub const fn new_with_model_mask(id: u32) -> Self {
        DeviceId {
            id,
            mask: DeviceMask::Model,
        }
        Self(bindings::mdio_device_id {
            phy_id: id,
            phy_id_mask: DeviceMask::Model.as_int(),
        })
    }

    /// Creates a new instance with the vendor match mask.
    pub const fn new_with_vendor_mask(id: u32) -> Self {
        DeviceId {
            id,
            mask: DeviceMask::Vendor,
        }
        Self(bindings::mdio_device_id {
            phy_id: id,
            phy_id_mask: DeviceMask::Vendor.as_int(),
        })
    }

    /// Creates a new instance with a custom match mask.
    pub const fn new_with_custom_mask(id: u32, mask: u32) -> Self {
        DeviceId {
            id,
            mask: DeviceMask::Custom(mask),
        }
        Self(bindings::mdio_device_id {
            phy_id: id,
            phy_id_mask: DeviceMask::Custom(mask).as_int(),
        })
    }

    /// Creates a new instance from [`Driver`].
@@ -734,18 +733,20 @@ pub const fn new_with_driver<T: Driver>() -> Self {
        T::PHY_DEVICE_ID
    }

    /// Get a `mask` as u32.
    /// Get the MDIO device's PHY ID.
    pub const fn id(&self) -> u32 {
        self.0.phy_id
    }

    /// Get the MDIO device's match mask.
    pub const fn mask_as_int(&self) -> u32 {
        self.mask.as_int()
        self.0.phy_id_mask
    }

    // 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(),
        }
        self.0
    }
}