mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2025-02-16 12:45:48 +00:00
Copy backport, hack, pending patch and config from 6.1 to 6.6. Signed-off-by: Weijie Gao <hackpascal@gmail.com>
183 lines
7.6 KiB
Diff
183 lines
7.6 KiB
Diff
From ea73e5ea442ee2aade67b1fb1233ccb3cbea2ceb Mon Sep 17 00:00:00 2001
|
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
|
Date: Thu, 4 Jan 2024 22:30:40 +0100
|
|
Subject: [PATCH 3/4] net: phy: at803x: add support for cdt cross short test
|
|
for qca808x
|
|
|
|
QCA808x PHY Family supports Cable Diagnostic Test also for Cross Pair
|
|
Short.
|
|
|
|
Add all the define to make enable and support these additional tests.
|
|
|
|
Cross Short test was previously disabled by default, this is now changed
|
|
and enabled by default. In this mode, the mask changed a bit and length
|
|
is shifted based on the fault condition.
|
|
|
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|
Reviewed-by: Simon Horman <horms@kernel.org>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
drivers/net/phy/at803x.c | 86 ++++++++++++++++++++++++++++++++--------
|
|
1 file changed, 69 insertions(+), 17 deletions(-)
|
|
|
|
--- a/drivers/net/phy/at803x.c
|
|
+++ b/drivers/net/phy/at803x.c
|
|
@@ -254,6 +254,7 @@
|
|
|
|
#define QCA808X_CDT_ENABLE_TEST BIT(15)
|
|
#define QCA808X_CDT_INTER_CHECK_DIS BIT(13)
|
|
+#define QCA808X_CDT_STATUS BIT(11)
|
|
#define QCA808X_CDT_LENGTH_UNIT BIT(10)
|
|
|
|
#define QCA808X_MMD3_CDT_STATUS 0x8064
|
|
@@ -261,16 +262,44 @@
|
|
#define QCA808X_MMD3_CDT_DIAG_PAIR_B 0x8066
|
|
#define QCA808X_MMD3_CDT_DIAG_PAIR_C 0x8067
|
|
#define QCA808X_MMD3_CDT_DIAG_PAIR_D 0x8068
|
|
-#define QCA808X_CDT_DIAG_LENGTH GENMASK(7, 0)
|
|
+#define QCA808X_CDT_DIAG_LENGTH_SAME_SHORT GENMASK(15, 8)
|
|
+#define QCA808X_CDT_DIAG_LENGTH_CROSS_SHORT GENMASK(7, 0)
|
|
|
|
#define QCA808X_CDT_CODE_PAIR_A GENMASK(15, 12)
|
|
#define QCA808X_CDT_CODE_PAIR_B GENMASK(11, 8)
|
|
#define QCA808X_CDT_CODE_PAIR_C GENMASK(7, 4)
|
|
#define QCA808X_CDT_CODE_PAIR_D GENMASK(3, 0)
|
|
-#define QCA808X_CDT_STATUS_STAT_FAIL 0
|
|
-#define QCA808X_CDT_STATUS_STAT_NORMAL 1
|
|
-#define QCA808X_CDT_STATUS_STAT_OPEN 2
|
|
-#define QCA808X_CDT_STATUS_STAT_SHORT 3
|
|
+
|
|
+#define QCA808X_CDT_STATUS_STAT_TYPE GENMASK(1, 0)
|
|
+#define QCA808X_CDT_STATUS_STAT_FAIL FIELD_PREP_CONST(QCA808X_CDT_STATUS_STAT_TYPE, 0)
|
|
+#define QCA808X_CDT_STATUS_STAT_NORMAL FIELD_PREP_CONST(QCA808X_CDT_STATUS_STAT_TYPE, 1)
|
|
+#define QCA808X_CDT_STATUS_STAT_SAME_OPEN FIELD_PREP_CONST(QCA808X_CDT_STATUS_STAT_TYPE, 2)
|
|
+#define QCA808X_CDT_STATUS_STAT_SAME_SHORT FIELD_PREP_CONST(QCA808X_CDT_STATUS_STAT_TYPE, 3)
|
|
+
|
|
+#define QCA808X_CDT_STATUS_STAT_MDI GENMASK(3, 2)
|
|
+#define QCA808X_CDT_STATUS_STAT_MDI1 FIELD_PREP_CONST(QCA808X_CDT_STATUS_STAT_MDI, 1)
|
|
+#define QCA808X_CDT_STATUS_STAT_MDI2 FIELD_PREP_CONST(QCA808X_CDT_STATUS_STAT_MDI, 2)
|
|
+#define QCA808X_CDT_STATUS_STAT_MDI3 FIELD_PREP_CONST(QCA808X_CDT_STATUS_STAT_MDI, 3)
|
|
+
|
|
+/* NORMAL are MDI with type set to 0 */
|
|
+#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_NORMAL QCA808X_CDT_STATUS_STAT_MDI1
|
|
+#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_OPEN (QCA808X_CDT_STATUS_STAT_SAME_OPEN |\
|
|
+ QCA808X_CDT_STATUS_STAT_MDI1)
|
|
+#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_SHORT (QCA808X_CDT_STATUS_STAT_SAME_SHORT |\
|
|
+ QCA808X_CDT_STATUS_STAT_MDI1)
|
|
+#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_NORMAL QCA808X_CDT_STATUS_STAT_MDI2
|
|
+#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_OPEN (QCA808X_CDT_STATUS_STAT_SAME_OPEN |\
|
|
+ QCA808X_CDT_STATUS_STAT_MDI2)
|
|
+#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_SHORT (QCA808X_CDT_STATUS_STAT_SAME_SHORT |\
|
|
+ QCA808X_CDT_STATUS_STAT_MDI2)
|
|
+#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_NORMAL QCA808X_CDT_STATUS_STAT_MDI3
|
|
+#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_OPEN (QCA808X_CDT_STATUS_STAT_SAME_OPEN |\
|
|
+ QCA808X_CDT_STATUS_STAT_MDI3)
|
|
+#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_SHORT (QCA808X_CDT_STATUS_STAT_SAME_SHORT |\
|
|
+ QCA808X_CDT_STATUS_STAT_MDI3)
|
|
+
|
|
+/* Added for reference of existence but should be handled by wait_for_completion already */
|
|
+#define QCA808X_CDT_STATUS_STAT_BUSY (BIT(1) | BIT(3))
|
|
|
|
/* QCA808X 1G chip type */
|
|
#define QCA808X_PHY_MMD7_CHIP_TYPE 0x901d
|
|
@@ -1941,8 +1970,17 @@ static int qca808x_soft_reset(struct phy
|
|
static bool qca808x_cdt_fault_length_valid(int cdt_code)
|
|
{
|
|
switch (cdt_code) {
|
|
- case QCA808X_CDT_STATUS_STAT_SHORT:
|
|
- case QCA808X_CDT_STATUS_STAT_OPEN:
|
|
+ case QCA808X_CDT_STATUS_STAT_SAME_SHORT:
|
|
+ case QCA808X_CDT_STATUS_STAT_SAME_OPEN:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_NORMAL:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_OPEN:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_SHORT:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_NORMAL:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_OPEN:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_SHORT:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_NORMAL:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_OPEN:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_SHORT:
|
|
return true;
|
|
default:
|
|
return false;
|
|
@@ -1954,17 +1992,28 @@ static int qca808x_cable_test_result_tra
|
|
switch (cdt_code) {
|
|
case QCA808X_CDT_STATUS_STAT_NORMAL:
|
|
return ETHTOOL_A_CABLE_RESULT_CODE_OK;
|
|
- case QCA808X_CDT_STATUS_STAT_SHORT:
|
|
+ case QCA808X_CDT_STATUS_STAT_SAME_SHORT:
|
|
return ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT;
|
|
- case QCA808X_CDT_STATUS_STAT_OPEN:
|
|
+ case QCA808X_CDT_STATUS_STAT_SAME_OPEN:
|
|
return ETHTOOL_A_CABLE_RESULT_CODE_OPEN;
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_NORMAL:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_OPEN:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_SHORT:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_NORMAL:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_OPEN:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_SHORT:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_NORMAL:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_OPEN:
|
|
+ case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_SHORT:
|
|
+ return ETHTOOL_A_CABLE_RESULT_CODE_CROSS_SHORT;
|
|
case QCA808X_CDT_STATUS_STAT_FAIL:
|
|
default:
|
|
return ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC;
|
|
}
|
|
}
|
|
|
|
-static int qca808x_cdt_fault_length(struct phy_device *phydev, int pair)
|
|
+static int qca808x_cdt_fault_length(struct phy_device *phydev, int pair,
|
|
+ int result)
|
|
{
|
|
int val;
|
|
u32 cdt_length_reg = 0;
|
|
@@ -1990,7 +2039,11 @@ static int qca808x_cdt_fault_length(stru
|
|
if (val < 0)
|
|
return val;
|
|
|
|
- val = FIELD_GET(QCA808X_CDT_DIAG_LENGTH, val);
|
|
+ if (result == ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT)
|
|
+ val = FIELD_GET(QCA808X_CDT_DIAG_LENGTH_SAME_SHORT, val);
|
|
+ else
|
|
+ val = FIELD_GET(QCA808X_CDT_DIAG_LENGTH_CROSS_SHORT, val);
|
|
+
|
|
return at803x_cdt_fault_length(val);
|
|
}
|
|
|
|
@@ -2038,8 +2091,8 @@ static int qca808x_cable_test_start(stru
|
|
static int qca808x_cable_test_get_pair_status(struct phy_device *phydev, u8 pair,
|
|
u16 status)
|
|
{
|
|
+ int length, result;
|
|
u16 pair_code;
|
|
- int length;
|
|
|
|
switch (pair) {
|
|
case ETHTOOL_A_CABLE_PAIR_A:
|
|
@@ -2058,11 +2111,11 @@ static int qca808x_cable_test_get_pair_s
|
|
return -EINVAL;
|
|
}
|
|
|
|
- ethnl_cable_test_result(phydev, pair,
|
|
- qca808x_cable_test_result_trans(pair_code));
|
|
+ result = qca808x_cable_test_result_trans(pair_code);
|
|
+ ethnl_cable_test_result(phydev, pair, result);
|
|
|
|
if (qca808x_cdt_fault_length_valid(pair_code)) {
|
|
- length = qca808x_cdt_fault_length(phydev, pair);
|
|
+ length = qca808x_cdt_fault_length(phydev, pair, result);
|
|
ethnl_cable_test_fault_length(phydev, pair, length);
|
|
}
|
|
|
|
@@ -2076,8 +2129,7 @@ static int qca808x_cable_test_get_status
|
|
*finished = false;
|
|
|
|
val = QCA808X_CDT_ENABLE_TEST |
|
|
- QCA808X_CDT_LENGTH_UNIT |
|
|
- QCA808X_CDT_INTER_CHECK_DIS;
|
|
+ QCA808X_CDT_LENGTH_UNIT;
|
|
ret = at803x_cdt_start(phydev, val);
|
|
if (ret)
|
|
return ret;
|