phy_init_hw() calls `soft_reset` both with and without
`phy_device->lock`, but `soft_reset_callback` hands the driver a
`Locked` device and its SAFETY comment says the lock is held.
Pass a `&mut Device<MaybeLocked>` instead and correct the SAFETY
comment. Update ax88796b_rust, the only implementation.
Signed-off-by: SeungJong Ha <redacted>
---
drivers/net/phy/ax88796b_rust.rs | 8 ++++----
rust/kernel/net/phy.rs | 7 +++----
2 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/drivers/net/phy/ax88796b_rust.rs b/drivers/net/phy/ax88796b_rust.rs
index 2d24628a4e58..88e6e3c88b44 100644
--- a/drivers/net/phy/ax88796b_rust.rs
+++ b/drivers/net/phy/ax88796b_rust.rs
@@ -30,7 +30,7 @@
// BMCR_RESET bit and poll for the reset bit to be cleared.
// Toggle BMCR_RESET bit off to accommodate broken AX8796B PHY implementation
// such as used on the Individual Computers' X-Surf 100 Zorro card.
-fn asix_soft_reset(dev: &mut phy::Device) -> Result {
+fn asix_soft_reset(dev: &mut phy::Device<phy::MaybeLocked>) -> Result {
dev.write(C22::BMCR, 0)?;
dev.genphy_soft_reset()
}@@ -85,7 +85,7 @@ fn resume(dev: &mut phy::Device) -> Result {
dev.genphy_resume()
}
- fn soft_reset(dev: &mut phy::Device) -> Result {
+ fn soft_reset(dev: &mut phy::Device<phy::MaybeLocked>) -> Result {
asix_soft_reset(dev)
}
@@ -115,7 +115,7 @@ fn resume(dev: &mut phy::Device) -> Result {
dev.genphy_resume()
}
- fn soft_reset(dev: &mut phy::Device) -> Result {
+ fn soft_reset(dev: &mut phy::Device<phy::MaybeLocked>) -> Result {
asix_soft_reset(dev)
}
}@@ -127,7 +127,7 @@ impl Driver for PhyAX88796B {
const NAME: &'static CStr = c"Asix Electronics AX88796B";
const PHY_DEVICE_ID: DeviceId = DeviceId::new_with_model_mask(0x003b1841);
- fn soft_reset(dev: &mut phy::Device) -> Result {
+ fn soft_reset(dev: &mut phy::Device<phy::MaybeLocked>) -> Result {
asix_soft_reset(dev)
}
}diff --git a/rust/kernel/net/phy.rs b/rust/kernel/net/phy.rs
index 105a1b727a08..46602798e8ac 100644
--- a/rust/kernel/net/phy.rs
+++ b/rust/kernel/net/phy.rs
@@ -358,9 +358,8 @@ impl<T: Driver> Adapter<T> {
/// `phydev` must be passed by the corresponding callback in `phy_driver`.
unsafe extern "C" fn soft_reset_callback(phydev: *mut bindings::phy_device) -> c_int {
from_result(|| {
- // SAFETY: This callback is called only in contexts
- // where we hold `phy_device->lock`, so the accessors on
- // `Device` are okay to call.
+ // SAFETY: `phydev` is valid for the callback. `phy_init_hw()` calls `soft_reset` both
+ // with and without `phy_device->lock`, which is the `MaybeLocked` context.
let dev = unsafe { Device::from_raw(phydev) };
T::soft_reset(dev)?;
Ok(0)@@ -575,7 +574,7 @@ pub trait Driver {
const PHY_DEVICE_ID: DeviceId = DeviceId::new_with_custom_mask(0, 0);
/// Issues a PHY software reset.
- fn soft_reset(_dev: &mut Device) -> Result {
+ fn soft_reset(_dev: &mut Device<MaybeLocked>) -> Result {
build_error!(VTABLE_DEFAULT_ERROR)
}
--
2.54.0