return (dt * 824) / 10;
 }
 
-static int at803x_cdt_start(struct phy_device *phydev, int pair)
+static int at803x_cdt_start(struct phy_device *phydev,
+                           u32 cdt_start)
 {
-       u16 cdt;
-
-       /* qca8081 takes the different bit 15 to enable CDT test */
-       if (phydev->drv->phy_id == QCA8081_PHY_ID)
-               cdt = QCA808X_CDT_ENABLE_TEST |
-                       QCA808X_CDT_LENGTH_UNIT |
-                       QCA808X_CDT_INTER_CHECK_DIS;
-       else
-               cdt = FIELD_PREP(AT803X_CDT_MDI_PAIR_MASK, pair) |
-                       AT803X_CDT_ENABLE_TEST;
-
-       return phy_write(phydev, AT803X_CDT, cdt);
+       return phy_write(phydev, AT803X_CDT, cdt_start);
 }
 
-static int at803x_cdt_wait_for_completion(struct phy_device *phydev)
+static int at803x_cdt_wait_for_completion(struct phy_device *phydev,
+                                         u32 cdt_en)
 {
        int val, ret;
-       u16 cdt_en;
-
-       if (phydev->drv->phy_id == QCA8081_PHY_ID)
-               cdt_en = QCA808X_CDT_ENABLE_TEST;
-       else
-               cdt_en = AT803X_CDT_ENABLE_TEST;
 
        /* One test run takes about 25ms */
        ret = phy_read_poll_timeout(phydev, AT803X_CDT, val,
        };
        int ret, val;
 
-       ret = at803x_cdt_start(phydev, pair);
+       val = FIELD_PREP(AT803X_CDT_MDI_PAIR_MASK, pair) |
+             AT803X_CDT_ENABLE_TEST;
+       ret = at803x_cdt_start(phydev, val);
        if (ret)
                return ret;
 
-       ret = at803x_cdt_wait_for_completion(phydev);
+       ret = at803x_cdt_wait_for_completion(phydev, AT803X_CDT_ENABLE_TEST);
        if (ret)
                return ret;
 
 }
 
 static int at803x_cable_test_get_status(struct phy_device *phydev,
-                                       bool *finished)
+                                       bool *finished, unsigned long pair_mask)
 {
-       unsigned long pair_mask;
        int retries = 20;
        int pair, ret;
 
-       if (phydev->phy_id == ATH9331_PHY_ID ||
-           phydev->phy_id == ATH8032_PHY_ID ||
-           phydev->phy_id == QCA9561_PHY_ID)
-               pair_mask = 0x3;
-       else
-               pair_mask = 0xf;
-
        *finished = false;
 
        /* According to the datasheet the CDT can be performed when
        return 0;
 }
 
-static int at803x_cable_test_start(struct phy_device *phydev)
+static void at803x_cable_test_autoneg(struct phy_device *phydev)
 {
        /* Enable auto-negotiation, but advertise no capabilities, no link
         * will be established. A restart of the auto-negotiation is not
         */
        phy_write(phydev, MII_BMCR, BMCR_ANENABLE);
        phy_write(phydev, MII_ADVERTISE, ADVERTISE_CSMA);
-       if (phydev->phy_id != ATH9331_PHY_ID &&
-           phydev->phy_id != ATH8032_PHY_ID &&
-           phydev->phy_id != QCA9561_PHY_ID)
-               phy_write(phydev, MII_CTRL1000, 0);
+}
 
+static int at803x_cable_test_start(struct phy_device *phydev)
+{
+       at803x_cable_test_autoneg(phydev);
        /* we do all the (time consuming) work later */
        return 0;
 }
        return at803x_config_intr(phydev);
 }
 
+/* AR8031 and AR8035 share the same cable test get status reg */
+static int at8031_cable_test_get_status(struct phy_device *phydev,
+                                       bool *finished)
+{
+       return at803x_cable_test_get_status(phydev, finished, 0xf);
+}
+
+/* AR8031 and AR8035 share the same cable test start logic */
+static int at8031_cable_test_start(struct phy_device *phydev)
+{
+       at803x_cable_test_autoneg(phydev);
+       phy_write(phydev, MII_CTRL1000, 0);
+       /* we do all the (time consuming) work later */
+       return 0;
+}
+
+/* AR8032, AR9331 and QCA9561 share the same cable test get status reg */
+static int at8032_cable_test_get_status(struct phy_device *phydev,
+                                       bool *finished)
+{
+       return at803x_cable_test_get_status(phydev, finished, 0x3);
+}
+
 static int at8035_parse_dt(struct phy_device *phydev)
 {
        struct at803x_priv *priv = phydev->priv;
 
        *finished = false;
 
-       ret = at803x_cdt_start(phydev, 0);
+       val = QCA808X_CDT_ENABLE_TEST |
+             QCA808X_CDT_LENGTH_UNIT |
+             QCA808X_CDT_INTER_CHECK_DIS;
+       ret = at803x_cdt_start(phydev, val);
        if (ret)
                return ret;
 
-       ret = at803x_cdt_wait_for_completion(phydev);
+       ret = at803x_cdt_wait_for_completion(phydev, QCA808X_CDT_ENABLE_TEST);
        if (ret)
                return ret;
 
        .handle_interrupt       = at803x_handle_interrupt,
        .get_tunable            = at803x_get_tunable,
        .set_tunable            = at803x_set_tunable,
-       .cable_test_start       = at803x_cable_test_start,
-       .cable_test_get_status  = at803x_cable_test_get_status,
+       .cable_test_start       = at8031_cable_test_start,
+       .cable_test_get_status  = at8031_cable_test_get_status,
 }, {
        /* Qualcomm Atheros AR8030 */
        .phy_id                 = ATH8030_PHY_ID,
        .handle_interrupt       = at803x_handle_interrupt,
        .get_tunable            = at803x_get_tunable,
        .set_tunable            = at803x_set_tunable,
-       .cable_test_start       = at803x_cable_test_start,
-       .cable_test_get_status  = at803x_cable_test_get_status,
+       .cable_test_start       = at8031_cable_test_start,
+       .cable_test_get_status  = at8031_cable_test_get_status,
 }, {
        /* Qualcomm Atheros AR8032 */
        PHY_ID_MATCH_EXACT(ATH8032_PHY_ID),
        .config_intr            = at803x_config_intr,
        .handle_interrupt       = at803x_handle_interrupt,
        .cable_test_start       = at803x_cable_test_start,
-       .cable_test_get_status  = at803x_cable_test_get_status,
+       .cable_test_get_status  = at8032_cable_test_get_status,
 }, {
        /* ATHEROS AR9331 */
        PHY_ID_MATCH_EXACT(ATH9331_PHY_ID),
        .config_intr            = at803x_config_intr,
        .handle_interrupt       = at803x_handle_interrupt,
        .cable_test_start       = at803x_cable_test_start,
-       .cable_test_get_status  = at803x_cable_test_get_status,
+       .cable_test_get_status  = at8032_cable_test_get_status,
        .read_status            = at803x_read_status,
        .soft_reset             = genphy_soft_reset,
        .config_aneg            = at803x_config_aneg,
        .config_intr            = at803x_config_intr,
        .handle_interrupt       = at803x_handle_interrupt,
        .cable_test_start       = at803x_cable_test_start,
-       .cable_test_get_status  = at803x_cable_test_get_status,
+       .cable_test_get_status  = at8032_cable_test_get_status,
        .read_status            = at803x_read_status,
        .soft_reset             = genphy_soft_reset,
        .config_aneg            = at803x_config_aneg,