[OpenWrt-Devel] [RFC] ar71xx: Reset QCA955x SGMII link on speed change
Sven Eckelmann
sven.eckelmann at open-mesh.com
Mon Apr 4 05:09:23 EDT 2016
On Friday 01 April 2016 14:41:47 Sven Eckelmann wrote:
[...]
> static void qca955x_set_speed_xmii(int speed)
> {
> void __iomem *base;
> @@ -381,6 +395,100 @@ static void qca955x_set_speed_xmii(int speed)
> base = ioremap_nocache(AR71XX_PLL_BASE, AR71XX_PLL_SIZE);
> __raw_writel(val, base + QCA955X_PLL_ETH_XMII_CONTROL_REG);
> iounmap(base);
> +
> + // TODO: find out if something like qca955x_reset_xmii(); is needed
> +}
I was told that the GMAC0 also needs some special bits set to fix some
problems when switching between different half/full duplex speeds. The
only thing I was told is that qca955x_soc_gmac_set_link requires
athr_reg_rmw_set(0xb900023c, 0x68000001);
Of course, it is not for QCAs current driver (which is a heavily
modified driver from OpenWrt) but their old one
https://github.com/Existed/ethernet_driver/blob/3bde1bb60d31d78fee14cce0d8ea9539d8227a0d/qca955x.c#L587
I know that this register is IG_ACL_CSR for GMAC0 and BIT(0) is
IG_ACL_DISABLE and should only disable the ingress ACL. But I
have absolutely no idea what BIT(27), BIT(29) and BIT(30) are.
Does anyone know what these bits are? I personally don't have
yet feedback if this change really helps. But a equally bad
hack as the earlier one (sgmii) would be:
--- a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c
+++ b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c
@@ -387,6 +387,15 @@ static void ar934x_set_speed_ge0(int speed)
#define QCA955X_GMAC_REG_SGMII_RESET_TX_CLK_N BIT(1)
#define QCA955X_GMAC_REG_SGMII_RESET_RX_CLK_N BIT(0)
+#define QCA955X_GE0_BASE 0x19000000
+#define QCA955X_GE0_SIZE 0x2F0
+
+#define QCA955X_GE0_IG_ACL_CSR 0x23C
+#define QCA955X_GE0_IG_ACL_DISABLE BIT(0)
+#define QCA955X_GE0_IG_ACL_MAGIC0 BIT(27)
+#define QCA955X_GE0_IG_ACL_MAGIC1 BIT(29)
+#define QCA955X_GE0_IG_ACL_MAGIC2 BIT(30)
+
static void qca955x_set_speed_xmii(int speed)
{
void __iomem *base;
@@ -396,7 +405,14 @@ static void qca955x_set_speed_xmii(int speed)
__raw_writel(val, base + QCA955X_PLL_ETH_XMII_CONTROL_REG);
iounmap(base);
- // TODO: find out if something like qca955x_reset_xmii(); is needed
+ /* WARNING ugly PoC code ahead */
+ base = ioremap_nocache(QCA955X_GE0_BASE, QCA955X_GE0_SIZE);
+ val = QCA955X_GE0_IG_ACL_DISABLE |
+ QCA955X_GE0_IG_ACL_MAGIC0 |
+ QCA955X_GE0_IG_ACL_MAGIC1 |
+ QCA955X_GE0_IG_ACL_MAGIC2;
+ __raw_writel(val, base + QCA955X_GE0_IG_ACL_CSR);
+ iounmap(base);
}
static void qca955x_reset_sgmii(void)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.infradead.org/pipermail/openwrt-devel/attachments/20160404/db93bf59/attachment.sig>
-------------- next part --------------
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list