Hi Gerhard > +int tsnep_read_md(struct tsnep_adapter *adapter, int phy, int reg, u16 *data) > +{ > + u32 md; > + int retval = 0; > + > + if (mutex_lock_interruptible(&adapter->md_lock) != 0) > + return -ERESTARTSYS; This probably means you have something wrong with your architecture. The core mdio layer will serialise access to the mdio bus. So you should not need such locks. > +int tsnep_enable_loopback(struct tsnep_adapter *adapter, int speed) > +{ > + int phy_address = adapter->phydev->mdio.addr; > + u16 val; > + int retval; > + > + adapter->loopback = true; > + adapter->loopback_speed = speed; > + > + retval = tsnep_read_md(adapter, phy_address, MII_BMCR, &val); And this might be why you have these locks? A MAC driver should never directly touch the PHY hardware. Use the phy_loopback(phydev) call. Andrew