struct cpsw_priv *priv = netdev_priv(dev);
        struct cpsw_common *cpsw = priv->cpsw;
        int slave_no = cpsw_slave_index(cpsw, priv);
+       struct phy_device *phy;
 
        if (!netif_running(dev))
                return -EINVAL;
 
-       switch (cmd) {
-       case SIOCSHWTSTAMP:
-               return cpsw_hwtstamp_set(dev, req);
-       case SIOCGHWTSTAMP:
-               return cpsw_hwtstamp_get(dev, req);
+       phy = cpsw->slaves[slave_no].phy;
+
+       if (!phy_has_hwtstamp(phy)) {
+               switch (cmd) {
+               case SIOCSHWTSTAMP:
+                       return cpsw_hwtstamp_set(dev, req);
+               case SIOCGHWTSTAMP:
+                       return cpsw_hwtstamp_get(dev, req);
+               }
        }
 
-       if (!cpsw->slaves[slave_no].phy)
-               return -EOPNOTSUPP;
-       return phy_mii_ioctl(cpsw->slaves[slave_no].phy, req, cmd);
+       if (phy)
+               return phy_mii_ioctl(phy, req, cmd);
+
+       return -EOPNOTSUPP;
 }
 
 int cpsw_ndo_set_tx_maxrate(struct net_device *ndev, int queue, u32 rate)