On Sat, Mar 24, 2018 at 09:51:52PM -0700, Richard Cochran wrote: > On Sat, Mar 24, 2018 at 07:48:58PM +0100, Andrew Lunn wrote: > > As far as i can see, you have three basic problems: > > > > 1) How do you associate the PTP device to the netdev? > > 2) How do you get the information you need to configure the PTP device > > Yes, yes. > > > 3) How do you limit the MAC/PHY to what the PTP device can do. > > Hm, I don't think this is important. So you are happy that the PTP device will cause the MC/PHY link to break down when it is asked to do something it cannot do? Take for example a Marvell MAC connected to a Marvell PHY doing 2.5Gbps SGMII because it can. But say the PTP device cannot be clocked that fast, and the MII links break.... You as a PTP maintainer might be happy with that, but as a PHY maintainer, i'm not too happy with this. > Right, so phylib can operate on phydev->attached_dev->mdiots; So first off, it is not an MDIO device. You current code is a horrible hack which gets a NACK. Use a phandle, and have of_mdiobus_register_phy() follow the phandle to get the device. To keep lifecycle issues simple, i would also keep it in phydev, not netdev. mdiots as a name is completely wrong. It is not an MDIO device. Maybe in the future some devices will be MDIO, or I2C, or SPI. Just call it ptpdev. This ptpdev needs to be control bus agnostic. You need a ptpdev core API exposing functions like ptpdev_hwtstamp, ptpdev_rxtstamp, ptpdev_txtstamp, ptpdev_link_change, which take a ptpdev. Have phy_link_change call ptpdev_link_change. You have the flexibility in that if in the future you do care that your ptpdev breaks the MAC-PHY link, you can add a ptpdev_validate_advertise, which allows the ptpdev to mask out link modes it does not support. Your ptp device, when probing needs to register with the ptpdev core, passing a generic ptpdev_ops for the operations its support. How it talks to the device, MMIO, SPI, I2C is hidden within the device driver. You can then clean up the code in timestamping.c. Code like: phydev = skb->dev->phydev; if (likely(phydev->drv->txtstamp)) { clone = skb_clone_sk(skb); if (!clone) return; phydev->drv->txtstamp(phydev, clone, type); } violates the layering, and the locking looks broken. Add a phy_txtstamp() call to phylib. It can then either call into the PHY driver, or use the call the ptpdev API, or -EOPNOTSUP. Andrew -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html