Inter-revision diff: patch 11

Comparing v6 (message) to v2 (message)

--- v6
+++ v2
@@ -1,142 +1,95 @@
-Add the qca8081 phy driver config_init function, which includes:
-1. Enable fast restrain.
-2. Add 802.3az configurations.
-3. Initialize ADC threshold as 100mv.
+qca8081 phy is a single port phy, configure
+phy the lower seed value to make it linked as slave
+mode easier.
 
 Signed-off-by: Luo Jie <luoj@codeaurora.org>
 ---
- drivers/net/phy/at803x.c | 107 +++++++++++++++++++++++++++++++++++++++
- 1 file changed, 107 insertions(+)
+ drivers/net/phy/at803x.c | 47 ++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 47 insertions(+)
 
 diff --git a/drivers/net/phy/at803x.c b/drivers/net/phy/at803x.c
-index 70c1025e8e5d..da710523b7c4 100644
+index d838a21017f6..4d283c0c828c 100644
 --- a/drivers/net/phy/at803x.c
 +++ b/drivers/net/phy/at803x.c
-@@ -178,6 +178,51 @@
- #define AT803X_KEEP_PLL_ENABLED			BIT(0)
- #define AT803X_DISABLE_SMARTEEE			BIT(1)
+@@ -214,6 +214,12 @@
+ #define QCA808X_PHY_MMD3_DEBUG_6		0xa011
+ #define QCA808X_MMD3_DEBUG_6_VALUE		0x5f85
  
-+/* ADC threshold */
-+#define QCA808X_PHY_DEBUG_ADC_THRESHOLD		0x2c80
-+#define QCA808X_ADC_THRESHOLD_MASK		GENMASK(7, 0)
-+#define QCA808X_ADC_THRESHOLD_80MV		0
-+#define QCA808X_ADC_THRESHOLD_100MV		0xf0
-+#define QCA808X_ADC_THRESHOLD_200MV		0x0f
-+#define QCA808X_ADC_THRESHOLD_300MV		0xff
-+
-+/* CLD control */
-+#define QCA808X_PHY_MMD3_ADDR_CLD_CTRL7		0x8007
-+#define QCA808X_8023AZ_AFE_CTRL_MASK		GENMASK(8, 4)
-+#define QCA808X_8023AZ_AFE_EN			0x90
-+
-+/* AZ control */
-+#define QCA808X_PHY_MMD3_AZ_TRAINING_CTRL	0x8008
-+#define QCA808X_MMD3_AZ_TRAINING_VAL		0x1c32
-+
-+#define QCA808X_PHY_MMD1_MSE_THRESHOLD_20DB	0x8014
-+#define QCA808X_MSE_THRESHOLD_20DB_VALUE	0x529
-+
-+#define QCA808X_PHY_MMD1_MSE_THRESHOLD_17DB	0x800E
-+#define QCA808X_MSE_THRESHOLD_17DB_VALUE	0x341
-+
-+#define QCA808X_PHY_MMD1_MSE_THRESHOLD_27DB	0x801E
-+#define QCA808X_MSE_THRESHOLD_27DB_VALUE	0x419
-+
-+#define QCA808X_PHY_MMD1_MSE_THRESHOLD_28DB	0x8020
-+#define QCA808X_MSE_THRESHOLD_28DB_VALUE	0x341
-+
-+#define QCA808X_PHY_MMD7_TOP_OPTION1		0x901c
-+#define QCA808X_TOP_OPTION1_DATA		0x0
-+
-+#define QCA808X_PHY_MMD3_DEBUG_1		0xa100
-+#define QCA808X_MMD3_DEBUG_1_VALUE		0x9203
-+#define QCA808X_PHY_MMD3_DEBUG_2		0xa101
-+#define QCA808X_MMD3_DEBUG_2_VALUE		0x48ad
-+#define QCA808X_PHY_MMD3_DEBUG_3		0xa103
-+#define QCA808X_MMD3_DEBUG_3_VALUE		0x1698
-+#define QCA808X_PHY_MMD3_DEBUG_4		0xa105
-+#define QCA808X_MMD3_DEBUG_4_VALUE		0x8001
-+#define QCA808X_PHY_MMD3_DEBUG_5		0xa106
-+#define QCA808X_MMD3_DEBUG_5_VALUE		0x1111
-+#define QCA808X_PHY_MMD3_DEBUG_6		0xa011
-+#define QCA808X_MMD3_DEBUG_6_VALUE		0x5f85
++/* master/slave seed config */
++#define QCA808X_PHY_DEBUG_LOCAL_SEED		9
++#define QCA808X_MASTER_SLAVE_SEED_ENABLE	BIT(1)
++#define QCA808X_MASTER_SLAVE_SEED_CFG		GENMASK(12, 2)
++#define QCA808X_MASTER_SLAVE_SEED_RANGE		0x32
 +
  MODULE_DESCRIPTION("Qualcomm Atheros AR803x and QCA808X PHY driver");
  MODULE_AUTHOR("Matus Ujhelyi");
  MODULE_LICENSE("GPL");
-@@ -1489,6 +1534,67 @@ static int qca83xx_suspend(struct phy_device *phydev)
+@@ -1471,6 +1477,25 @@ static int qca808x_phy_fast_retrain_config(struct phy_device *phydev)
  	return 0;
  }
  
-+static int qca808x_phy_fast_retrain_config(struct phy_device *phydev)
++static int qca808x_phy_ms_random_seed_set(struct phy_device *phydev)
++{
++	u16 seed_value = (prandom_u32() % QCA808X_MASTER_SLAVE_SEED_RANGE) << 2;
++
++	return at803x_debug_reg_mask(phydev, QCA808X_PHY_DEBUG_LOCAL_SEED,
++			QCA808X_MASTER_SLAVE_SEED_CFG, seed_value);
++}
++
++static int qca808x_phy_ms_seed_enable(struct phy_device *phydev, bool enable)
++{
++	u16 seed_enable = 0;
++
++	if (enable)
++		seed_enable = QCA808X_MASTER_SLAVE_SEED_ENABLE;
++
++	return at803x_debug_reg_mask(phydev, QCA808X_PHY_DEBUG_LOCAL_SEED,
++			QCA808X_MASTER_SLAVE_SEED_ENABLE, seed_enable);
++}
++
+ static int qca808x_config_init(struct phy_device *phydev)
+ {
+ 	int ret;
+@@ -1492,6 +1517,16 @@ static int qca808x_config_init(struct phy_device *phydev)
+ 	if (ret)
+ 		return ret;
+ 
++	/* Configure lower ramdom seed to make phy linked as slave mode */
++	ret = qca808x_phy_ms_random_seed_set(phydev);
++	if (ret)
++		return ret;
++
++	/* Enable seed */
++	ret = qca808x_phy_ms_seed_enable(phydev, true);
++	if (ret)
++		return ret;
++
+ 	/* Configure adc threshold as 100mv for the link 10M */
+ 	return at803x_debug_reg_mask(phydev, QCA808X_PHY_DEBUG_ADC_THRESHOLD,
+ 			QCA808X_ADC_THRESHOLD_MASK, QCA808X_ADC_THRESHOLD_100MV);
+@@ -1524,6 +1559,17 @@ static int qca808x_read_status(struct phy_device *phydev)
+ 	return 0;
+ }
+ 
++static int qca808x_soft_reset(struct phy_device *phydev)
 +{
 +	int ret;
 +
-+	/* Enable fast retrain */
-+	ret = genphy_c45_fast_retrain(phydev, true);
-+	if (ret)
++	ret = genphy_soft_reset(phydev);
++	if (ret < 0)
 +		return ret;
 +
-+	phy_write_mmd(phydev, MDIO_MMD_AN, QCA808X_PHY_MMD7_TOP_OPTION1,
-+			QCA808X_TOP_OPTION1_DATA);
-+	phy_write_mmd(phydev, MDIO_MMD_PMAPMD, QCA808X_PHY_MMD1_MSE_THRESHOLD_20DB,
-+			QCA808X_MSE_THRESHOLD_20DB_VALUE);
-+	phy_write_mmd(phydev, MDIO_MMD_PMAPMD, QCA808X_PHY_MMD1_MSE_THRESHOLD_17DB,
-+			QCA808X_MSE_THRESHOLD_17DB_VALUE);
-+	phy_write_mmd(phydev, MDIO_MMD_PMAPMD, QCA808X_PHY_MMD1_MSE_THRESHOLD_27DB,
-+			QCA808X_MSE_THRESHOLD_27DB_VALUE);
-+	phy_write_mmd(phydev, MDIO_MMD_PMAPMD, QCA808X_PHY_MMD1_MSE_THRESHOLD_28DB,
-+			QCA808X_MSE_THRESHOLD_28DB_VALUE);
-+	phy_write_mmd(phydev, MDIO_MMD_PCS, QCA808X_PHY_MMD3_DEBUG_1,
-+			QCA808X_MMD3_DEBUG_1_VALUE);
-+	phy_write_mmd(phydev, MDIO_MMD_PCS, QCA808X_PHY_MMD3_DEBUG_4,
-+			QCA808X_MMD3_DEBUG_4_VALUE);
-+	phy_write_mmd(phydev, MDIO_MMD_PCS, QCA808X_PHY_MMD3_DEBUG_5,
-+			QCA808X_MMD3_DEBUG_5_VALUE);
-+	phy_write_mmd(phydev, MDIO_MMD_PCS, QCA808X_PHY_MMD3_DEBUG_3,
-+			QCA808X_MMD3_DEBUG_3_VALUE);
-+	phy_write_mmd(phydev, MDIO_MMD_PCS, QCA808X_PHY_MMD3_DEBUG_6,
-+			QCA808X_MMD3_DEBUG_6_VALUE);
-+	phy_write_mmd(phydev, MDIO_MMD_PCS, QCA808X_PHY_MMD3_DEBUG_2,
-+			QCA808X_MMD3_DEBUG_2_VALUE);
-+
-+	return 0;
++	return qca808x_phy_ms_seed_enable(phydev, true);
 +}
 +
-+static int qca808x_config_init(struct phy_device *phydev)
-+{
-+	int ret;
-+
-+	/* Active adc&vga on 802.3az for the link 1000M and 100M */
-+	ret = phy_modify_mmd(phydev, MDIO_MMD_PCS, QCA808X_PHY_MMD3_ADDR_CLD_CTRL7,
-+			QCA808X_8023AZ_AFE_CTRL_MASK, QCA808X_8023AZ_AFE_EN);
-+	if (ret)
-+		return ret;
-+
-+	/* Adjust the threshold on 802.3az for the link 1000M */
-+	ret = phy_write_mmd(phydev, MDIO_MMD_PCS,
-+			QCA808X_PHY_MMD3_AZ_TRAINING_CTRL, QCA808X_MMD3_AZ_TRAINING_VAL);
-+	if (ret)
-+		return ret;
-+
-+	/* Config the fast retrain for the link 2500M */
-+	ret = qca808x_phy_fast_retrain_config(phydev);
-+	if (ret)
-+		return ret;
-+
-+	/* Configure adc threshold as 100mv for the link 10M */
-+	return at803x_debug_reg_mask(phydev, QCA808X_PHY_DEBUG_ADC_THRESHOLD,
-+			QCA808X_ADC_THRESHOLD_MASK, QCA808X_ADC_THRESHOLD_100MV);
-+}
-+
- static int qca808x_read_status(struct phy_device *phydev)
+ static struct phy_driver at803x_driver[] = {
  {
- 	int ret;
-@@ -1690,6 +1796,7 @@ static struct phy_driver at803x_driver[] = {
- 	.suspend		= genphy_suspend,
+ 	/* Qualcomm Atheros AR8035 */
+@@ -1649,6 +1695,7 @@ static struct phy_driver at803x_driver[] = {
  	.resume			= genphy_resume,
  	.read_status		= qca808x_read_status,
-+	.config_init		= qca808x_config_init,
+ 	.config_init		= qca808x_config_init,
++	.soft_reset		= qca808x_soft_reset,
  }, };
  
  module_phy_driver(at803x_driver);
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help